From 9e1d70de5b3b43a7aa21343df3fbb71b7723ad6e Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Tue, 8 Apr 2025 12:01:31 +0530 Subject: [PATCH 001/349] add data mapper mediator ui tests --- .../components/DataMapper.ts | 11 ++ .../mediatorTests/dataMapper.spec.ts | 187 ++++++++++++++++++ .../test/e2e-playwright-tests/test.list.ts | 4 +- 3 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 workspaces/mi/mi-extension/src/test/e2e-playwright-tests/mediatorTests/dataMapper.spec.ts diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/DataMapper.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/DataMapper.ts index 760c5d3e526..5770da32a04 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/DataMapper.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/DataMapper.ts @@ -52,6 +52,17 @@ export class DataMapper { this.tsFile = path.join(newProjectPath, 'testProject', 'src', 'main', 'wso2mi', 'resources', 'datamapper', this._name, `${this._name}.ts`); } + public async add(name: string) { + const seqWebView = await switchToIFrame('Resource View', this._page); + if (!seqWebView) { + throw new Error("Failed to switch to Resource Form iframe"); + } + const seqFrame = seqWebView.locator('#popUpPanel'); + await seqFrame.waitFor(); + await seqFrame.getByRole('textbox', { name: 'Name' }).fill(name); + await seqFrame.getByRole('button', { name: 'Create' }).click(); + } + public getWebView() { return this.webView; } diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/mediatorTests/dataMapper.spec.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/mediatorTests/dataMapper.spec.ts new file mode 100644 index 00000000000..ad92f69a872 --- /dev/null +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/mediatorTests/dataMapper.spec.ts @@ -0,0 +1,187 @@ +/** + * 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 { test, expect } from '@playwright/test'; +import { Form } from './../components/Form'; +import { AddArtifact } from './../components/AddArtifact'; +import { ServiceDesigner } from './../components/ServiceDesigner'; +import { initTest, page } from '../Utils'; +import { MACHINE_VIEW } from '@wso2/mi-core'; +import { Overview } from '../components/Overview'; +import { Diagram, SidePanel } from './../components/Diagram'; +import { DataMapper } from '../components/DataMapper'; +import { switchToIFrame } from '@wso2/playwright-vscode-tester'; +import { ProjectExplorer } from '../components/ProjectExplorer'; + +export default function createTests() { + test.describe("Data Mapper Mediator Tests", { + tag: '@group4', + }, async () => { + initTest(); + + test("Data Mapper Mediator Tests", async ({}, testInfo) => { + const testAttempt = testInfo.retry + 1; + await test.step('Create new API', async () => { + console.log('Create API for data mapper mediator tests'); + const { title: iframeTitle } = await page.getCurrentWebview(); + + if (iframeTitle === MACHINE_VIEW.Overview) { + const overviewPage = new Overview(page.page); + await overviewPage.init(); + await overviewPage.goToAddArtifact(); + } + + const addArtifactPage = new AddArtifact(page.page); + await addArtifactPage.init(); + await addArtifactPage.add('API'); + + const apiForm = new Form(page.page, 'API Form'); + await apiForm.switchToFormView(); + await apiForm.fill({ + values: { + 'Name*': { + type: 'input', + value: 'dataMapperMediatorAPI' + testAttempt, + }, + 'Context*': { + type: 'input', + value: '/dataMapperMediatorAPI' + testAttempt, + }, + } + }); + await apiForm.submit(); + }); + + await test.step('Service designer', async () => { + const serviceDesigner = new ServiceDesigner(page.page); + await serviceDesigner.init(); + const resource = await serviceDesigner.resource('GET', '/'); + await resource.click(); + }); + + await test.step('Add data mapper mediator with new mapping', async () => { + console.log('Adding data mapper mediator with new mapping'); + const diagram = new Diagram(page.page, 'Resource'); + await diagram.init(); + await diagram.clickPlusButtonByIndex(0); + const sidePanel = new SidePanel(diagram.getDiagramWebView()); + await sidePanel.init(); + await sidePanel.search('Data Mapper'); + await sidePanel.selectMediator('Data\\ Mapper'); + const form = await sidePanel.getForm(); + await form.clickAddNewForField('Name'); + const dataMapperFrom = new DataMapper(page.page, "dm" + testAttempt); + await dataMapperFrom.add('mapping1' + testAttempt); + await form.fill({ + values: { + 'Description': { + type: 'input', + value: 'dm1' + } + } + }); + await form.submit('Add'); + await switchToIFrame('Data Mapper View', page.page); + + // go to resource + const projectExplorer = new ProjectExplorer(page.page); + await projectExplorer.goToOverview("testProject"); + await projectExplorer.findItem(['Project testProject', 'APIs', 'dataMapperMediatorAPI' + testAttempt, '/'], true); + await diagram.getMediator('datamapper', 0, 'reference'); + }); + + await test.step('Delete data mapper mediator', async () => { + console.log('Deleting data mapper mediator'); + const diagram = new Diagram(page.page, 'Resource'); + await diagram.init(); + const mediator = await diagram.getMediator('datamapper', 0, 'reference'); + await mediator.delete(); + const mediatorsCount = await diagram.getMediatorsCount('datamapper', 'reference'); + expect(mediatorsCount).toBe(0); + }); + + await test.step('Add data mapper mediator existing mapping', async () => { + console.log('Adding data mapper mediator with existing mapping'); + const diagram = new Diagram(page.page, 'Resource'); + await diagram.init(); + await diagram.clickPlusButtonByIndex(0); + const sidePanel = new SidePanel(diagram.getDiagramWebView()); + await sidePanel.init(); + await sidePanel.search('Data Mapper'); + await sidePanel.selectMediator('Data\\ Mapper'); + const form = await sidePanel.getForm(); + await form.fill({ + values: { + 'Name': { + type: 'combo', + value: 'datamapper/mapping1' + testAttempt + }, + 'Description': { + type: 'input', + value: 'dm2' + } + } + }); + await form.submit('Add'); + await diagram.getMediator('datamapper', 0, 'reference') + }); + + await test.step('Update data mapper mediator', async () => { + console.log('Updating data mapper mediator'); + const diagram = new Diagram(page.page, 'Resource'); + await diagram.init(); + const mediator = await diagram.getMediator('datamapper', 0, 'reference'); + await mediator.clickOnImg(); + const form = await mediator.getEditForm(); + await form.fill({ + values: { + 'Description': { + type: 'input', + value: 'data mapper 1 edited' + } + } + }); + await form.submit('Update'); + await diagram.getMediator('datamapper', 0, 'reference') + }); + + await test.step('Goto mapping from data mapper mediator', async () => { + console.log('Goto mapping from data mapper mediator'); + const diagram = new Diagram(page.page, 'Resource'); + await diagram.init(); + const mediator = await diagram.getMediator('datamapper', 0, 'reference'); + await mediator.click(); + await switchToIFrame('Data Mapper View', page.page); + + // go to resource + const projectExplorer = new ProjectExplorer(page.page); + await projectExplorer.goToOverview("testProject"); + await projectExplorer.findItem(['Project testProject', 'APIs', 'dataMapperMediatorAPI' + testAttempt, '/'], true); + await diagram.getMediator('datamapper', 0, 'reference'); + }); + + await test.step('Goto mapping from project explorer', async () => { + console.log('Goto mapping from project explorer'); + const projectExplorer = new ProjectExplorer(page.page); + await projectExplorer.goToOverview("testProject"); + await projectExplorer.findItem(['Project testProject', 'Other Artifacts', 'Data Mappers', 'mapping1' + testAttempt], true); + await switchToIFrame('Data Mapper View', page.page); + }); + }); + }); +} diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/test.list.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/test.list.ts index 54087abc54d..69c5e46a856 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/test.list.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/test.list.ts @@ -28,9 +28,10 @@ import logMediatorTests from './mediatorTests/log.spec'; import cacheMediatorTests from './mediatorTests/cache.spec'; import throttleMediatorTests from './mediatorTests/throttle.spec'; import callSequenceMediatorTests from './mediatorTests/callSequence.spec'; +import validateMediatorTests from './mediatorTests/validate.spec'; +import dataMapperMediatorTests from './mediatorTests/dataMapper.spec'; import overviewPageTests from './overviewPageTests/projectSettingPage.spec'; import openEntryPointArtifact from './overviewPageTests/openEntryPointArtifact.spec'; -import validateMediatorTests from './mediatorTests/validate.spec'; import multiWorkspaceTests from './multiWorkspaceTests/multiWorkspace.spec'; import unitTestSuitTests from './unitTestSuite.spec'; import { page } from './Utils'; @@ -61,6 +62,7 @@ test.describe(cacheMediatorTests); test.describe(throttleMediatorTests); test.describe(callSequenceMediatorTests); test.describe(validateMediatorTests); +test.describe(dataMapperMediatorTests); test.describe(unitTestSuitTests); test.describe(artifact430Tests); From 5c0340d97f77717a68c5dca929a72a3a2e9956d5 Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Thu, 17 Apr 2025 22:07:29 +0530 Subject: [PATCH 002/349] add functionality to click on mediator img --- .../src/test/e2e-playwright-tests/components/Diagram.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/Diagram.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/Diagram.ts index 5f514b3c7df..368420eda31 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/Diagram.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/Diagram.ts @@ -237,6 +237,10 @@ class Mediator { await this.mediatotNode.click(); } + public async clickOnImg() { + await this.mediatotNode.locator('i').click(); + } + public async getEditForm() : Promise
{ const sidePanel = new SidePanel(this.container); await sidePanel.init(); From 45e4bd99b93432b1133a4e5ee53f21f9191dc533 Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Mon, 7 Apr 2025 09:43:03 +0530 Subject: [PATCH 003/349] add db report mediator ui tests --- .../mediatorTests/dbReport.spec.ts | 479 ++++++++++++++++++ .../test/e2e-playwright-tests/test.list.ts | 2 + 2 files changed, 481 insertions(+) create mode 100644 workspaces/mi/mi-extension/src/test/e2e-playwright-tests/mediatorTests/dbReport.spec.ts diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/mediatorTests/dbReport.spec.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/mediatorTests/dbReport.spec.ts new file mode 100644 index 00000000000..4dc22cf867b --- /dev/null +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/mediatorTests/dbReport.spec.ts @@ -0,0 +1,479 @@ +/** + * 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 { test, expect } from '@playwright/test'; +import { Form } from './../components/Form'; +import { AddArtifact } from './../components/AddArtifact'; +import { ServiceDesigner } from './../components/ServiceDesigner'; +import { initTest, page } from '../Utils'; +import { MACHINE_VIEW } from '@wso2/mi-core'; +import { Overview } from '../components/Overview'; +import { Diagram, SidePanel } from './../components/Diagram'; +import { Resource } from '../components/ArtifactTest/Resource'; + +export default function createTests() { + test.describe("DB Report Mediator Tests", { + tag: '@group4', + }, async () => { + initTest(); + + test("DB Report Mediator Tests", async ({ }, testInfo) => { + const testAttempt = testInfo.retry + 1; + await test.step('Create new API', async () => { + // wait until window reload + const { title: iframeTitle } = await page.getCurrentWebview(); + + if (iframeTitle === MACHINE_VIEW.Overview) { + const overviewPage = new Overview(page.page); + await overviewPage.init(); + await overviewPage.goToAddArtifact(); + } + + const addArtifactPage = new AddArtifact(page.page); + await addArtifactPage.init(); + await addArtifactPage.add('API'); + + const apiForm = new Form(page.page, 'API Form'); + await apiForm.switchToFormView(); + await apiForm.fill({ + values: { + 'Name*': { + type: 'input', + value: 'dbReportMediatorAPI' + testAttempt, + }, + 'Context*': { + type: 'input', + value: '/dbReportMediatorAPI' + testAttempt, + }, + } + }); + await apiForm.submit(); + }); + + await test.step('Service designer', async () => { + // service designer + const serviceDesigner = new ServiceDesigner(page.page); + await serviceDesigner.init(); + const resource = await serviceDesigner.resource('GET', '/'); + await resource.click(); + }); + + await test.step('Add DB Report mediator into resource with custom values', async () => { + const diagram = new Diagram(page.page, 'Resource'); + await diagram.init(); + await diagram.clickPlusButtonByIndex(0); + const sidePanel = new SidePanel(diagram.getDiagramWebView()); + await sidePanel.init(); + await sidePanel.search('DB Report'); + await sidePanel.selectMediator('DB\\ Report'); + const form = await sidePanel.getForm(); + await form.fill({ + values: { + 'Connection Type': { + type: 'combo', + value: 'DB_CONNECTION', + }, + 'Connection DB Type': { + type: 'combo', + value: 'OTHER', + }, + 'Connection DB Driver*': { + type: 'input', + value: 'mysql driver', + }, + 'Connection URL*': { + type: 'input', + value: 'connection url', + }, + 'Connection Username*': { + type: 'input', + value: 'root', + }, + 'Connection Password*': { + type: 'input', + value: 'password', + }, + 'Description': { + type: 'input', + value: 'initial db report mediator', + } + } + }) + await form.submit('Add'); + await diagram.getMediator('dbreport'); + }); + + await test.step('Edit DB Report mediator in resource', async () => { + const diagram = new Diagram(page.page, 'Resource'); + await diagram.init(); + const mediator = await diagram.getMediator('dbreport'); + await mediator.edit({ + values: { + 'Connection DB Driver*': { + type: 'input', + value: 'mongodb driver', + }, + 'Description': { + type: 'input', + value: 'edited db report mediator', + } + } + }); + await diagram.getMediator('dbreport'); + }); + + await test.step('Navigate to new resource creation page with add new button', async () => { + const diagram = new Diagram(page.page, 'Resource'); + await diagram.init(); + const mediator = await diagram.getMediator('dbreport'); + await mediator.click(); + const editForm = await mediator.getEditForm(); + await editForm.fill({ + values: { + 'Is Registry Based Driver Config': { + type: 'checkbox', + value: 'checked', + }, + 'Is Registry Based URL Config': { + type: 'checkbox', + value: 'checked', + }, + 'Is Registry Based User Config': { + type: 'checkbox', + value: 'checked', + }, + 'Is Registry Based Pass Config': { + type: 'checkbox', + value: 'checked', + }, + } + }); + const resource = new Resource(page.page); + + await editForm.clickAddNewForField('Registry Based Connection DB Driver'); + await resource.addFromTemplate({ + name: 'driver', + type: 'JSON File', + registryPath: 'json' + }, true); + + await editForm.clickAddNewForField('Registry Based URL Config Key'); + await resource.addFromTemplate({ + name: 'urlConfig', + type: 'JSON File', + registryPath: 'json' + }, true); + + await editForm.clickAddNewForField('Registry Based User Config Key'); + await resource.addFromTemplate({ + name: 'user', + type: 'JSON File', + registryPath: 'json' + }, true); + + await editForm.clickAddNewForField('Registry Based Pass Config Key'); + await resource.addFromTemplate({ + name: 'pass', + type: 'JSON File', + registryPath: 'json' + }, true); + await editForm.submit('Update'); + await diagram.getMediator('dbreport'); + }); + + await test.step('Select already created resources from drop down', async () => { + const diagram = new Diagram(page.page, 'Resource'); + await diagram.init(); + const mediator = await diagram.getMediator('dbreport'); + await mediator.click(); + const editForm = await mediator.getEditForm(); + await editForm.fill({ + values: { + 'Registry Based Connection DB Driver': { + type: 'combo', + value: 'json/urlConfig.json', + }, + 'Registry Based URL Config Key': { + type: 'combo', + value: 'json/driver.json', + }, + 'Registry Based User Config Key': { + type: 'combo', + value: 'json/pass.json', + }, + 'Registry Based Pass Config Key': { + type: 'combo', + value: 'json/user.json', + }, + } + }); + await editForm.submit('Update'); + await diagram.getMediator('dbreport'); + }); + + await test.step('Add SQL statements', async () => { + const diagram = new Diagram(page.page, 'Resource'); + await diagram.init(); + const mediator = await diagram.getMediator('dbreport'); + await mediator.click(); + const editForm = await mediator.getEditForm(); + + // 1st sql statement + const sqlStatementManager = await editForm.getDefaultParamManager('sqlStatements'); + let sqlStatementForm = await sqlStatementManager.getAddNewForm(); + await sqlStatementForm.fill({ + values: { + 'Query String*': { + type: 'input', + value: 'select * from customer;' + } + } + }); + await sqlStatementForm.submit('Add'); + + // 2nd sql statement + sqlStatementForm = await sqlStatementManager.getAddNewForm(); + await sqlStatementForm.fill({ + values: { + 'Query String*': { + type: 'input', + value: 'select * from teacher;' + } + } + }); + + const parameterManager = await sqlStatementForm.getDefaultParamManager('parameters'); + let parameterForm = await parameterManager.getAddNewForm(); + await parameterForm.fill({ + values: { + 'Value Literal*': { + type: 'input', + value: 'Sam' + } + } + }); + await parameterForm.submit('Add'); + + parameterForm = await parameterManager.getAddNewForm(); + await parameterForm.fill({ + values: { + 'Data Type': { + type: 'combo', + value: 'LONGVARCHAR' + }, + 'Value Type': { + type: 'combo', + value: 'EXPRESSION' + }, + 'Value Expression*': { + type: 'expression', + value: '$ctx:username' + } + } + }); + await parameterForm.submit('Add'); + await sqlStatementForm.submit('Add'); + + // 3rd sql statement + sqlStatementForm = await sqlStatementManager.getAddNewForm(); + await sqlStatementForm.fill({ + values: { + 'Query String*': { + type: 'input', + value: 'select * from school;' + } + } + }); + + const resultManager = await sqlStatementForm.getDefaultParamManager('results'); + let resultForm = await resultManager.getAddNewForm(); + await resultForm.fill({ + values: { + 'Property Name': { + type: 'input', + value: 'field' + }, + 'Column ID': { + type: 'input', + value: 'student count' + } + } + }); + await resultForm.submit('Add'); + await sqlStatementForm.submit('Add'); + + // 4th sql statement + sqlStatementForm = await sqlStatementManager.getAddNewForm(); + await sqlStatementForm.fill({ + values: { + 'Query String*': { + type: 'input', + value: 'select * from district;' + } + } + }); + + parameterForm = await parameterManager.getAddNewForm(); + await parameterForm.fill({ + values: { + 'Data Type': { + type: 'combo', + value: 'NUMERIC' + }, + 'Value Type': { + type: 'combo', + value: 'LITERAL' + }, + 'Value Literal*': { + type: 'input', + value: '12' + } + } + }); + await parameterForm.submit('Add'); + parameterForm = await parameterManager.getAddNewForm(); + await parameterForm.fill({ + values: { + 'Data Type': { + type: 'combo', + value: 'NUMERIC' + }, + 'Value Type': { + type: 'combo', + value: 'EXPRESSION' + }, + 'Value Expression*': { + type: 'expression', + value: '$ctx:value' + } + } + }); + await parameterForm.submit('Add'); + + resultForm = await resultManager.getAddNewForm(); + await resultForm.fill({ + values: { + 'Property Name': { + type: 'input', + value: 'result1' + }, + 'Column ID': { + type: 'input', + value: 'count1' + } + } + }); + await resultForm.submit('Add'); + + resultForm = await resultManager.getAddNewForm(); + await resultForm.fill({ + values: { + 'Property Name': { + type: 'input', + value: 'result2' + }, + 'Column ID': { + type: 'input', + value: 'count2' + } + } + }); + await resultForm.submit('Add'); + await sqlStatementForm.submit('Add'); + await editForm.submit('Update'); + await diagram.getMediator('dbreport'); + }); + + await test.step('Edit SQL statements', async () => { + const diagram = new Diagram(page.page, 'Resource'); + await diagram.init(); + const mediator = await diagram.getMediator('dbreport'); + await mediator.click(); + const editForm = await mediator.getEditForm(); + const sqlStatementManager = await editForm.getDefaultParamManager('sqlStatements'); + const sqlStatementForm = await sqlStatementManager.getEditForm(3); + await sqlStatementForm.fill({ + values: { + 'Query String*': { + type: 'input', + value: 'select * from foreign-country;' + } + } + }); + + // edit parameter + const parameterManager = await sqlStatementForm.getDefaultParamManager('parameters'); + const parameterForm = await parameterManager.getEditForm(1); + await parameterForm.fill({ + values: { + 'Data Type': { + type: 'combo', + value: 'DECIMAL' + } + } + }); + await parameterForm.submit('Update'); + + // edit result + const resultManager = await sqlStatementForm.getDefaultParamManager('results'); + const resultForm = await resultManager.getEditForm(1); + await resultForm.fill({ + values: { + 'Column ID': { + type: 'input', + value: 'column1' + } + } + }); + await resultForm.submit('Update'); + await sqlStatementForm.submit('Update'); + await editForm.submit('Update'); + }); + + await test.step('Delete SQL statements', async () => { + const diagram = new Diagram(page.page, 'Resource'); + await diagram.init(); + const mediator = await diagram.getMediator('dbreport'); + await mediator.click(); + const editForm = await mediator.getEditForm(); + const sqlStatementManager = await editForm.getDefaultParamManager('sqlStatements'); + await sqlStatementManager.deleteParam(1); + + // delete parameter + const sqlStatementForm = await sqlStatementManager.getEditForm(2); + const parameterManager = await sqlStatementForm.getDefaultParamManager('parameters'); + await parameterManager.deleteParam(1); + + // delete result + const resultManager = await sqlStatementForm.getDefaultParamManager('results'); + await resultManager.deleteParam(1); + await sqlStatementForm.submit('Update'); + await editForm.submit('Update'); + }); + + await test.step('Delete DB Report mediator', async () => { + const diagram = new Diagram(page.page, 'Resource'); + await diagram.init(); + const mediator = await diagram.getMediator('dbreport'); + await mediator.delete(); + const logMediatorsCount = await diagram.getMediatorsCount('dbreport'); + expect(logMediatorsCount).toBe(0); + }); + }); + }); +} diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/test.list.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/test.list.ts index 69c5e46a856..337fe1c507b 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/test.list.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/test.list.ts @@ -30,6 +30,7 @@ import throttleMediatorTests from './mediatorTests/throttle.spec'; import callSequenceMediatorTests from './mediatorTests/callSequence.spec'; import validateMediatorTests from './mediatorTests/validate.spec'; import dataMapperMediatorTests from './mediatorTests/dataMapper.spec'; +import dbReportMediatorTests from './mediatorTests/dbReport.spec'; import overviewPageTests from './overviewPageTests/projectSettingPage.spec'; import openEntryPointArtifact from './overviewPageTests/openEntryPointArtifact.spec'; import multiWorkspaceTests from './multiWorkspaceTests/multiWorkspace.spec'; @@ -64,6 +65,7 @@ test.describe(callSequenceMediatorTests); test.describe(validateMediatorTests); test.describe(dataMapperMediatorTests); test.describe(unitTestSuitTests); +test.describe(dbReportMediatorTests); test.describe(artifact430Tests); test.afterAll(async () => { From e5c159b37bdb8d68ea326c2a44df25a492ec82da Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Sat, 28 Jun 2025 19:06:37 +0530 Subject: [PATCH 004/349] Add methods to support MCP related components --- .../src/rpc-types/ai-agent/rpc-type.ts | 1 + .../src/core/extended-language-client.ts | 9 ++++++++- .../src/rpc-managers/ai-agent/rpc-handler.ts | 5 ++++- .../src/rpc-managers/ai-agent/rpc-manager.ts | 14 ++++++++++++++ .../src/rpc-clients/ai-agent/rpc-client.ts | 7 +++++++ 5 files changed, 34 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts index 23ff01bc74d..3fef6ac4045 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts @@ -25,6 +25,7 @@ export const getAllModels: RequestType = { met export const getAllMemoryManagers: RequestType = { method: `${_preFix}/getAllMemoryManagers` }; export const getModels: RequestType = { method: `${_preFix}/getModels` }; export const getTools: RequestType = { method: `${_preFix}/getTools` }; +export const getMcpTools: RequestType = { method: `${_preFix}/getMcpTools` }; export const genTool: RequestType = { method: `${_preFix}/genTool` }; export const createAIAgent: RequestType = { method: `${_preFix}/createAIAgent` }; export const updateAIAgentTools: RequestType = { method: `${_preFix}/updateAIAgentTools` }; 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 bf8e7b29408..4a01617c252 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts @@ -226,7 +226,9 @@ import { ResourceReturnTypesRequest, ResourceReturnTypesResponse, JsonToTypeRequest, - JsonToTypeResponse + JsonToTypeResponse, + McpToolsRequest, + McpToolsResponse } from "@wso2/ballerina-core"; import { BallerinaExtension } from "./index"; import { debug, handlePullModuleProgress } from "../utils"; @@ -367,6 +369,7 @@ enum EXTENDED_APIS { BI_AI_ALL_MEMORY_MANAGERS = 'agentManager/getAllMemoryManagers', BI_AI_GET_MODELS = 'agentManager/getModels', BI_AI_GET_TOOLS = 'agentManager/getTools', + BI_AI_GET_MCP_TOOLS = 'agentManager/getMcpTools', BI_AI_GEN_TOOLS = 'agentManager/genTool', BI_IS_ICP_ENABLED = 'icpService/isIcpEnabled', BI_ADD_ICP = 'icpService/addICP', @@ -1115,6 +1118,10 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest(EXTENDED_APIS.BI_AI_GET_TOOLS, params); } + async getMcpTools(params: McpToolsRequest): Promise { + return this.sendRequest(EXTENDED_APIS.BI_AI_GET_MCP_TOOLS, params); + } + async genTool(params: AIGentToolsRequest): Promise { return this.sendRequest(EXTENDED_APIS.BI_AI_GEN_TOOLS, params); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts index 2642cadf1e6..86cb04d635f 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts @@ -30,7 +30,9 @@ import { getAllModels, getModels, getTools, - updateAIAgentTools + getMcpTools, + updateAIAgentTools, + McpToolsRequest } from "@wso2/ballerina-core"; import { Messenger } from "vscode-messenger"; import { AiAgentRpcManager } from "./rpc-manager"; @@ -42,6 +44,7 @@ export function registerAiAgentRpcHandlers(messenger: Messenger) { messenger.onRequest(getAllMemoryManagers, (args: MemoryManagersRequest) => rpcManger.getAllMemoryManagers(args)); messenger.onRequest(getModels, (args: AIModelsRequest) => rpcManger.getModels(args)); messenger.onRequest(getTools, (args: AIToolsRequest) => rpcManger.getTools(args)); + messenger.onRequest(getMcpTools, (args: McpToolsRequest) => rpcManger.getMcpTools(args)); messenger.onRequest(genTool, (args: AIGentToolsRequest) => rpcManger.genTool(args)); messenger.onRequest(createAIAgent, (args: AIAgentRequest) => rpcManger.createAIAgent(args)); messenger.onRequest(updateAIAgentTools, (args: AIAgentToolsUpdateRequest) => rpcManger.updateAIAgentTools(args)); diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts index 56778700e80..dcc0f888807 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts @@ -31,6 +31,8 @@ import { AgentTool, AgentToolRequest, FlowNode, + McpToolsRequest, + McpToolsResponse, MemoryManagersRequest, MemoryManagersResponse, NodePosition, @@ -111,6 +113,18 @@ export class AiAgentRpcManager implements AIAgentAPI { }); } + async getMcpTools(params: McpToolsRequest): Promise { + return new Promise(async (resolve) => { + const context = StateMachine.context(); + try { + const res: McpToolsResponse = await context.langClient.getMcpTools(params); + resolve(res); + } catch (error) { + console.log(error); + } + }); + } + async genTool(params: AIGentToolsRequest): Promise { // HACK: set description to empty string if it is not provided if (!params.description) { diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts index eade77e35ae..9904f5a7407 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts @@ -28,6 +28,8 @@ import { AINodesResponse, AIToolsRequest, AIToolsResponse, + McpToolsRequest, + McpToolsResponse, MemoryManagersRequest, MemoryManagersResponse, createAIAgent, @@ -37,6 +39,7 @@ import { getAllModels, getModels, getTools, + getMcpTools, updateAIAgentTools } from "@wso2/ballerina-core"; import { HOST_EXTENSION } from "vscode-messenger-common"; @@ -69,6 +72,10 @@ export class AiAgentRpcClient implements AIAgentAPI { return this._messenger.sendRequest(getTools, HOST_EXTENSION, params); } + getMcpTools(params: McpToolsRequest): Promise { + return this._messenger.sendRequest(getMcpTools, HOST_EXTENSION, params); + } + genTool(params: AIGentToolsRequest): Promise { return this._messenger.sendRequest(genTool, HOST_EXTENSION, params); } From 649edf1b622ea11d29f1c80c7e89afe1a21434a8 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Sat, 28 Jun 2025 19:06:54 +0530 Subject: [PATCH 005/349] Add types for MCP related data --- .../src/interfaces/extended-lang-client.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) 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 b256f75286f..d951e9be25d 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -1442,6 +1442,18 @@ export interface AIToolsResponse { tools: string[]; } +export interface McpToolsRequest { + serviceUrl: string; + configs?: string; +} +export interface McpToolsResponse { + tools: Array<{ + name: string; + description?: string; + }>; + error?: string; +} + export interface AIGentToolsRequest { filePath: string; flowNode: FlowNode; @@ -1631,6 +1643,7 @@ export interface BIInterface extends BaseLangClientInterface { getAllModels: (params: AIModelsRequest) => Promise; getModels: (params: AIModelsRequest) => Promise; getTools: (params: AIToolsRequest) => Promise; + getMcpTools: (params: AIToolsRequest) => Promise; genTool: (params: AIGentToolsRequest) => Promise; } From ff15babb260f27aa8e31f6bc95e359b17f9c5e52 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Sat, 28 Jun 2025 19:12:50 +0530 Subject: [PATCH 006/349] Add methods to handle edit and insert mcp toolkits --- .../src/rpc-types/ai-agent/index.ts | 3 ++- .../src/views/BI/FlowDiagram/PanelManager.tsx | 19 +++++++++++++++++++ .../src/components/DiagramContext.tsx | 4 ++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts index bb09f5317b5..d48b8e7bfc3 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts @@ -16,7 +16,7 @@ * under the License. */ -import { AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest } from "../../interfaces/extended-lang-client"; +import { AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest, McpToolsRequest, McpToolsResponse } from "../../interfaces/extended-lang-client"; import { AIAgentRequest, AIAgentResponse, AIAgentToolsUpdateRequest } from "./interfaces"; export interface AIAgentAPI { @@ -25,6 +25,7 @@ export interface AIAgentAPI { getAllMemoryManagers: (params: MemoryManagersRequest) => Promise; getModels: (params: AIModelsRequest) => Promise; getTools: (params: AIToolsRequest) => Promise; + getMcpTools: (params: McpToolsRequest) => Promise; genTool: (params: AIGentToolsRequest) => Promise; createAIAgent: (params: AIAgentRequest) => Promise; updateAIAgentTools: (params: AIAgentToolsUpdateRequest) => Promise; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx index fb56e814623..754fff32181 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx @@ -27,6 +27,7 @@ import { ToolConfig } from "../AIChatAgent/ToolConfig"; import { AgentConfig } from "../AIChatAgent/AgentConfig"; import { NewAgent } from "../AIChatAgent/NewAgent"; import { AddTool } from "../AIChatAgent/AddTool"; +import { AddMcpServer } from "../AIChatAgent/AddMcpServer"; import { useEffect, useState } from "react"; import { NewTool } from "../AIChatAgent/NewTool"; import styled from "@emotion/styled"; @@ -47,6 +48,8 @@ export enum SidePanelView { NEW_AGENT = "NEW_AGENT", ADD_TOOL = "ADD_TOOL", NEW_TOOL = "NEW_TOOL", + ADD_MCP_SERVER = "ADD_MCP_SERVER", + EDIT_MCP_SERVER = "EDIT_MCP_SERVER", AGENT_TOOL = "AGENT_TOOL", AGENT_MODEL = "AGENT_MODEL", AGENT_MEMORY_MANAGER = "AGENT_MEMORY_MANAGER", @@ -89,8 +92,10 @@ interface PanelManagerProps { // AI Agent handlers onSelectTool?: (tool: ToolData, node: FlowNode) => void; + onSelectMcpToolkit?: (tool: ToolData, node: FlowNode) => void; onDeleteTool?: (tool: ToolData, node: FlowNode) => void; onAddTool?: (node: FlowNode) => void; + onAddMcpServer?: (node: FlowNode) => void; } export function PanelManager(props: PanelManagerProps) { @@ -135,6 +140,14 @@ export function PanelManager(props: PanelManagerProps) { setPanelView(SidePanelView.NEW_TOOL); }; + const handleOnAddMcpServer = () => { + setPanelView(SidePanelView.ADD_MCP_SERVER); + }; + + const handleOnEditMcpServer = () => { + setPanelView(SidePanelView.EDIT_MCP_SERVER); + }; + const handleOnBackToAddTool = () => { setPanelView(SidePanelView.ADD_TOOL); }; @@ -190,6 +203,12 @@ export function PanelManager(props: PanelManagerProps) { case SidePanelView.ADD_TOOL: return ; + case SidePanelView.ADD_MCP_SERVER: + return ; + + case SidePanelView.EDIT_MCP_SERVER: + return ; + case SidePanelView.NEW_TOOL: return ; diff --git a/workspaces/ballerina/bi-diagram/src/components/DiagramContext.tsx b/workspaces/ballerina/bi-diagram/src/components/DiagramContext.tsx index e09a1593aa8..d3534782a1c 100644 --- a/workspaces/ballerina/bi-diagram/src/components/DiagramContext.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/DiagramContext.tsx @@ -68,7 +68,9 @@ export interface DiagramContextState { agentNode: { onModelSelect: (node: FlowNode) => void; onAddTool: (node: FlowNode) => void; + onAddMcpServer: (node: FlowNode) => void; onSelectTool: (tool: ToolData, node: FlowNode) => void; + onSelectMcpToolkit: (tool: ToolData, node: FlowNode) => void; onDeleteTool: (tool: ToolData, node: FlowNode) => void; goToTool: (tool: ToolData, node: FlowNode) => void; onSelectMemoryManager: (node: FlowNode) => void; @@ -109,7 +111,9 @@ export const DiagramContext = React.createContext({ agentNode: { onModelSelect: () => {}, onAddTool: () => {}, + onAddMcpServer: () => {}, onSelectTool: () => {}, + onSelectMcpToolkit: () => {}, onDeleteTool: () => {}, goToTool: () => {}, onSelectMemoryManager: () => {}, From f9d32dcf815d5b747dc5e3218142609406d7acc0 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Sat, 28 Jun 2025 19:13:13 +0530 Subject: [PATCH 007/349] Add mcp components to the panel view --- workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx index fd9313a8b5e..70f2f16b39c 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx @@ -301,7 +301,11 @@ export function getContainerTitle(view: SidePanelView, activeNode: FlowNode, cli case SidePanelView.AGENT_TOOL: return "Configure Tool"; case SidePanelView.ADD_TOOL: - return "Add Tool"; + return "Add Tool / MCP Server"; + case SidePanelView.ADD_MCP_SERVER: + return "Add MCP Server"; + case SidePanelView.EDIT_MCP_SERVER: + return "Edit MCP Server"; case SidePanelView.NEW_TOOL: return "Create New Tool"; case SidePanelView.AGENT_CONFIG: From 640a6684fb2fdc2e1b0b650c341749eff672d478 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Sat, 28 Jun 2025 19:18:19 +0530 Subject: [PATCH 008/349] Add support for mcp toolkits --- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 670 ++++++++++++++++++ .../src/views/BI/AIChatAgent/AddTool.tsx | 112 ++- 2 files changed, 758 insertions(+), 24 deletions(-) create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx new file mode 100644 index 00000000000..08c9fc5f624 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -0,0 +1,670 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * This software is the property of WSO2 LLC. and its suppliers, if any. + * Dissemination of any information or reproduction of any material contained + * herein in any form is strictly forbidden, unless permitted by WSO2 expressly. + * You may not alter or remove any copyright or other notice from copies of this content. + */ + +import { useEffect, useRef, useState } from "react"; +import styled from "@emotion/styled"; +import { FlowNode, ToolData } from "@wso2-enterprise/ballerina-core"; +import { useRpcContext } from "@wso2-enterprise/ballerina-rpc-client"; +import { ActionButtons, Button, Codicon, ThemeColors, Dropdown } from "@wso2-enterprise/ui-toolkit"; +import { RelativeLoader } from "../../../components/RelativeLoader"; +import { addMcpServerToAgentNode, updateMcpServerToAgentNode, findAgentNodeFromAgentCallNode, getAgentFilePath } from "./utils"; +import { TextField, Typography } from '@wso2-enterprise/ui-toolkit'; +import { PropertyModel } from '@wso2-enterprise/ballerina-core'; +import { ReadonlyField } from '../../../views/BI/ServiceDesigner/components/ReadonlyField'; + +const NameContainer = styled.div` + display: flex; + flex-direction: row; +`; + +export const ContentWrapper = styled.div` + display: flex; + flex-direction: column; + gap: 10px; +`; + +const Container = styled.div` + padding: 16px; + display: flex; + flex-direction: column; + height: 100%; + min-height: 100%; + box-sizing: border-box; +`; + +const LoaderContainer = styled.div` + display: flex; + justify-content: center; + align-items: center; + height: 100%; +`; + +const Description = styled.div` + font-size: var(--vscode-font-size); + color: ${ThemeColors.ON_SURFACE_VARIANT}; + margin-bottom: 8px; +`; + +const Column = styled.div` + display: flex; + flex-direction: column; + gap: 8px; + flex: 1; + overflow-y: auto; +`; + +const Row = styled.div` + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + margin-bottom: 8px; +`; + +const Title = styled.div` + font-size: 14px; + font-family: GilmerBold; +`; + +const ToolItem = styled.div<{ isSelected?: boolean }>` + display: flex; + flex-direction: row; + align-items: center; + gap: 5px; + padding: 5px; + border: 1px solid + ${(props: { isSelected: boolean }) => (props.isSelected ? ThemeColors.PRIMARY : ThemeColors.OUTLINE_VARIANT)}; + border-radius: 5px; + height: 36px; + cursor: "pointer"; + font-size: 14px; + &:hover { + background-color: ${ThemeColors.PRIMARY_CONTAINER}; + border: 1px solid ${ThemeColors.PRIMARY}; + } +`; + +const PrimaryButton = styled(Button)` + appearance: "primary"; +`; + +const HighlightedButton = styled.div` + margin-top: 10px; + width: 100%; + display: flex; + flex-direction: row; + justify-content: center; + align-items: flex-start; + gap: 8px; + padding: 6px 2px; + color: ${ThemeColors.PRIMARY}; + border: 1px dashed ${ThemeColors.PRIMARY}; + border-radius: 5px; + cursor: pointer; + &:hover { + border: 1px solid ${ThemeColors.PRIMARY}; + background-color: ${ThemeColors.PRIMARY_CONTAINER}; + } +`; + +const Footer = styled.div` + position: fixed; + bottom: 0; + left: 0; + + width: 100%; + display: flex; + justify-content: flex-end; + gap: 12px; + padding: 16px; + background-color: ${ThemeColors.SURFACE_DIM}; + margin-top: auto; +`; + +const ToolsContainer = styled.div` + display: flex; + flex-direction: column; + gap: 8px; + margin-top: 12px; + padding: 12px; + border: 1px solid ${ThemeColors.OUTLINE_VARIANT}; + border-radius: 8px; +`; + +const ToolsHeader = styled.div` + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + margin-bottom: 8px; +`; + +const ToolsTitle = styled.div` + font-size: 14px; + font-family: GilmerBold; + color: ${ThemeColors.ON_SURFACE}; +`; + +const ToolCheckboxContainer = styled.div` + display: flex; + flex-direction: column; + gap: 6px; + max-height: 200px; + overflow-y: auto; +`; + +const ToolCheckboxItem = styled.div` + display: flex; + flex-direction: row; + align-items: center; + gap: 8px; + padding: 4px 0; +`; + +const ErrorMessage = styled.div` + color: ${ThemeColors.ERROR}; + font-size: 12px; + margin-top: 4px; +`; + +const LoadingMessage = styled.div` + color: ${ThemeColors.ON_SURFACE_VARIANT}; + font-size: 12px; + display: flex; + align-items: center; + gap: 8px; +`; + +const CustomCheckbox = styled.div<{ checked: boolean; disabled?: boolean }>` + width: 16px; + height: 16px; + border: 2px solid ${props => props.checked ? ThemeColors.PRIMARY : ThemeColors.OUTLINE_VARIANT}; + border-radius: 2px; + background-color: ${props => props.checked ? ThemeColors.PRIMARY : 'transparent'}; + display: flex; + align-items: center; + justify-content: center; + cursor: ${props => props.disabled ? 'not-allowed' : 'pointer'}; + opacity: ${props => props.disabled ? 0.5 : 1}; + transition: all 0.2s ease; + position: relative; + + &:hover { + border-color: ${props => props.disabled ? ThemeColors.OUTLINE_VARIANT : ThemeColors.PRIMARY}; + background-color: ${props => { + if (props.disabled) return props.checked ? ThemeColors.PRIMARY : 'transparent'; + return props.checked ? ThemeColors.PRIMARY : ThemeColors.PRIMARY_CONTAINER; + }}; + } +`; + +const CheckboxIcon = styled.div<{ visible: boolean }>` + width: 10px; + height: 10px; + opacity: ${props => props.visible ? 1 : 0}; + transition: opacity 0.2s ease; + display: flex; + align-items: center; + justify-content: center; + + /* SVG checkmark */ + &::after { + content: ''; + width: 8px; + height: 8px; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='white' d='M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: center; + background-size: contain; + } +`; + +interface Tool { + name: string; + description?: string; +} + +interface AddToolProps { + editMode?: boolean; + name?: string; + agentCallNode: FlowNode; + onAddMcpServer: () => void; + onSave?: () => void; + onBack?: () => void; +} + +export function AddMcpServer(props: AddToolProps): JSX.Element { + const { agentCallNode, onAddMcpServer, onSave, editMode = false } = props; + console.log(">>> Add Mcp Server props", props); + const { rpcClient } = useRpcContext(); + const [mcpToolkitCount, setMcpToolkitCount] = useState(1); + const [agentNode, setAgentNode] = useState(null); + const [existingTools, setExistingTools] = useState([]); + const [toolsStringList, setToolsStringList] = useState(""); + const [selectedTool, setSelectedTool] = useState(null); + + const [serviceUrl, setServiceUrl] = useState(""); + const [configs, setConfigs] = useState({}); + const [toolSelection, setToolSelection] = useState("All"); + const [name, setName] = useState(props.name || ""); + + // New state for MCP server tools + const [mcpTools, setMcpTools] = useState([]); + const [selectedMcpTools, setSelectedMcpTools] = useState>(new Set()); + const [loadingMcpTools, setLoadingMcpTools] = useState(false); + const [mcpToolsError, setMcpToolsError] = useState(""); + + const [loading, setLoading] = useState(false); + const [savingForm, setSavingForm] = useState(false); + + const agentFilePath = useRef(""); + + const handleAddNewMcpServer = () => { + onAddMcpServer(); + } + + const handleBack = () => { + props.onBack?.(); + }; + + useEffect(() => { + initPanel(); + }, [agentCallNode]); + + // Effect to fetch MCP tools when serviceUrl changes and toolSelection is "Selected" + useEffect(() => { + if (toolSelection === "Selected" && serviceUrl.trim()) { + fetchMcpTools(); + } else { + // Clear tools when not in selected mode or no URL + setMcpTools([]); + setSelectedMcpTools(new Set()); + setMcpToolsError(""); + } + }, [toolSelection, serviceUrl]); + + const fetchAgentNode = async () => { + const agentNode = await findAgentNodeFromAgentCallNode(agentCallNode, rpcClient); + setAgentNode(agentNode); + + if (agentNode?.properties?.tools?.value) { + const toolsString = agentNode.properties.tools.value.toString(); + const mcpToolkits = extractMcpToolkits(toolsString); + console.log(">>> toolsString", toolsString); + console.log(">>> mcpToolkits", mcpToolkits); + if (mcpToolkits.length > 0) { + setMcpToolkitCount(mcpToolkits.length + 1); + } + setToolsStringList(toolsString); + + if (name.trim() !== "") { + // Add null checks for metadata and data + const tools = props.agentCallNode?.metadata?.data?.tools || []; + console.log(">>> tools", tools); + if (tools.length > 0) { + const matchingTool = tools.find(tool => tool.name.includes(name)); + console.log(">>> matching tool", matchingTool); + console.log(">>> existing mcp toolkit", toolsString); + + if (matchingTool) { + // Escape special regex characters in the tool name + const escapedToolName = matchingTool.name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + + // Create dynamic regex pattern + const mcpToolkitPattern = `McpToolKit\\("([^"]+)",\\s*permittedTools\\s*=\\s*\\[([^\\]]*)\\]\\s*,\\s*info\\s*=\\s*\\{[^}]*name:\\s*"${escapedToolName}[^"]*"`; + const mcpToolkitRegex = new RegExp(mcpToolkitPattern); + + const match = toolsString.match(mcpToolkitRegex); + + if (match) { + // Extract the URL (first capture group) + const url = match[1]; + setServiceUrl(url); + + // Extract permittedTools (second capture group) + const permittedToolsStr = match[2]; + if (permittedToolsStr.trim() !== "") { + setToolSelection("Selected"); + // Parse and set selected tools + const toolNames = permittedToolsStr.split(',').map(t => t.trim().replace(/"/g, '')); + setSelectedMcpTools(new Set(toolNames)); + } + } + } + } + } + } + }; + + const initPanel = async () => { + setLoading(true); + // get agent file path + agentFilePath.current = await getAgentFilePath(rpcClient); + // fetch tools and agent node + await fetchExistingTools(); + await fetchAgentNode(); + setLoading(false); + }; + + useEffect(() => { + + }, [name, props.agentCallNode?.metadata?.data?.tools, toolsStringList]); + + const extractMcpToolkits = (toolsString: string): string[] => { + const mcpToolkits: string[] = []; + const regex = /check new ai:McpToolKit/g; + const matches = toolsString.match(regex); + + if (matches) { + mcpToolkits.push(...Array(matches.length).fill("MCP ToolKit")); + } + + return mcpToolkits; + }; + + const fetchExistingTools = async () => { + const existingTools = await rpcClient.getAIAgentRpcClient().getTools({ filePath: agentFilePath.current }); + console.log(">>> existing tools", existingTools); + setExistingTools(existingTools.tools); + }; + + const fetchMcpTools = async () => { + if (!serviceUrl.trim()) { + return; + } + + setLoadingMcpTools(true); + setMcpToolsError(""); + setMcpTools([]); + // Don't clear selected tools in edit mode + if (!editMode) { + setSelectedMcpTools(new Set()); + } + + try { + // Check if getMcpTools method exists in the RPC client + const languageServerClient = rpcClient.getAIAgentRpcClient(); + + if (typeof languageServerClient.getMcpTools === 'function') { + // Use the actual RPC method if it exists + console.log(">>> Fetching MCP tools from server"); + const response = await languageServerClient.getMcpTools({ + serviceUrl: serviceUrl.trim(), + configs: configs + }); + + console.log(">>> MCP tools response", response); + + if (response.tools && Array.isArray(response.tools)) { + setMcpTools(response.tools); + } else { + setMcpToolsError("No tools found in MCP server response"); + } + } + } catch (error) { + console.error(">>> Error fetching MCP tools", error); + setMcpToolsError(`Failed to fetch tools from MCP server: ${error || 'Unknown error'}`); + } finally { + setLoadingMcpTools(false); + } + }; + + const handleToolSelectionChange = (toolName: string, isSelected: boolean) => { + const newSelectedTools = new Set(selectedMcpTools); + if (isSelected) { + newSelectedTools.add(toolName); + } else { + newSelectedTools.delete(toolName); + } + setSelectedMcpTools(newSelectedTools); + }; + + const handleSelectAllTools = () => { + if (selectedMcpTools.size === mcpTools.length) { + // Deselect all + setSelectedMcpTools(new Set()); + } else { + // Select all + setSelectedMcpTools(new Set(mcpTools.map(tool => tool.name))); + } + }; + + const handleOnSave = async () => { + console.log(">>> save value", { selectedTool, selectedMcpTools: Array.from(selectedMcpTools) }); + + let defaultName = "MCP ToolKit"; + if (mcpToolkitCount > 1) { + defaultName += ` 0${mcpToolkitCount}`; + } + const payload = { + name: name.trim() || defaultName, + serviceUrl: serviceUrl.trim(), + configs: configs, + toolSelection, + selectedTools: toolSelection === "Selected" ? Array.from(selectedMcpTools) : [] + }; + setMcpToolkitCount(mcpToolkitCount + 1); + console.log(">>> toolkit count", mcpToolkitCount); + console.log(">>> Saving with payload:", payload); + + setSavingForm(true); + try { + // update the agent node + const updatedAgentNode = await addMcpServerToAgentNode(agentNode, payload); + // generate the source code + const agentResponse = await rpcClient + .getBIDiagramRpcClient() + .getSourceCode({ filePath: agentFilePath.current, flowNode: updatedAgentNode }); + console.log(">>> response getSourceCode with template ", { agentResponse }); + + onSave?.(); + } catch (error) { + console.error(">>> Error saving MCP server", error); + // You might want to show an error message to the user here + } finally { + setSavingForm(false); + } + }; + + const handleOnEdit = async () => { + console.log(">>> edit value", { selectedTool, selectedMcpTools: Array.from(selectedMcpTools) }); + + const payload = { + name: name.trim(), + serviceUrl: serviceUrl.trim(), + configs: configs, + toolSelection, + selectedTools: toolSelection === "Selected" ? Array.from(selectedMcpTools) : [] + }; + + console.log(">>> Updating with payload:", payload); + + setSavingForm(true); + try { + // Use the original name (from props) to identify which MCP server to update + const originalToolName = props.name || ""; + + // Update the existing MCP server configuration + const updatedAgentNode = await updateMcpServerToAgentNode(agentNode, payload, originalToolName); + + if (updatedAgentNode) { + // generate the source code + const agentResponse = await rpcClient + .getBIDiagramRpcClient() + .getSourceCode({ filePath: agentFilePath.current, flowNode: updatedAgentNode }); + console.log(">>> response getSourceCode with template ", { agentResponse }); + + onSave?.(); + } else { + console.error(">>> Failed to update MCP server - updatedAgentNode is null"); + } + } catch (error) { + console.error(">>> Error updating MCP server", error); + // You might want to show an error message to the user here + } finally { + setSavingForm(false); + } + }; + + const hasExistingTools = existingTools.length > 0; + const isToolSelected = selectedTool !== null; + const canSave = serviceUrl.trim() && (toolSelection !== "Selected" || selectedMcpTools.size > 0); + + console.log(">>> rendering conditions", { hasExistingTools, isToolSelected, canSave, editMode }); + + const renderToolsSelection = () => { + if (toolSelection !== "Selected") { + return null; + } + + return ( + + + Available Tools + {mcpTools.length > 0 && ( + + )} + + + {loadingMcpTools && ( + + + Loading tools from MCP server... + + )} + + {mcpToolsError && ( + {mcpToolsError} + )} + + {mcpTools.length > 0 && ( + + {mcpTools.map((tool) => ( + + !loadingMcpTools && handleToolSelectionChange(tool.name, !selectedMcpTools.has(tool.name))} + > + + +
+
{tool.name}
+ {tool.description && ( +
+ {tool.description} +
+ )} +
+
+ ))} +
+ )} + + {!loadingMcpTools && !mcpToolsError && mcpTools.length === 0 && serviceUrl.trim() && ( +
+ No tools available from this MCP server +
+ )} +
+ ); + }; + + return ( + + {loading && ( + + + + )} + + <> + + + {editMode ? "Edit MCP server configuration." : "Add an MCP server to provide tools to the Agent."} + + + + setServiceUrl(e.target.value)} + placeholder="Enter MCP server URL" + value={serviceUrl} + /> + + + + setConfigs(e.target.value)} + placeholder="Enter server configurations (optional)" + value={""} + /> + + + + setToolSelection(value)} + /> + + + {renderToolsSelection()} + + +
+ {editMode ? ( + // Edit mode: Show only Save button + + {savingForm ? "Saving..." : "Save"} + + ) : ( + // Add mode: Show Back and Add to Agent buttons + <> + + + {savingForm ? "Adding..." : "Add to Agent"} + + + )} +
+ +
+ ); +} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx index f335228d06d..e9b0bca3ef1 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx @@ -23,6 +23,7 @@ import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { Button, Codicon, ThemeColors } from "@wso2/ui-toolkit"; import { RelativeLoader } from "../../../components/RelativeLoader"; import { addToolToAgentNode, findAgentNodeFromAgentCallNode, getAgentFilePath } from "./utils"; +import { AddMcpServer } from "./AddMcpServer"; const Container = styled.div` padding: 16px; @@ -112,7 +113,6 @@ const Footer = styled.div` position: fixed; bottom: 0; left: 0; - width: 100%; display: flex; justify-content: flex-end; @@ -126,20 +126,22 @@ interface AddToolProps { agentCallNode: FlowNode; onAddNewTool: () => void; onSave?: () => void; + onBack?: () => void; } export function AddTool(props: AddToolProps): JSX.Element { const { agentCallNode, onAddNewTool, onSave } = props; - console.log(">>> AddTool props", props); const { rpcClient } = useRpcContext(); const [agentNode, setAgentNode] = useState(null); const [existingTools, setExistingTools] = useState([]); + const [existingMcpToolkits, setExistingMcpToolkits] = useState([]); const [selectedTool, setSelectedTool] = useState(null); const [loading, setLoading] = useState(false); const [savingForm, setSavingForm] = useState(false); - + + const [showAddMcpServer, setShowAddMcpServer] = useState(false); const agentFilePath = useRef(""); useEffect(() => { @@ -148,23 +150,47 @@ export function AddTool(props: AddToolProps): JSX.Element { const initPanel = async () => { setLoading(true); - // get agent file path agentFilePath.current = await getAgentFilePath(rpcClient); - // fetch tools and agent node await fetchExistingTools(); await fetchAgentNode(); setLoading(false); }; const fetchAgentNode = async () => { - // get agent node const agentNode = await findAgentNodeFromAgentCallNode(agentCallNode, rpcClient); setAgentNode(agentNode); + + if (agentNode?.properties?.tools?.value) { + const toolsString = agentNode.properties.tools.value.toString(); + const mcpToolkits = extractMcpToolkits(toolsString); + setExistingMcpToolkits(mcpToolkits); + } + }; + + const handleBack = () => { + if (showAddMcpServer) { + setShowAddMcpServer(false); + } else { + props.onBack?.(); + } + }; + + const extractMcpToolkits = (toolsString: string): string[] => { + const mcpToolkits: string[] = []; + const regex = /check new ai:McpToolKit\([^)]*info\s*=\s*\{[^}]*name\s*:\s*"([^"]*)"[^}]*\}\)/g; + + let match; + while ((match = regex.exec(toolsString)) !== null) { + if (match[1]) { + mcpToolkits.push(match[1]); + } + } + + return mcpToolkits; }; const fetchExistingTools = async () => { const existingTools = await rpcClient.getAIAgentRpcClient().getTools({ filePath: agentFilePath.current }); - console.log(">>> existing tools", existingTools); setExistingTools(existingTools.tools); }; @@ -176,25 +202,39 @@ export function AddTool(props: AddToolProps): JSX.Element { onAddNewTool(); }; + const handleAddMcpServer = () => { + setShowAddMcpServer(true); + }; + const handleOnSave = async () => { - console.log(">>> save value", { selectedTool }); setSavingForm(true); - // update the agent node const updatedAgentNode = await addToolToAgentNode(agentNode, selectedTool); - // generate the source code - const agentResponse = await rpcClient + await rpcClient .getBIDiagramRpcClient() .getSourceCode({ filePath: agentFilePath.current, flowNode: updatedAgentNode }); - console.log(">>> response getSourceCode with template ", { agentResponse }); - onSave?.(); setSavingForm(false); }; + const handleMcpServerSave = () => { + setShowAddMcpServer(false); + onSave?.(); + }; + const hasExistingTools = existingTools.length > 0; + const hasExistingMcpToolkits = existingMcpToolkits.length > 0; const isToolSelected = selectedTool !== null; - console.log(">>> rendering conditions", { hasExistingTools, isToolSelected }); + if (showAddMcpServer) { + return ( + + ); + } return ( @@ -203,23 +243,43 @@ export function AddTool(props: AddToolProps): JSX.Element { )} - {!loading && hasExistingTools && ( + {!loading && (hasExistingTools || hasExistingMcpToolkits) && ( <> Choose a tool to add to the Agent or create a new one. - - Tools - + + {existingTools.map((tool) => ( + handleToolSelection(tool)} + key={tool} + isSelected={selectedTool === tool} + > + {tool} + + ))} + + )} + + + MCP Tool Kits + - {existingTools.map((tool) => ( + {existingMcpToolkits.map((mcpToolkit, index) => ( handleToolSelection(tool)} - key={tool} - isSelected={selectedTool === tool} + key={`mcp-toolkit-${index}`} + isSelected={selectedTool === mcpToolkit} > - {tool} + {mcpToolkit} ))} @@ -230,7 +290,7 @@ export function AddTool(props: AddToolProps): JSX.Element { )} - {!loading && !hasExistingTools && !selectedTool && ( + {!loading && !hasExistingTools && !hasExistingMcpToolkits && !selectedTool && ( No tools are currently available in your integration. Add a new tool to improve your agent's @@ -240,6 +300,10 @@ export function AddTool(props: AddToolProps): JSX.Element { Create New Tool + + + Add New MCP Server + )} From d19e702e0ab8356c03e485b4e749d2e1de8e5367 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Sat, 28 Jun 2025 19:20:29 +0530 Subject: [PATCH 009/349] Add methods to handle code generation for mcp toolkits --- .../src/views/BI/AIChatAgent/utils.ts | 168 ++++++++++++++++++ 1 file changed, 168 insertions(+) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts index 1b4b5de7f42..9b9b50efaec 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts @@ -115,9 +115,177 @@ export const addToolToAgentNode = async (agentNode: FlowNode, toolName: string) console.error("Tools value is not a string", toolsValue); return agentNode; } + updatedAgentNode.properties.tools.value = toolsValue; + updatedAgentNode.codedata.isNew = false; + return updatedAgentNode; +}; + +export interface McpServerConfig { + name: string; + serviceUrl: string; + configs: Record; + toolSelection: string; + selectedTools: string[]; +}; + +export const updateMcpServerToAgentNode = async ( + agentNode: FlowNode, + toolConfig: McpServerConfig, + originalToolName: string +) => { + if (!agentNode || agentNode.codedata?.node !== "AGENT") return null; + + const updatedAgentNode = cloneDeep(agentNode); + let toolsValue = updatedAgentNode.properties.tools.value; + + if (typeof toolsValue === "string") { + console.log(">>> Current tools string", toolsValue); + + const toolsString = toolConfig.selectedTools.map(tool => `"${tool}"`).join(", "); + const newToolString = `check new ai:McpToolKit("${toolConfig.serviceUrl}", permittedTools = [${toolsString}], info = {name: "${toolConfig.name}", version: ""})`; + + const escapedOriginalName = originalToolName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + + const pattern = new RegExp( + `(check new ai:McpToolKit\\([^)]*info\\s*=\\s*\\{[^}]*name:\\s*"${escapedOriginalName}[^"]*"[^}]*\\}[^)]*\\))`, + 'g' + ); + + if (pattern.test(toolsValue)) { + console.log(">>> Found existing tool to replace"); + toolsValue = toolsValue.replace(pattern, newToolString); + } else { + console.warn(">>> Could not find existing MCP toolkit to update, adding as new"); + const trimmedValue = toolsValue.trim(); + const isWrappedInBrackets = trimmedValue.startsWith('[') && trimmedValue.endsWith(']'); + const innerContent = isWrappedInBrackets + ? trimmedValue.slice(1, -1).trim() + : trimmedValue; + toolsValue = innerContent + ? `[${innerContent}, ${newToolString}]` + : `[${newToolString}]`; + } + } else { + console.error("Tools value is not a string", toolsValue); + return agentNode; + } + // update the node updatedAgentNode.properties.tools.value = toolsValue; updatedAgentNode.codedata.isNew = false; + + console.log(">>> Final updated tools value", toolsValue); + return updatedAgentNode; +}; + +export const addMcpServerToAgentNode = async (agentNode: FlowNode, toolConfig: McpServerConfig) => { + if (!agentNode || agentNode.codedata?.node !== "AGENT") return null; + // clone the node to avoid modifying the original + const updatedAgentNode = cloneDeep(agentNode); + let toolsValue = updatedAgentNode.properties.tools.value; + // remove new lines and normalize whitespace from the tools value + + console.log(">>> qwe tools", toolConfig); + const toolsString = toolConfig.selectedTools.map(tool => `"${tool}"`).join(", "); + const toolString = `check new ai:McpToolKit("${toolConfig.serviceUrl}", permittedTools = [${toolsString}], info = {name: "${toolConfig.name}", version: ""})`; + + if (typeof toolsValue === "string") { + const toolsArray = parseToolsString(toolsValue); + if (toolsArray.length > 0) { + // Add the tool if not exists + if (!toolsArray.includes(toolString)) { + toolsArray.push(toolString); + } + // Update the tools value + toolsValue = toolsArray.length === 1 ? `[${toolsArray[0]}]` : `[${toolsArray.join(", ")}]`; + } else { + toolsValue = `[${toolString}]`; + } + } else { + console.error("Tools value is not a string", toolsValue); + return agentNode; + } + // update the node + updatedAgentNode.properties.tools.value = toolsValue; + updatedAgentNode.codedata.isNew = false; + return updatedAgentNode; +}; + +export const removeMcpServerFromAgentNode = ( + agentNode: FlowNode, + toolkitNameToRemove: string +) => { + if (!agentNode || agentNode.codedata?.node !== "AGENT") return null; + + const updatedAgentNode = cloneDeep(agentNode); + let toolsValue = updatedAgentNode.properties.tools.value; + + if (typeof toolsValue !== "string") { + console.error("Tools value is not a string", toolsValue); + return agentNode; + } + + const startPattern = 'check new ai:McpToolKit('; + let startIndex = 0; + let found = false; + + while (!found && startIndex < toolsValue.length) { + startIndex = toolsValue.indexOf(startPattern, startIndex); + if (startIndex === -1) break; + + let endIndex = toolsValue.indexOf('})', startIndex); + if (endIndex === -1) break; + endIndex += 2; // Include the '})' + + const declaration = toolsValue.substring(startIndex, endIndex); + if (declaration.includes(`name: "${toolkitNameToRemove}"`)) { + let hasCommaAfter = false; + if (toolsValue[endIndex] === ',') { + endIndex++; + hasCommaAfter = true; + } + let hasCommaBefore = false; + let newStartIndex = startIndex; + if (startIndex > 0 && toolsValue[startIndex - 1] === ',') { + newStartIndex--; + hasCommaBefore = true; + } + + let isLastItem = !hasCommaAfter; + + let before = toolsValue.substring(0, newStartIndex); + let after = toolsValue.substring(endIndex); + + if (hasCommaBefore && hasCommaAfter) { + after = after.trim(); + } else if (isLastItem) { + before = before.trim(); + if (before.endsWith(',')) { + before = before.substring(0, before.length - 1).trim(); + } + } + + toolsValue = before + after; + found = true; + } else { + startIndex = endIndex; + } + } + + toolsValue = toolsValue + .replace(/,+/g, ',') + .replace(/, ,/g, ', ') + .replace(/\s*,\s*/g, ', ') + .replace(/, $/, '') + .replace(/^, /, '') + .replace(/\s+/g, ' ') + .trim(); + + if (toolsValue === '[' || toolsValue === '[]') { + toolsValue = '[]'; + } + + updatedAgentNode.properties.tools.value = toolsValue; return updatedAgentNode; }; From 78e650d945955d830174e2eefb4914cda1ba258e Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Sat, 28 Jun 2025 19:21:06 +0530 Subject: [PATCH 010/349] Support mcp toolkit components --- .../src/views/BI/FlowDiagram/index.tsx | 85 +++++++++++++++++-- .../bi-diagram/src/components/Diagram.tsx | 2 + .../AgentCallNode/AgentCallNodeWidget.tsx | 18 +++- 3 files changed, 93 insertions(+), 12 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index 949333f4e61..d2c5221fce7 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -19,6 +19,7 @@ import { useEffect, useRef, useState, useMemo } from "react"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import styled from "@emotion/styled"; +import { removeMcpServerFromAgentNode } from "../AIChatAgent/utils"; import { MemoizedDiagram } from "@wso2/bi-diagram"; import { BIAvailableNodesRequest, @@ -61,6 +62,7 @@ import { removeAgentNode, removeToolFromAgentNode, } from "../AIChatAgent/utils"; +import { t } from "@tanstack/query-core/build/legacy/hydration-BCnR_RAv"; const Container = styled.div` width: 100%; @@ -79,10 +81,11 @@ export interface BIFlowDiagramProps { projectPath: string; onUpdate: () => void; onReady: (fileName: string) => void; + onSave?: () => void; } export function BIFlowDiagram(props: BIFlowDiagramProps) { - const { syntaxTree, projectPath, onUpdate, onReady } = props; + const { syntaxTree, projectPath, onUpdate, onReady, onSave } = props; const { rpcClient } = useRpcContext(); const [model, setModel] = useState(); @@ -942,13 +945,28 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { // Open the tool selection panel setShowProgressIndicator(true); + setTimeout(() => { + setSidePanelView(SidePanelView.ADD_TOOL); + setShowSidePanel(true); + setShowProgressIndicator(false); + }, 500); + }; + + const handleOnAddMcpServer = (node: FlowNode) => { + console.log(">>> Add MCP Server called", node); + selectedNodeRef.current = node; + selectedClientName.current = "Add MCP Server"; + + // Open the tool selection panel + setShowProgressIndicator(true); + // This would call the API to fetch tools in a real implementation setTimeout(() => { // For now, just use a dummy category const toolCategories: PanelCategory[] = [ { - title: "Tools", - description: "Tools available for the agent", + title: "MCP Servers", + description: "MCP ToolKit available for the agent", items: [ { id: "web-search", @@ -961,7 +979,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { ]; setCategories(toolCategories); - setSidePanelView(SidePanelView.ADD_TOOL); + setSidePanelView(SidePanelView.ADD_MCP_SERVER); setShowSidePanel(true); setShowProgressIndicator(false); }, 500); @@ -996,19 +1014,65 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { await rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: context }); }; + const handleOnSelectMcpToolkit = async (tool: ToolData, node: FlowNode) => { + console.log(">>> Edit mcp toolkit called", { node, tool }); + selectedNodeRef.current = node; + selectedClientName.current = tool.name; + showEditForm.current = true; + + setShowProgressIndicator(true); + // get project components to find the function + const projectComponents = await rpcClient.getBIDiagramRpcClient().getProjectComponents(); + if (!projectComponents || !projectComponents.components) { + console.error("Project components not found"); + return; + } + console.log(">>> Project info for mcp toolkit", projectComponents); + setTimeout(() => { + const toolCategories: PanelCategory[] = [ + { + title: "MCP Servers", + description: "MCP ToolKit available for the agent", + items: [ + { + id: "web-search", + label: "Web Search", + description: "Search the web for information", + enabled: true, + }, + ], + }, + ]; + + setCategories(toolCategories); + setSidePanelView(SidePanelView.EDIT_MCP_SERVER); + setShowSidePanel(true); + setShowProgressIndicator(false); + }, 500); + }; + const handleOnDeleteTool = async (tool: ToolData, node: FlowNode) => { console.log(">>> Delete tool called", tool, node); + selectedNodeRef.current = node; setShowProgressIndicator(true); try { const agentNode = await findAgentNodeFromAgentCallNode(node, rpcClient); const updatedAgentNode = await removeToolFromAgentNode(agentNode, tool.name); const agentFilePath = await getAgentFilePath(rpcClient); - // Generate the source code - const agentResponse = await rpcClient - .getBIDiagramRpcClient() - .getSourceCode({ filePath: agentFilePath, flowNode: updatedAgentNode }); - console.log(">>> response getSourceCode after tool deletion", { agentResponse }); + if (tool.name.startsWith("MCP ToolKit")) { + const updateAgentNode = removeMcpServerFromAgentNode(updatedAgentNode, tool.name); + + const agentResponse = await rpcClient + .getBIDiagramRpcClient() + .getSourceCode({ filePath: agentFilePath, flowNode: updateAgentNode }); + onSave?.(); + } else { + const agentResponse = await rpcClient + .getBIDiagramRpcClient() + .getSourceCode({ filePath: agentFilePath, flowNode: updatedAgentNode }); + console.log(">>> response getSourceCode after tool deletion", { agentResponse }); + } } catch (error) { console.error("Error deleting tool:", error); alert(`Failed to remove tool "${tool.name}". Please try again.`); @@ -1060,7 +1124,9 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { agentNode: { onModelSelect: handleOnEditAgentModel, onAddTool: handleOnAddTool, + onAddMcpServer: handleOnAddMcpServer, onSelectTool: handleOnSelectTool, + onSelectMcpToolkit: handleOnSelectMcpToolkit, onDeleteTool: handleOnDeleteTool, goToTool: handleOnGoToTool, onSelectMemoryManager: handleOnSelectMemoryManager, @@ -1130,6 +1196,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { onSelectTool={handleOnSelectTool} onDeleteTool={handleOnDeleteTool} onAddTool={handleOnAddTool} + onAddMcpServer={handleOnAddMcpServer} /> ); diff --git a/workspaces/ballerina/bi-diagram/src/components/Diagram.tsx b/workspaces/ballerina/bi-diagram/src/components/Diagram.tsx index 1850793913e..d962a9b164c 100644 --- a/workspaces/ballerina/bi-diagram/src/components/Diagram.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/Diagram.tsx @@ -63,7 +63,9 @@ export interface DiagramProps { agentNode?: { onModelSelect: (node: FlowNode) => void; onAddTool: (node: FlowNode) => void; + onAddMcpServer: (node: FlowNode) => void; onSelectTool: (tool: ToolData, node: FlowNode) => void; + onSelectMcpToolkit: (tool: ToolData, node: FlowNode) => void; onDeleteTool: (tool: ToolData, node: FlowNode) => void; goToTool: (tool: ToolData, node: FlowNode) => void; onSelectMemoryManager: (node: FlowNode) => void; diff --git a/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx b/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx index 38dc1c80192..bf606b22f82 100644 --- a/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx @@ -363,9 +363,15 @@ export function AgentCallNodeWidget(props: AgentCallNodeWidgetProps) { }; const onToolClick = (tool: ToolData) => { - console.log(">>> onToolClick", tool); - agentNode?.onSelectTool && agentNode.onSelectTool(tool, model.node); - setAnchorEl(null); + console.log(">>> on Tool Click", tool); + if (tool.name.includes("MCP ToolKit")) { + tool.type = "MCP ToolKit"; + agentNode?.onSelectMcpToolkit && agentNode.onSelectMcpToolkit(tool, model.node); + setAnchorEl(null); + } else { + agentNode?.onSelectTool && agentNode.onSelectTool(tool, model.node); + setAnchorEl(null); + } }; const onAddToolClick = () => { @@ -374,6 +380,12 @@ export function AgentCallNodeWidget(props: AgentCallNodeWidgetProps) { setAnchorEl(null); }; + const onAddMcpServerClick = () => { + console.log(">>> onAddMcpServerClick", model.node); + agentNode?.onAddMcpServer && agentNode.onAddMcpServer(model.node); + setAnchorEl(null); + }; + const onGoToSource = () => { goToSource && goToSource(model.node); setAnchorEl(null); From 7878b8729bce8c1f678d518d693df763a6ef2a47 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Sat, 28 Jun 2025 19:38:10 +0530 Subject: [PATCH 011/349] Add record for configs field --- .../ballerina-core/src/interfaces/extended-lang-client.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 d951e9be25d..695aa8c3294 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -1444,8 +1444,9 @@ export interface AIToolsResponse { export interface McpToolsRequest { serviceUrl: string; - configs?: string; + configs?: Record; } + export interface McpToolsResponse { tools: Array<{ name: string; From 41ae10a3f21a8d0fb5fb051da800bdd15922fca9 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Sat, 28 Jun 2025 19:48:21 +0530 Subject: [PATCH 012/349] Fix incorrect data mapping between McpToolsRequest and AIToolsRequest --- .../ballerina-core/src/interfaces/extended-lang-client.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 695aa8c3294..a8f29215837 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -1437,14 +1437,18 @@ export interface AIModelsRequest { export interface AIToolsRequest { filePath: string; + serviceUrl?: string; + configs?: Record; } + export interface AIToolsResponse { tools: string[]; } export interface McpToolsRequest { - serviceUrl: string; + serviceUrl?: string; configs?: Record; + filePath?: string; } export interface McpToolsResponse { From ecd0f3db2bb85e74db1fae09626688ba42abcf42 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Sat, 28 Jun 2025 20:11:10 +0530 Subject: [PATCH 013/349] Fix incorrect data mappings --- .../ballerina-core/src/interfaces/extended-lang-client.ts | 2 +- .../ballerina-core/src/rpc-types/ai-agent/rpc-type.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) 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 a8f29215837..fe4a376d1ed 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -1648,7 +1648,7 @@ export interface BIInterface extends BaseLangClientInterface { getAllModels: (params: AIModelsRequest) => Promise; getModels: (params: AIModelsRequest) => Promise; getTools: (params: AIToolsRequest) => Promise; - getMcpTools: (params: AIToolsRequest) => Promise; + getMcpTools: (params: McpToolsRequest) => Promise; genTool: (params: AIGentToolsRequest) => Promise; } diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts index 3fef6ac4045..3f926ad0e9f 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts @@ -15,7 +15,7 @@ * specific language governing permissions and limitations * under the License. */ -import { AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest } from "../../interfaces/extended-lang-client"; +import { AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest, McpToolsRequest, McpToolsResponse } from "../../interfaces/extended-lang-client"; import { AIAgentRequest, AIAgentResponse, AIAgentToolsUpdateRequest } from "./interfaces"; import { RequestType } from "vscode-messenger-common"; @@ -25,7 +25,7 @@ export const getAllModels: RequestType = { met export const getAllMemoryManagers: RequestType = { method: `${_preFix}/getAllMemoryManagers` }; export const getModels: RequestType = { method: `${_preFix}/getModels` }; export const getTools: RequestType = { method: `${_preFix}/getTools` }; -export const getMcpTools: RequestType = { method: `${_preFix}/getMcpTools` }; +export const getMcpTools: RequestType = { method: `${_preFix}/getMcpTools` }; export const genTool: RequestType = { method: `${_preFix}/genTool` }; export const createAIAgent: RequestType = { method: `${_preFix}/createAIAgent` }; export const updateAIAgentTools: RequestType = { method: `${_preFix}/updateAIAgentTools` }; From 3a1d00af8ef114a5545fdd41f1c64daf0f68d384 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Sun, 29 Jun 2025 21:03:45 +0530 Subject: [PATCH 014/349] Change MCP ToolKits to MCP Server in diagram view --- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 4 ++-- .../src/views/BI/AIChatAgent/AddTool.tsx | 12 ++++++------ .../src/views/BI/FlowDiagram/index.tsx | 6 +++--- .../nodes/AgentCallNode/AgentCallNodeWidget.tsx | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index 08c9fc5f624..90e91020987 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -362,7 +362,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { const matches = toolsString.match(regex); if (matches) { - mcpToolkits.push(...Array(matches.length).fill("MCP ToolKit")); + mcpToolkits.push(...Array(matches.length).fill("MCP Server")); } return mcpToolkits; @@ -438,7 +438,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { const handleOnSave = async () => { console.log(">>> save value", { selectedTool, selectedMcpTools: Array.from(selectedMcpTools) }); - let defaultName = "MCP ToolKit"; + let defaultName = "MCP Server"; if (mcpToolkitCount > 1) { defaultName += ` 0${mcpToolkitCount}`; } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx index e9b0bca3ef1..53a6e9a8e3e 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx @@ -164,6 +164,7 @@ export function AddTool(props: AddToolProps): JSX.Element { const toolsString = agentNode.properties.tools.value.toString(); const mcpToolkits = extractMcpToolkits(toolsString); setExistingMcpToolkits(mcpToolkits); + console.log("existingMcpToolkits", existingMcpToolkits); } }; @@ -175,15 +176,14 @@ export function AddTool(props: AddToolProps): JSX.Element { } }; + const extractMcpToolkits = (toolsString: string): string[] => { const mcpToolkits: string[] = []; - const regex = /check new ai:McpToolKit\([^)]*info\s*=\s*\{[^}]*name\s*:\s*"([^"]*)"[^}]*\}\)/g; + const regex = /check new ai:McpToolKit\([^}]*name:\s*"([^"]*)"[^}]*\}\)/g; let match; while ((match = regex.exec(toolsString)) !== null) { - if (match[1]) { - mcpToolkits.push(match[1]); - } + mcpToolkits.push(match[1]); } return mcpToolkits; @@ -248,7 +248,7 @@ export function AddTool(props: AddToolProps): JSX.Element { Choose a tool to add to the Agent or create a new one. - {hasExistingTools && ( + {( <> Tools @@ -269,7 +269,7 @@ export function AddTool(props: AddToolProps): JSX.Element { )} - MCP Tool Kits + MCP Servers diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index d2c5221fce7..eb0e2a9f53b 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -966,7 +966,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { const toolCategories: PanelCategory[] = [ { title: "MCP Servers", - description: "MCP ToolKit available for the agent", + description: "MCP Servers available for the agent", items: [ { id: "web-search", @@ -1032,7 +1032,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { const toolCategories: PanelCategory[] = [ { title: "MCP Servers", - description: "MCP ToolKit available for the agent", + description: "MCP Servers available for the agent", items: [ { id: "web-search", @@ -1060,7 +1060,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { const agentNode = await findAgentNodeFromAgentCallNode(node, rpcClient); const updatedAgentNode = await removeToolFromAgentNode(agentNode, tool.name); const agentFilePath = await getAgentFilePath(rpcClient); - if (tool.name.startsWith("MCP ToolKit")) { + if (tool.name.includes("MCP Server")) { const updateAgentNode = removeMcpServerFromAgentNode(updatedAgentNode, tool.name); const agentResponse = await rpcClient diff --git a/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx b/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx index bf606b22f82..5081801e2cf 100644 --- a/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx @@ -364,8 +364,8 @@ export function AgentCallNodeWidget(props: AgentCallNodeWidgetProps) { const onToolClick = (tool: ToolData) => { console.log(">>> on Tool Click", tool); - if (tool.name.includes("MCP ToolKit")) { - tool.type = "MCP ToolKit"; + if (tool.name.includes("MCP Server")) { + tool.type = "MCP Server"; agentNode?.onSelectMcpToolkit && agentNode.onSelectMcpToolkit(tool, model.node); setAnchorEl(null); } else { From cdb227e0119bc47a03651d9c097598148655b7bd Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Sun, 29 Jun 2025 21:04:29 +0530 Subject: [PATCH 015/349] Improve regex pattern to display available MCP servers --- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index 90e91020987..e027fa1ff57 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -304,7 +304,6 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { setToolsStringList(toolsString); if (name.trim() !== "") { - // Add null checks for metadata and data const tools = props.agentCallNode?.metadata?.data?.tools || []; console.log(">>> tools", tools); if (tools.length > 0) { @@ -316,24 +315,30 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { // Escape special regex characters in the tool name const escapedToolName = matchingTool.name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - // Create dynamic regex pattern - const mcpToolkitPattern = `McpToolKit\\("([^"]+)",\\s*permittedTools\\s*=\\s*\\[([^\\]]*)\\]\\s*,\\s*info\\s*=\\s*\\{[^}]*name:\\s*"${escapedToolName}[^"]*"`; + // Improved regex pattern to capture URL and permittedTools + const mcpToolkitPattern = `McpToolKit\\(\\s*"([^"]+)"\\s*,\\s*permittedTools\\s*=\\s*(\\([^)]*\\)|\\[[^\\]]*\\])\\s*,\\s*info\\s*=\\s*\\{[^}]*name:\\s*"${escapedToolName}[^"]*"`; const mcpToolkitRegex = new RegExp(mcpToolkitPattern); const match = toolsString.match(mcpToolkitRegex); + console.log(">>> regex match", match); if (match) { // Extract the URL (first capture group) const url = match[1]; setServiceUrl(url); - // Extract permittedTools (second capture group) const permittedToolsStr = match[2]; - if (permittedToolsStr.trim() !== "") { + if (permittedToolsStr && permittedToolsStr.trim() !== "()") { setToolSelection("Selected"); - // Parse and set selected tools - const toolNames = permittedToolsStr.split(',').map(t => t.trim().replace(/"/g, '')); + const toolNames = permittedToolsStr + .replace(/[\[\]()]/g, '') + .split(',') + .map(t => t.trim().replace(/"/g, '')) + .filter(t => t !== ''); setSelectedMcpTools(new Set(toolNames)); + } else { + setToolSelection("All"); + setSelectedMcpTools(new Set()); } } } @@ -631,7 +636,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { items={[ { id: "All", value: "All" }, { id: "Selected", value: "Selected" }, - { id: "Except", value: "Except" }, + // { id: "Except", value: "Except" }, // not yet supported for now ]} onValueChange={(value) => setToolSelection(value)} /> From b1bbe4b5bba05deaec460bccfc7daa6893ce96cb Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Sun, 29 Jun 2025 21:06:09 +0530 Subject: [PATCH 016/349] Fix method to update the exact MCP Toolkit --- .../src/views/BI/AIChatAgent/utils.ts | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts index 9b9b50efaec..44e7f8cef9d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts @@ -98,7 +98,7 @@ export const addToolToAgentNode = async (agentNode: FlowNode, toolName: string) const updatedAgentNode = cloneDeep(agentNode); let toolsValue = updatedAgentNode.properties.tools.value; // remove new lines and normalize whitespace from the tools value - toolsValue = toolsValue.toString().replace(/\s+/g, ""); + // toolsValue = toolsValue.toString().replace(/\s+/g, ""); if (typeof toolsValue === "string") { const toolsArray = parseToolsString(toolsValue); if (toolsArray.length > 0) { @@ -141,21 +141,34 @@ export const updateMcpServerToAgentNode = async ( if (typeof toolsValue === "string") { console.log(">>> Current tools string", toolsValue); - const toolsString = toolConfig.selectedTools.map(tool => `"${tool}"`).join(", "); - const newToolString = `check new ai:McpToolKit("${toolConfig.serviceUrl}", permittedTools = [${toolsString}], info = {name: "${toolConfig.name}", version: ""})`; - - const escapedOriginalName = originalToolName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); - + // Prepare the new tool string based on tool selection + let newToolString; + if (toolConfig.toolSelection.includes("Selected")) { + const toolsString = toolConfig.selectedTools.map(tool => `"${tool}"`).join(", "); + newToolString = `check new ai:McpToolKit("${toolConfig.serviceUrl}", permittedTools = [${toolsString}], info = {name: "${toolConfig.name}", version: ""})`; + } else { + newToolString = `check new ai:McpToolKit("${toolConfig.serviceUrl}", permittedTools = (), info = {name: "${toolConfig.name}", version: ""})`; + } + + // Fixed regex pattern that matches only the specific McpToolKit with the target name + // Uses negated character classes to prevent crossing boundaries const pattern = new RegExp( - `(check new ai:McpToolKit\\([^)]*info\\s*=\\s*\\{[^}]*name:\\s*"${escapedOriginalName}[^"]*"[^}]*\\}[^)]*\\))`, + `check new ai:McpToolKit\\([^}]*name:\\s*"${toolConfig.name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}"[^}]*\\}\\)`, 'g' ); + console.log(">>> Regex pattern:", pattern); + console.log(">>> Testing pattern against toolsValue:", pattern.test(toolsValue)); + + // Reset the regex lastIndex since test() modifies it + pattern.lastIndex = 0; + if (pattern.test(toolsValue)) { console.log(">>> Found existing tool to replace"); + // Reset lastIndex again before replace + pattern.lastIndex = 0; toolsValue = toolsValue.replace(pattern, newToolString); } else { - console.warn(">>> Could not find existing MCP toolkit to update, adding as new"); const trimmedValue = toolsValue.trim(); const isWrappedInBrackets = trimmedValue.startsWith('[') && trimmedValue.endsWith(']'); const innerContent = isWrappedInBrackets @@ -170,7 +183,6 @@ export const updateMcpServerToAgentNode = async ( return agentNode; } - // update the node updatedAgentNode.properties.tools.value = toolsValue; updatedAgentNode.codedata.isNew = false; @@ -187,8 +199,10 @@ export const addMcpServerToAgentNode = async (agentNode: FlowNode, toolConfig: M console.log(">>> qwe tools", toolConfig); const toolsString = toolConfig.selectedTools.map(tool => `"${tool}"`).join(", "); - const toolString = `check new ai:McpToolKit("${toolConfig.serviceUrl}", permittedTools = [${toolsString}], info = {name: "${toolConfig.name}", version: ""})`; - + let toolString = `check new ai:McpToolKit("${toolConfig.serviceUrl}", permittedTools = (), info = {name: "${toolConfig.name}", version: ""})`; + if (toolConfig.toolSelection.includes("Selected")) { + toolString = `check new ai:McpToolKit("${toolConfig.serviceUrl}", permittedTools = [${toolsString}], info = {name: "${toolConfig.name}", version: ""})`; + } if (typeof toolsValue === "string") { const toolsArray = parseToolsString(toolsValue); if (toolsArray.length > 0) { From 2e56fce1e500e6df45f12b0ddae704099f3d94e9 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Sun, 29 Jun 2025 22:48:47 +0530 Subject: [PATCH 017/349] Including details about MCP servers in descriptions --- .../ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx index 53a6e9a8e3e..2d63ce869ae 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx @@ -246,7 +246,7 @@ export function AddTool(props: AddToolProps): JSX.Element { {!loading && (hasExistingTools || hasExistingMcpToolkits) && ( <> - Choose a tool to add to the Agent or create a new one. + Choose a tool / MCP server to add to the Agent or create a new one. {( <> @@ -293,7 +293,7 @@ export function AddTool(props: AddToolProps): JSX.Element { {!loading && !hasExistingTools && !hasExistingMcpToolkits && !selectedTool && ( - No tools are currently available in your integration. Add a new tool to improve your agent's + No tools / MCP servers are currently available in your integration. Add a new tool / MCP server to improve your agent's capabilities. From 5798b1a30b148e42fc639fbcaf5263ee60e82e10 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Thu, 3 Jul 2025 10:04:25 +0530 Subject: [PATCH 018/349] Fix discrpancies in MCP Toolkit UI --- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 202 +++++++++++++----- .../src/views/BI/AIChatAgent/utils.ts | 4 +- .../src/views/BI/FlowDiagram/index.tsx | 5 +- .../views/BI/Forms/McpFormGenerator/index.ts | 0 .../src/views/BI/FunctionForm/index.tsx | 1 - .../AgentCallNode/AgentCallNodeWidget.tsx | 8 +- 6 files changed, 161 insertions(+), 59 deletions(-) create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/McpFormGenerator/index.ts diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index e027fa1ff57..c6169e9bd2f 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -9,14 +9,20 @@ import { useEffect, useRef, useState } from "react"; import styled from "@emotion/styled"; -import { FlowNode, ToolData } from "@wso2-enterprise/ballerina-core"; +import { FlowNode, ToolData, BINodeTemplateResponse } from "@wso2-enterprise/ballerina-core"; import { useRpcContext } from "@wso2-enterprise/ballerina-rpc-client"; import { ActionButtons, Button, Codicon, ThemeColors, Dropdown } from "@wso2-enterprise/ui-toolkit"; import { RelativeLoader } from "../../../components/RelativeLoader"; import { addMcpServerToAgentNode, updateMcpServerToAgentNode, findAgentNodeFromAgentCallNode, getAgentFilePath } from "./utils"; -import { TextField, Typography } from '@wso2-enterprise/ui-toolkit'; +import { TextField, Typography, CheckBox, CheckBoxGroup } from '@wso2-enterprise/ui-toolkit'; import { PropertyModel } from '@wso2-enterprise/ballerina-core'; import { ReadonlyField } from '../../../views/BI/ServiceDesigner/components/ReadonlyField'; +import { FormGenerator } from "../../../views/BI/Forms/FormGenerator"; +import { FormImports } from "@wso2-enterprise/ballerina-side-panel"; +import { ConfigVariable } from '@wso2-enterprise/ballerina-core'; +import { PanelContainer, Form, FormField, FormValues } from '@wso2-enterprise/ballerina-side-panel'; +import { pad } from "lodash"; +import AddConnectionWizard from "../../../views/BI/Connection/AddConnectionWizard"; const NameContainer = styled.div` display: flex; @@ -181,29 +187,6 @@ const LoadingMessage = styled.div` gap: 8px; `; -const CustomCheckbox = styled.div<{ checked: boolean; disabled?: boolean }>` - width: 16px; - height: 16px; - border: 2px solid ${props => props.checked ? ThemeColors.PRIMARY : ThemeColors.OUTLINE_VARIANT}; - border-radius: 2px; - background-color: ${props => props.checked ? ThemeColors.PRIMARY : 'transparent'}; - display: flex; - align-items: center; - justify-content: center; - cursor: ${props => props.disabled ? 'not-allowed' : 'pointer'}; - opacity: ${props => props.disabled ? 0.5 : 1}; - transition: all 0.2s ease; - position: relative; - - &:hover { - border-color: ${props => props.disabled ? ThemeColors.OUTLINE_VARIANT : ThemeColors.PRIMARY}; - background-color: ${props => { - if (props.disabled) return props.checked ? ThemeColors.PRIMARY : 'transparent'; - return props.checked ? ThemeColors.PRIMARY : ThemeColors.PRIMARY_CONTAINER; - }}; - } -`; - const CheckboxIcon = styled.div<{ visible: boolean }>` width: 10px; height: 10px; @@ -248,8 +231,12 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { const [existingTools, setExistingTools] = useState([]); const [toolsStringList, setToolsStringList] = useState(""); const [selectedTool, setSelectedTool] = useState(null); + const [urlError, setUrlError] = useState(""); + const [nameError, setNameError] = useState(""); + const [mcpToolResponse, setMcpToolResponse] = useState(null); const [serviceUrl, setServiceUrl] = useState(""); + const [errorInputs, setErrorInputs] = useState(false); const [configs, setConfigs] = useState({}); const [toolSelection, setToolSelection] = useState("All"); const [name, setName] = useState(props.name || ""); @@ -292,7 +279,24 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { const fetchAgentNode = async () => { const agentNode = await findAgentNodeFromAgentCallNode(agentCallNode, rpcClient); setAgentNode(agentNode); - + + const mcpToolResponse = await rpcClient + .getBIDiagramRpcClient() + .getNodeTemplate({ + position: { line: 0, offset: 0 }, + filePath: agentFilePath.current, + id: { + node: "NEW_CONNECTION", + org: "ballerina", + module: "mcp", + "packageName": "mcp", + version: "0.4.2", + symbol: "init", + object: "Client" + } + }); + setMcpToolResponse(mcpToolResponse.flowNode) + console.log(">>> response getSourceCode with template ", { mcpToolResponse }); if (agentNode?.properties?.tools?.value) { const toolsString = agentNode.properties.tools.value.toString(); const mcpToolkits = extractMcpToolkits(toolsString); @@ -430,6 +434,88 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { setSelectedMcpTools(newSelectedTools); }; + const validateUrl = (url: string): string => { + if (!url.trim()) { + return ''; + } + + try { + const urlObj = new URL(url); + // Check if protocol is http or https + if (!['http:', 'https:'].includes(urlObj.protocol)) { + return 'URL must use HTTP or HTTPS protocol'; + } + return ''; + } catch (error) { + return 'Please enter a valid URL (e.g., http://example.com)'; + } + }; + + const handleServiceUrlChange = (e: React.ChangeEvent) => { + const newUrl = e.target.value; + setServiceUrl(newUrl); + const errorMessage = validateUrl(newUrl); + if (errorMessage == '') { + setErrorInputs(false); + setUrlError(''); + } else { + setErrorInputs(true); + setUrlError(errorMessage); + } + }; + + const handleNameChange = (e: React.ChangeEvent) => { + const newName = e.target.value; + setName(newName); + const errorMessage = validateName(newName); + if (errorMessage == '') { + setErrorInputs(false); + setNameError(''); + } else { + setErrorInputs(true); + setNameError(errorMessage); + } + }; + + const validateName = (name: string): string => { + if (!name.trim()) { + return ''; + } + + // Extract existing MCP toolkit names from the tools string + const existingMcpToolkits = extractMcpToolkitNames(toolsStringList); + + // Check if the name already exists (case-insensitive comparison) + const nameExists = existingMcpToolkits.some( + existingName => existingName.toLowerCase() === name.trim().toLowerCase() + ); + + if (nameExists && !editMode) { + return 'An MCP server with this name already exists'; + } + + // In edit mode, allow the current name but not other existing names + if (nameExists && editMode && props.name && name.trim().toLowerCase() !== props.name.toLowerCase()) { + return 'An MCP server with this name already exists'; + } + + return ''; + }; + + const extractMcpToolkitNames = (toolsString: string): string[] => { + const names: string[] = []; + + // Regex to match McpToolKit with name in info object + const mcpToolkitPattern = /McpToolKit\([^}]*info\s*=\s*\{[^}]*name:\s*"([^"]+)"/g; + let match; + + while ((match = mcpToolkitPattern.exec(toolsString)) !== null) { + names.push(match[1]); + } + + return names; + }; + const handleSelectAllTools = () => { if (selectedMcpTools.size === mcpTools.length) { // Deselect all @@ -558,13 +644,13 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { {mcpTools.map((tool) => ( - !loadingMcpTools && handleToolSelectionChange(tool.name, !selectedMcpTools.has(tool.name))} + onChange={() => !loadingMcpTools && handleToolSelectionChange(tool.name, !selectedMcpTools.has(tool.name))} > - - +
{tool.name}
{tool.description && ( @@ -586,9 +672,15 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { ); }; + console.log(">>> agentNode", agentCallNode); + + const DropdownContainer = styled.div` + width: 100%; +`; return ( + {loading && ( @@ -600,15 +692,15 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { {editMode ? "Edit MCP server configuration." : "Add an MCP server to provide tools to the Agent."} - + setServiceUrl(e.target.value)} + onChange={handleServiceUrlChange} placeholder="Enter MCP server URL" value={serviceUrl} /> @@ -616,9 +708,8 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { setConfigs(e.target.value)} @@ -628,29 +719,40 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { - setToolSelection(value)} + 1 ? `MCP Server 0${mcpToolkitCount}` : "MCP Server"} /> + + + setToolSelection(value)} + /> + + {renderToolsSelection()} -
{editMode ? ( // Edit mode: Show only Save button {savingForm ? "Saving..." : "Save"} @@ -662,7 +764,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { {savingForm ? "Adding..." : "Add to Agent"} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts index 44e7f8cef9d..c862dbd158f 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts @@ -153,7 +153,7 @@ export const updateMcpServerToAgentNode = async ( // Fixed regex pattern that matches only the specific McpToolKit with the target name // Uses negated character classes to prevent crossing boundaries const pattern = new RegExp( - `check new ai:McpToolKit\\([^}]*name:\\s*"${toolConfig.name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}"[^}]*\\}\\)`, + `check new ai:McpToolKit\\([^}]*name:\\s*"${originalToolName}"[^}]*\\}\\)`, 'g' ); @@ -197,7 +197,7 @@ export const addMcpServerToAgentNode = async (agentNode: FlowNode, toolConfig: M let toolsValue = updatedAgentNode.properties.tools.value; // remove new lines and normalize whitespace from the tools value - console.log(">>> qwe tools", toolConfig); + console.log(">>> add tools", toolConfig); const toolsString = toolConfig.selectedTools.map(tool => `"${tool}"`).join(", "); let toolString = `check new ai:McpToolKit("${toolConfig.serviceUrl}", permittedTools = (), info = {name: "${toolConfig.name}", version: ""})`; if (toolConfig.toolSelection.includes("Selected")) { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index eb0e2a9f53b..173cc12d0a8 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -1060,13 +1060,14 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { const agentNode = await findAgentNodeFromAgentCallNode(node, rpcClient); const updatedAgentNode = await removeToolFromAgentNode(agentNode, tool.name); const agentFilePath = await getAgentFilePath(rpcClient); - if (tool.name.includes("MCP Server")) { + const toolType = tool.type ?? ""; + if (toolType.includes("MCP Server")) { const updateAgentNode = removeMcpServerFromAgentNode(updatedAgentNode, tool.name); - const agentResponse = await rpcClient .getBIDiagramRpcClient() .getSourceCode({ filePath: agentFilePath, flowNode: updateAgentNode }); onSave?.(); + console.log(">>> response getSourceCode after tool deletion", { agentResponse }); } else { const agentResponse = await rpcClient .getBIDiagramRpcClient() diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/McpFormGenerator/index.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/McpFormGenerator/index.ts new file mode 100644 index 00000000000..e69de29bb2d diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FunctionForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FunctionForm/index.tsx index 1e636084169..2b851074c47 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FunctionForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FunctionForm/index.tsx @@ -92,7 +92,6 @@ export function FunctionForm(props: FunctionFormProps) { setTitleSubtitle('Build reusable custom flows'); setFormSubtitle('Define a flow that can be used within your integration'); } - if (functionName) { getExistingFunctionNode(); } else { diff --git a/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx b/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx index 5081801e2cf..cdc9b23256d 100644 --- a/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx @@ -364,8 +364,8 @@ export function AgentCallNodeWidget(props: AgentCallNodeWidgetProps) { const onToolClick = (tool: ToolData) => { console.log(">>> on Tool Click", tool); - if (tool.name.includes("MCP Server")) { - tool.type = "MCP Server"; + const toolType = tool.type ?? ""; + if (toolType.includes("MCP Server")) { agentNode?.onSelectMcpToolkit && agentNode.onSelectMcpToolkit(tool, model.node); setAnchorEl(null); } else { @@ -895,7 +895,7 @@ export function AgentCallNodeWidget(props: AgentCallNodeWidgetProps) { } `} > - Add new tool + Add new tool / MCP server - Add new tool + Add new tool / MCP server
From 1cc67c0fa8b389f4cc4811eb88bc3d0233bc31c8 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Thu, 3 Jul 2025 10:39:17 +0530 Subject: [PATCH 019/349] Fix paths of the imports --- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index c6169e9bd2f..af6a2c763f0 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -9,20 +9,12 @@ import { useEffect, useRef, useState } from "react"; import styled from "@emotion/styled"; -import { FlowNode, ToolData, BINodeTemplateResponse } from "@wso2-enterprise/ballerina-core"; -import { useRpcContext } from "@wso2-enterprise/ballerina-rpc-client"; -import { ActionButtons, Button, Codicon, ThemeColors, Dropdown } from "@wso2-enterprise/ui-toolkit"; +import { FlowNode } from "@wso2/ballerina-core"; +import { useRpcContext } from "@wso2/ballerina-rpc-client"; +import { ActionButtons, Button, Codicon, ThemeColors, Dropdown } from "@wso2/ui-toolkit"; import { RelativeLoader } from "../../../components/RelativeLoader"; import { addMcpServerToAgentNode, updateMcpServerToAgentNode, findAgentNodeFromAgentCallNode, getAgentFilePath } from "./utils"; -import { TextField, Typography, CheckBox, CheckBoxGroup } from '@wso2-enterprise/ui-toolkit'; -import { PropertyModel } from '@wso2-enterprise/ballerina-core'; -import { ReadonlyField } from '../../../views/BI/ServiceDesigner/components/ReadonlyField'; -import { FormGenerator } from "../../../views/BI/Forms/FormGenerator"; -import { FormImports } from "@wso2-enterprise/ballerina-side-panel"; -import { ConfigVariable } from '@wso2-enterprise/ballerina-core'; -import { PanelContainer, Form, FormField, FormValues } from '@wso2-enterprise/ballerina-side-panel'; -import { pad } from "lodash"; -import AddConnectionWizard from "../../../views/BI/Connection/AddConnectionWizard"; +import { TextField, CheckBox } from '@wso2/ui-toolkit'; const NameContainer = styled.div` display: flex; From 69550a44e6ce0332c8e4f954cbdf83bfa898be24 Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Mon, 16 Jun 2025 11:42:45 +0530 Subject: [PATCH 020/349] Migrate Copilot-Code prompt creation to FE Migrate AI test generator to FE Migrate datamapper Migrate file based context apis Make urls configurable Migrate ask command Initial Async streaming implementation Migrate Code generator to async implementation Migrate the repair flow Migrate the test generator to async mdoel Migrate features to only use claude Migrate Healthcare features to notifications model Minor fixes Switch library store from hosted to LS Add code gen test Fix conflict issues --- common/config/rush/pnpm-lock.yaml | 207 +++- .../src/rpc-types/ai-panel/index.ts | 9 +- .../src/rpc-types/ai-panel/interfaces.ts | 88 ++ .../src/rpc-types/ai-panel/rpc-type.ts | 9 +- .../ballerina-core/src/state-machine-types.ts | 46 + .../ballerina-extension/package.json | 5 +- .../src/core/extended-language-client.ts | 21 +- .../src/features/ai/completions.ts | 4 + .../src/features/ai/service/ask/ask.ts | 295 ++++++ .../src/features/ai/service/code/code.ts | 375 +++++++ .../src/features/ai/service/connection.ts | 29 + .../ai/service/datamapper/context_api.ts | 542 ++++++++++ .../ai/service/datamapper/datamapper.ts | 972 ++++++++++++++++++ .../features/ai/service/datamapper/prompt.ts | 334 ++++++ .../features/ai/service/datamapper/schema.ts | 40 + .../features/ai/service/datamapper/types.ts | 146 +++ .../src/features/ai/service/event.ts | 39 + .../ai/service/healthcare/healthcare.ts | 334 ++++++ .../src/features/ai/service/libs/funcs.ts | 326 ++++++ .../ai/service/libs/funcs_inter_types.ts | 136 +++ .../src/features/ai/service/libs/langlibs.ts | 4 + .../src/features/ai/service/libs/libs.ts | 107 ++ .../features/ai/service/libs/libs_types.ts | 206 ++++ .../features/ai/service/openapi/openapi.ts | 102 ++ .../ai/service/test/function_tests.ts | 84 ++ .../src/features/ai/service/test/prompts.ts | 770 ++++++++++++++ .../src/features/ai/service/test/test.ts | 109 ++ .../src/features/ai/service/test/test_plan.ts | 342 ++++++ .../src/features/ai/service/test/utils.ts | 121 +++ .../src/features/ai/service/types.ts | 105 ++ .../src/features/ai/service/utils.ts | 185 ++++ .../src/features/ai/testGenerator.ts | 34 +- .../src/features/ai/utils.ts | 3 + .../src/rpc-managers/ai-panel/rpc-handler.ts | 56 +- .../src/rpc-managers/ai-panel/rpc-manager.ts | 173 ++-- .../src/rpc-managers/ai-panel/utils.ts | 170 +-- .../test/ai/datamapper/datamapper.test.ts | 2 +- .../test/ai/evals/code/code.test.ts | 234 +++++ .../ballerina-extension/test/data/string.bal | 2 +- .../ballerina-extension/test/runTest.ts | 19 +- .../src/BallerinaRpcClient.ts | 8 +- .../src/rpc-clients/ai-panel/rpc-client.ts | 42 + .../ballerina-visualizer/package.json | 4 +- .../views/AIPanel/components/AIChat/index.tsx | 869 ++-------------- .../views/AIPanel/features/testGenerator.ts | 25 - .../src/views/BI/Overview/index.tsx | 146 --- 46 files changed, 6703 insertions(+), 1176 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/prompt.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/schema.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/types.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs_inter_types.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/langlibs.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs_types.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/test/function_tests.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/test/prompts.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test_plan.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/test/utils.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/types.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts delete mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/features/testGenerator.ts diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index be560422d62..db982e67309 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -127,6 +127,9 @@ importers: ../../workspaces/ballerina/ballerina-extension: dependencies: + '@ai-sdk/anthropic': + specifier: ^1.2.12 + version: 1.2.12(zod@3.25.76) '@types/lodash': specifier: ^4.14.200 version: 4.17.17 @@ -151,6 +154,9 @@ importers: '@wso2/wso2-platform-core': specifier: workspace:* version: link:../../wso2-platform/wso2-platform-core + ai: + specifier: ^4.3.16 + version: 4.3.17(react@19.1.0)(zod@3.25.76) cors-anywhere: specifier: ^0.4.4 version: 0.4.4 @@ -232,6 +238,9 @@ importers: xstate: specifier: ^4.38.3 version: 4.38.3 + zod: + specifier: ^3.25.74 + version: 3.25.76 devDependencies: '@sentry/webpack-plugin': specifier: ^1.20.1 @@ -816,6 +825,9 @@ importers: specifier: ~1.6.1 version: 1.6.1 devDependencies: + '@ai-sdk/openai': + specifier: ^1.3.22 + version: 1.3.23(zod@3.25.76) '@types/lodash.debounce': specifier: ^4.0.6 version: 4.0.9 @@ -846,6 +858,9 @@ importers: '@typescript-eslint/parser': specifier: ^8.32.1 version: 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + ai: + specifier: ^4.3.16 + version: 4.3.17(react@18.2.0)(zod@3.25.76) buffer: specifier: ^6.0.3 version: 6.0.3 @@ -4218,6 +4233,44 @@ packages: '@adobe/css-tools@4.4.3': resolution: {integrity: sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==} + '@ai-sdk/anthropic@1.2.12': + resolution: {integrity: sha512-YSzjlko7JvuiyQFmI9RN1tNZdEiZxc+6xld/0tq/VkJaHpEzGAb1yiNxxvmYVcjvfu/PcvCxAAYXmTYQQ63IHQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/openai@1.3.23': + resolution: {integrity: sha512-86U7rFp8yacUAOE/Jz8WbGcwMCqWvjK33wk5DXkfnAOEn3mx2r7tNSJdjukQFZbAK97VMXGPPHxF+aEARDXRXQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/provider-utils@2.2.8': + resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + + '@ai-sdk/provider@1.1.3': + resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==} + engines: {node: '>=18'} + + '@ai-sdk/react@1.2.12': + resolution: {integrity: sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.23.8 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/ui-utils@1.2.11': + resolution: {integrity: sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -6251,6 +6304,10 @@ packages: resolution: {integrity: sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==} engines: {node: '>=8.0'} + '@opentelemetry/api@1.9.0': + 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==} engines: {node: '>= 10.0.0'} @@ -8975,6 +9032,9 @@ packages: '@types/detect-port@1.3.5': resolution: {integrity: sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==} + '@types/diff-match-patch@1.0.36': + resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} + '@types/doctrine@0.0.3': resolution: {integrity: sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==} @@ -10163,6 +10223,16 @@ packages: resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} engines: {node: '>=12'} + ai@4.3.17: + resolution: {integrity: sha512-uWqIQ94Nb1GTYtYElGHegJMOzv3r2mCKNFlKrqkft9xrfvIahTI5OdcnD5U9612RFGuUNGmSDTO1/YRNFXobaQ==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.23.8 + peerDependenciesMeta: + react: + optional: true + airbnb-js-shims@2.2.1: resolution: {integrity: sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ==} @@ -12620,6 +12690,9 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + diff-match-patch@1.0.5: + resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + diff-sequences@25.2.6: resolution: {integrity: sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==} engines: {node: '>= 8.3'} @@ -16109,6 +16182,11 @@ packages: jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + jsondiffpatch@0.6.0: + resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + jsonfile@2.4.0: resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} @@ -19929,6 +20007,9 @@ packages: secure-compare@3.0.1: resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} @@ -20830,6 +20911,11 @@ packages: '@swc/core': ^1.2.147 webpack: '>=2' + swr@2.3.4: + resolution: {integrity: sha512-bYd2lrhc+VarcpkgWclcUi92wYCpOgMws9Sd1hG1ntAu0NEy+14CbotuFjshBU2kt9rYj9TSmDcybpxpeTU1fg==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -21010,6 +21096,10 @@ packages: throat@5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} + through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} @@ -22878,6 +22968,9 @@ packages: zod@3.25.67: resolution: {integrity: sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zustand@4.5.7: resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==} engines: {node: '>=12.7.0'} @@ -22921,6 +23014,56 @@ snapshots: '@adobe/css-tools@4.4.3': {} + '@ai-sdk/anthropic@1.2.12(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/openai@1.3.23(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + zod: 3.25.76 + + '@ai-sdk/provider-utils@2.2.8(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 1.1.3 + nanoid: 3.3.11 + secure-json-parse: 2.7.0 + zod: 3.25.76 + + '@ai-sdk/provider@1.1.3': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/react@1.2.12(react@18.2.0)(zod@3.25.76)': + dependencies: + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) + react: 18.2.0 + swr: 2.3.4(react@18.2.0) + throttleit: 2.1.0 + optionalDependencies: + zod: 3.25.76 + + '@ai-sdk/react@1.2.12(react@19.1.0)(zod@3.25.76)': + dependencies: + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) + react: 19.1.0 + swr: 2.3.4(react@19.1.0) + throttleit: 2.1.0 + optionalDependencies: + zod: 3.25.76 + + '@ai-sdk/ui-utils@1.2.11(zod@3.25.76)': + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + zod: 3.25.76 + zod-to-json-schema: 3.24.5(zod@3.25.76) + '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': @@ -25792,8 +25935,8 @@ snapshots: express-rate-limit: 7.5.0(express@5.1.0) pkce-challenge: 5.0.0 raw-body: 3.0.0 - zod: 3.25.67 - zod-to-json-schema: 3.24.5(zod@3.25.67) + zod: 3.25.76 + zod-to-json-schema: 3.24.5(zod@3.25.76) transitivePeerDependencies: - supports-color @@ -25913,6 +26056,8 @@ snapshots: '@oozcitak/util@8.3.8': {} + '@opentelemetry/api@1.9.0': {} + '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -32766,6 +32911,8 @@ snapshots: '@types/detect-port@1.3.5': {} + '@types/diff-match-patch@1.0.36': {} + '@types/doctrine@0.0.3': {} '@types/doctrine@0.0.9': {} @@ -34440,6 +34587,30 @@ snapshots: clean-stack: 4.2.0 indent-string: 5.0.0 + ai@4.3.17(react@18.2.0)(zod@3.25.76): + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + '@ai-sdk/react': 1.2.12(react@18.2.0)(zod@3.25.76) + '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) + '@opentelemetry/api': 1.9.0 + jsondiffpatch: 0.6.0 + zod: 3.25.76 + optionalDependencies: + react: 18.2.0 + + ai@4.3.17(react@19.1.0)(zod@3.25.76): + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) + '@ai-sdk/react': 1.2.12(react@19.1.0)(zod@3.25.76) + '@ai-sdk/ui-utils': 1.2.11(zod@3.25.76) + '@opentelemetry/api': 1.9.0 + jsondiffpatch: 0.6.0 + zod: 3.25.76 + optionalDependencies: + react: 19.1.0 + airbnb-js-shims@2.2.1: dependencies: array-includes: 3.1.9 @@ -37680,6 +37851,8 @@ snapshots: didyoumean@1.2.2: {} + diff-match-patch@1.0.5: {} + diff-sequences@25.2.6: {} diff-sequences@29.6.3: {} @@ -38601,7 +38774,7 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - zod: 3.25.67 + zod: 3.25.76 optionalDependencies: jiti: 2.4.2 transitivePeerDependencies: @@ -42817,6 +42990,12 @@ snapshots: jsonc-parser@3.3.1: {} + jsondiffpatch@0.6.0: + dependencies: + '@types/diff-match-patch': 1.0.36 + chalk: 5.4.1 + diff-match-patch: 1.0.5 + jsonfile@2.4.0: optionalDependencies: graceful-fs: 4.2.11 @@ -47720,6 +47899,8 @@ snapshots: secure-compare@3.0.1: {} + secure-json-parse@2.7.0: {} + select-hose@2.0.0: {} selenium-webdriver@4.33.0: @@ -48959,6 +49140,18 @@ snapshots: '@swc/counter': 0.1.3 webpack: 5.99.9(webpack-cli@4.10.0) + swr@2.3.4(react@18.2.0): + dependencies: + dequal: 2.0.3 + react: 18.2.0 + use-sync-external-store: 1.5.0(react@18.2.0) + + swr@2.3.4(react@19.1.0): + dependencies: + dequal: 2.0.3 + react: 19.1.0 + use-sync-external-store: 1.5.0(react@19.1.0) + symbol-tree@3.2.4: {} symbol.prototype.description@1.0.7: @@ -49289,6 +49482,8 @@ snapshots: throat@5.0.0: {} + throttleit@2.1.0: {} + through2@2.0.5: dependencies: readable-stream: 2.3.8 @@ -51975,12 +52170,14 @@ snapshots: zenscroll@4.0.2: {} - zod-to-json-schema@3.24.5(zod@3.25.67): + zod-to-json-schema@3.24.5(zod@3.25.76): dependencies: - zod: 3.25.67 + zod: 3.25.76 zod@3.25.67: {} + zod@3.25.76: {} + zustand@4.5.7(@types/react@18.2.0)(react@18.2.0): dependencies: use-sync-external-store: 1.5.0(react@18.2.0) 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 86b2f58a016..b067305a519 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,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { AddToProjectRequest, GetFromFileRequest, DeleteFromProjectRequest, GenerateMappingsRequest, GenerateMappingsResponse, NotifyAIMappingsRequest, ProjectSource, ProjectDiagnostics, GenerateMappingsFromRecordRequest, GenerateMappingFromRecordResponse, PostProcessRequest, PostProcessResponse, GenerateTypesFromRecordRequest, GenerateTypesFromRecordResponse, FetchDataRequest, FetchDataResponse, TestGenerationRequest, TestGenerationResponse, TestGenerationMentions, AIChatSummary, DeveloperDocument, RequirementSpecification, LLMDiagnostics, GetModuleDirParams, AIPanelPrompt, AIMachineSnapshot, SubmitFeedbackRequest } from "./interfaces"; +import { AddToProjectRequest, GetFromFileRequest, DeleteFromProjectRequest, GenerateMappingsRequest, GenerateMappingsResponse, NotifyAIMappingsRequest, ProjectSource, ProjectDiagnostics, GenerateMappingsFromRecordRequest, GenerateMappingFromRecordResponse, PostProcessRequest, PostProcessResponse, GenerateTypesFromRecordRequest, GenerateTypesFromRecordResponse, FetchDataRequest, FetchDataResponse, TestGenerationRequest, TestGenerationResponse, TestGenerationMentions, AIChatSummary, DeveloperDocument, RequirementSpecification, LLMDiagnostics, GetModuleDirParams, AIPanelPrompt, AIMachineSnapshot, SubmitFeedbackRequest, RelevantLibrariesAndFunctionsRequest, GenerateOpenAPIRequest, GenerateCodeRequest, TestPlanGenerationRequest, TestGeneratorIntermediaryState, RepairParams, RelevantLibrariesAndFunctionsResponse } from "./interfaces"; export interface AIPanelAPI { // ================================== @@ -71,4 +71,11 @@ export interface AIPanelAPI { getModuleDirectory:(params: GetModuleDirParams) => Promise; getContentFromFile: (params: GetFromFileRequest) => Promise; 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; } 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 ea64fb0800c..6d9349898e0 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 @@ -152,10 +152,23 @@ export interface TestGenerationResponse { 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 DataMappingRecord { type: string; isArray: boolean; @@ -265,3 +278,78 @@ export interface FeedbackMessage { content: string; role : string; } + +export interface RelevantLibrariesAndFunctionsRequest { + query: string; +} + +export interface RelevantLibrariesAndFunctionsResponse { + libraries: any[]; +} + +export interface ChatEntry { + actor: string; + message: string; + isCodeGeneration?: boolean; +} + +export interface GenerateOpenAPIRequest { + query: string; + chatHistory: ChatEntry[]; +} + +export interface ChatEntry { + actor: string; + message: string; + isCodeGeneration?: boolean; +} + +export interface FileAttatchment { + fileName: string; + content: string; +} +export interface GenerateCodeRequest { + usecase: string; + chatHistory: ChatEntry[]; + operationType: string; + fileAttachmentContents: FileAttatchment[]; +} + + +export interface SourceFiles { + filePath: string; + content: string; +} + +export interface RepairParams { + previousMessages: any[]; + assistantResponse: string; + diagnostics: DiagnosticEntry[]; +} + +export interface RepairResponse { + repairResponse: string; + diagnostics: DiagnosticEntry[]; +} + +export type LibraryMode = "CORE" | "HEALTHCARE"; + +export interface CopilotAllLibrariesRequest { + mode: LibraryMode; +} +export interface MinifiedLibrary { + name: string; + description: string; +} +export interface CopilotCompactLibrariesResponse { + libraries: MinifiedLibrary[]; +} + +export interface CopilotFilterLibrariesRequest { + libNames: string[]; + mode: LibraryMode; +} + +export interface CopilotFilterLibrariesResponse { + libraries: any[]; +} 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 1f05d25f8c1..4722ecaa32a 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 @@ -15,7 +15,7 @@ * specific language governing permissions and limitations * under the License. */ -import { AddToProjectRequest, GetFromFileRequest, DeleteFromProjectRequest, GenerateMappingsRequest, GenerateMappingsResponse, NotifyAIMappingsRequest, ProjectSource, ProjectDiagnostics, GenerateMappingsFromRecordRequest, GenerateMappingFromRecordResponse, PostProcessRequest, PostProcessResponse, GenerateTypesFromRecordRequest, GenerateTypesFromRecordResponse, FetchDataRequest, FetchDataResponse, TestGenerationRequest, TestGenerationResponse, TestGenerationMentions, AIChatSummary, DeveloperDocument, RequirementSpecification, LLMDiagnostics, GetModuleDirParams, AIPanelPrompt, AIMachineSnapshot, SubmitFeedbackRequest } from "./interfaces"; +import { AddToProjectRequest, GetFromFileRequest, DeleteFromProjectRequest, GenerateMappingsRequest, GenerateMappingsResponse, NotifyAIMappingsRequest, ProjectSource, ProjectDiagnostics, GenerateMappingsFromRecordRequest, GenerateMappingFromRecordResponse, PostProcessRequest, PostProcessResponse, GenerateTypesFromRecordRequest, GenerateTypesFromRecordResponse, FetchDataRequest, FetchDataResponse, TestGenerationRequest, TestGenerationResponse, TestGenerationMentions, AIChatSummary, DeveloperDocument, RequirementSpecification, LLMDiagnostics, GetModuleDirParams, AIPanelPrompt, AIMachineSnapshot, SubmitFeedbackRequest, RelevantLibrariesAndFunctionsRequest, RelevantLibrariesAndFunctionsResponse, GenerateOpenAPIRequest, GenerateCodeRequest, RepairParams, TestPlanGenerationRequest, TestGeneratorIntermediaryState } from "./interfaces"; import { RequestType, NotificationType } from "vscode-messenger-common"; const _preFix = "ai-panel"; @@ -67,3 +67,10 @@ export const createTestDirecoryIfNotExists: NotificationType = { method: export const getModuleDirectory: RequestType = { method: `${_preFix}/getModuleDirectory` }; export const getContentFromFile: RequestType = { method: `${_preFix}/getContentFromFile` }; 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` }; diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index 74d743380eb..69638f959f9 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -21,6 +21,7 @@ import { NodePosition, STNode } from "@wso2/syntax-tree"; import { LinePosition } from "./interfaces/common"; import { Type } from "./interfaces/extended-lang-client"; import { DIRECTORY_MAP, ProjectStructureArtifactResponse, ProjectStructureResponse } from "./interfaces/bi"; +import { DiagnosticEntry, TestGeneratorIntermediaryState } from "./rpc-types/ai-panel/interfaces"; export type MachineStateValue = | 'initialize' @@ -160,8 +161,53 @@ export interface DownloadProgress { step?: number; } +export type ChatNotify = + | ChatStart + | IntermidaryState + | ChatContent + | CodeDiagnostics + | CodeMessages + | ChatStop + | ChatError; + +export interface ChatStart { + type : "start"; +} + +export interface IntermidaryState { + type : "intermediary_state"; + state : TestGeneratorIntermediaryState; // Smells off. Must revist later. +} + +//TODO: Maybe rename content_block to content_append? +export interface ChatContent { + type : "content_block" | "content_replace"; + content: string; +} + +export interface CodeDiagnostics { + type : "diagnostics"; + diagnostics: DiagnosticEntry[]; +} + +//TODO: I'm not sure about messages, maybe revisit later. +export interface CodeMessages { + type : "messages"; + messages: any[]; +} + +export interface ChatStop { + type : "stop"; +} + +export interface ChatError { + type : "error"; + content: string; +} + export const stateChanged: NotificationType = { method: 'stateChanged' }; export const onDownloadProgress: NotificationType = { method: 'onDownloadProgress' }; +export const onChatNotify: NotificationType = { method: 'onChatNotify' }; export const projectContentUpdated: NotificationType = { method: 'projectContentUpdated' }; export const getVisualizerLocation: RequestType = { method: 'getVisualizerLocation' }; export const webviewReady: NotificationType = { method: `webviewReady` }; diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 5bf5a8d66b9..1401408a45a 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -1096,6 +1096,8 @@ }, "dependencies": { "@types/lodash": "^4.14.200", + "@ai-sdk/anthropic": "^1.2.12", + "ai": "^4.3.16", "@vscode/test-electron": "^2.4.0", "@vscode/vsce": "^2.22.0", "@wso2/ballerina-core": "workspace:*", @@ -1129,7 +1131,8 @@ "xstate": "^4.38.3", "uuid": "^11.1.0", "jwt-decode": "^4.0.0", - "dotenv": "~16.5.0" + "dotenv": "~16.5.0", + "zod": "^3.25.74" }, "devDependencies": { "@sentry/webpack-plugin": "^1.20.1", 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 bf8e7b29408..8ac3a62c2b2 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts @@ -219,14 +219,18 @@ import { ArtifactsNotification, OpenConfigTomlRequest, UpdateConfigVariableRequestV2, - GetConfigVariableNodeTemplateRequest, UpdateConfigVariableResponseV2, DeleteConfigVariableRequestV2, DeleteConfigVariableResponseV2, ResourceReturnTypesRequest, ResourceReturnTypesResponse, JsonToTypeRequest, - JsonToTypeResponse + JsonToTypeResponse, + CopilotCompactLibrariesResponse, + CopilotAllLibrariesRequest, + CopilotFilterLibrariesResponse, + CopilotFilterLibrariesRequest, + GetConfigVariableNodeTemplateRequest } from "@wso2/ballerina-core"; import { BallerinaExtension } from "./index"; import { debug, handlePullModuleProgress } from "../utils"; @@ -376,7 +380,9 @@ enum EXTENDED_APIS { OPEN_API_GENERATED_MODULES = 'openAPIService/getModules', OPEN_API_CLIENT_DELETE = 'openAPIService/deleteModule', GET_ARTIFACTS = 'designModelService/artifacts', - PUBLISH_ARTIFACTS = 'designModelService/publishArtifacts' + PUBLISH_ARTIFACTS = 'designModelService/publishArtifacts', + COPILOT_ALL_LIBRARIES = 'copilotLibraryManager/getLibrariesList', + COPILOT_FILTER_LIBRARIES = 'copilotLibraryManager/getFilteredLibraries' } enum EXTENDED_APIS_ORG { @@ -1135,6 +1141,15 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest(EXTENDED_APIS.OPEN_API_CLIENT_DELETE, params); } + async getCopilotCompactLibraries(params: CopilotAllLibrariesRequest): Promise { + return this.sendRequest(EXTENDED_APIS.COPILOT_ALL_LIBRARIES, params); + } + + async getCopilotFilteredLibraries(params: CopilotFilterLibrariesRequest): Promise { + return this.sendRequest(EXTENDED_APIS.COPILOT_FILTER_LIBRARIES, params); + } + + // <------------ BI APIS END ---------------> diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/completions.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/completions.ts index 4f2ca0c824f..2fb684346aa 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/completions.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/completions.ts @@ -24,6 +24,10 @@ import { } from "./../telemetry"; import { PALETTE_COMMANDS } from "./../project/cmds/cmd-runner"; import { 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"; export function activateCopilotLoginCommand() { commands.registerCommand(PALETTE_COMMANDS.LOGIN_COPILOT, async () => { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts new file mode 100644 index 00000000000..f2ad1a322fa --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts @@ -0,0 +1,295 @@ +// 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 { generateText } from "ai"; +import { LIBS_URL } from "../../utils"; +import { selectRequiredFunctions } from "../libs/funcs"; +import { GenerationType, getSelectedLibraries } from "../libs/libs"; +import { Library, LibraryWithUrl } from "../libs/libs_types"; +import { anthropic } from "../connection"; +import { z } from 'zod'; +import { tool } from 'ai'; + +interface Document { + document: string; + metadata: { + doc_link?: string; + // filename?: string; + // [key: string]: any; + }; +} + +interface ApiDocResult { + library_link: string; + [key: string]: any; +} + +interface Tool { + name: string; + description: string; + input_schema: { + type: string; + properties: { + [key: string]: { + type: string; + description: string; + }; + }; + required: string[]; + }; +} + +interface ToolCall { + name: string; + input: { + [key: string]: any; + }; +} + +interface ResponseSchema { + content: string; + references: string[]; +} + +interface DocChunk { + page_content: string; + doc_link: string; +} + + +// Tool definitions +const tools = { + extract_learn_pages: tool({ + description: "Retrieves information about Ballerina language concepts, features, tools, and implementation details from the Ballerina Learn Pages. This includes guidance on syntax, usage, best practices, and examples for addressing various use cases.", + parameters: z.object({ + query: z.string().describe("A question or query requiring information about Ballerina language concepts, features, tools, best practices, or practical use cases related to implementing solutions using the language.") + }) + }), + extract_central_api_docs: tool({ + description: "Retrieves technical details about Ballerina libraries, modules, clients, functions, type definitions, parameters, return types, and records.", + parameters: z.object({ + query: z.string().describe("A question or query requiring information about Ballerina libraries, including clients, functions, constructors, type definitions, parameters, and return types") + }) + }) +}; + +async function extractLearnPages(query: string): Promise { + const docs: Document[] = await fetchDocumentationFromVectorStore(query); + return docs; +} + +async function fetchDocumentationFromVectorStore(query: string): Promise { + try { + const response = await fetch(`${LIBS_URL}/topK`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + query: query + }), + signal: AbortSignal.timeout(30 * 1000), + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const data = await response.json() as Document[]; + + // Transform the response to match Document interface + return data; + } catch (error) { + console.error('Error fetching from vector store:', error); + // Return empty array on error to prevent breaking the flow + return []; + } +} + +async function extractCentralApiDocs(query: string): Promise { + const selectedLibs: string[] = await getSelectedLibraries(query, GenerationType.CODE_GENERATION); + const relevantTrimmedFuncs: Library[] = await selectRequiredFunctions(query, selectedLibs, GenerationType.CODE_GENERATION); + const apiDocs: LibraryWithUrl[] = relevantTrimmedFuncs.map(lib => { + return { + ...lib, + library_link: `https://central.ballerina.io/${lib.name.replace(/'/g, '')}/` + } as LibraryWithUrl; + }); + + return apiDocs; +} + +// TODO: Consider structured outputs +export async function getAskResponse(question: string): Promise { + try { + // First, try to get tool calls from Claude + const toolCallsResponse: ToolCall[] = await getToolCallsFromClaude(question); + + let centralContext: ApiDocResult[] = []; + let documentationContext: Document[] = []; + + // Execute the tools if we got tool calls + if (toolCallsResponse && toolCallsResponse.length > 0) { + for (const toolCall of toolCallsResponse) { + if (toolCall.name === "extract_learn_pages") { + const docs = await extractLearnPages(toolCall.input.query); + documentationContext.push(...docs); + } else if (toolCall.name === "extract_central_api_docs") { + const apiDocs = await extractCentralApiDocs(toolCall.input.query); + centralContext.push(...apiDocs); + } + } + } else { + // If no tool calls, force extract_learn_pages + const docs = await extractLearnPages(question); + documentationContext.push(...docs); + } + + // Build document chunks + const docChunks: { [key: string]: DocChunk } = {}; + if (documentationContext.length > 0) { + documentationContext.forEach((doc, index) => { + const docLink = doc.metadata.doc_link || ""; + docChunks[`chunk${index + 1}`] = { + page_content: doc.document, + doc_link: docLink + }; + }); + } + + // Build system message + const systemMessage = buildLlmMessage(docChunks, documentationContext, centralContext); + + // Get final response from Claude + const finalResponse = await getFinalResponseFromClaude(systemMessage, question); + + // Extract library links + const libraryLinks: string[] = []; + if (centralContext.length > 0) { + centralContext.forEach(lib => { + libraryLinks.push(lib.library_link); + }); + } + + // Extract doc IDs and add corresponding links + const docIdPattern = /(.*?)<\/doc_id>/g; + const docIds: string[] = []; + let match; + while ((match = docIdPattern.exec(finalResponse)) !== null) { + docIds.push(match[1]); + } + + // Add documentation links for referenced chunks + docIds.forEach(id => { + if (docChunks[id] && docChunks[id].doc_link.length > 0) { + libraryLinks.push(docChunks[id].doc_link); + } + }); + + // Clean response + const filteredResponse = finalResponse.replace(/.*?<\/doc_id>/g, '').trim(); + + // Format links + const formattedLinks = libraryLinks.map(link => `<${link}>`); + + return { + content: filteredResponse, + references: formattedLinks + }; + + } catch (error) { + console.error('Error in assistantToolCall:', error); + throw new Error(`Failed to process question: ${error instanceof Error ? error.message : 'Unknown error'}`); + } +} + +async function getToolCallsFromClaude(question: string): Promise { + const { text, toolCalls } = await generateText({ + model: anthropic("claude-3-5-haiku-20241022"), + maxTokens: 8192, + tools: tools, + messages: [ + { + role: "user", + content: question + } + ], + maxSteps: 1, // Limit to one step to get tool calls only + }); + + if (toolCalls && toolCalls.length > 0) { + return toolCalls.map(toolCall => ({ + name: toolCall.toolName, + input: toolCall.args + })); + } + + return []; +} + +async function getFinalResponseFromClaude(systemMessage: string, question: string): Promise { + const { text } = await generateText({ + model: anthropic("claude-3-5-haiku-20241022"), + maxTokens: 8192, + system: systemMessage, + messages: [ + { + role: "user", + content: question + } + ] + }); + + return text; +} + +function buildLlmMessage( + docChunks: { [key: string]: DocChunk }, + documentationContext: Document[], + centralContext: ApiDocResult[] +): string { + const documentationSection = documentationContext.length > 0 + ? `Information from Ballerina Learn Pages: This section includes content sourced from the Ballerina Learn pages, consisting of document chunks that cover various topics. These chunks also include sample code examples that are necessary for explaining Ballerina concepts effectively. Out of the given document chunks, you must include the chunk number(eg:- chunk1,chunk2...) of all the document chunks that you used to formulate the answer within tags and include it at the end of your response. Only include one chunk number per tag. Document chunks ${JSON.stringify(docChunks)}` + : ""; + + const centralSection = centralContext.length > 0 + ? `Information from the Ballerina API Documentation: This section provides detailed information about type definitions, clients, functions, function parameters, return types, and other library-specific details essential for answering questions related to the Ballerina programming language. ${JSON.stringify(centralContext)}` + : ""; + + return `You are an AI assistant specialized in answering questions about the Ballerina programming language. Your task is to provide precise, accurate, and helpful answers based solely on the information provided below. The information provided below comes from reliable and authoritative sources on the Ballerina programming language. For every response, include your reasoning or derivation inside tags. The content within these tags should explain how you arrived at the answer. + +INFORMATION SOURCES: + +${documentationSection} + +${centralSection} + +After thoroughly reviewing the provided information sources, assign a relevancy score on a scale from 1 to 5, indicating how well the sources support answering the user's query. + +If the relevancy score is 5, provide a clear and complete answer. + +If the relevancy score is 3 or 4, clearly state that the Ballerina sources do not directly address the user's query. However, provide an answer based on the information that is available in the sources. The response should explicitly mention that the Ballerina sources do not cover the query directly, followed by a clear explanation of what related information is available in the sources. Do not attempt to infer or generate an answer that is not supported by the provided information. Only include details that are stated in the Ballerina sources and are relevant to the query. + +If the score is 1 or 2, politely decline to answer by stating that, couldn't find any information relevant to this in the Ballerina sources. + +The reasoning behind the assignment of relevancy score and the chosen response approach must be included within the tags at the beginning of the response. + +IMPORTANT INSTRUCTIONS +- The response generated must only be based on the information sources provided. +- Do not include any links in the response. + +Structure your final response so that it begins with the reasoning enclosed within tags. After the thinking section, provide the final answer outside the tags.`; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts new file mode 100644 index 00000000000..a362e420550 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -0,0 +1,375 @@ +import { CoreMessage, generateText, streamText } from "ai"; +import { anthropic } from "../connection"; +import { GenerationType, getRelevantLibrariesAndFunctions } from "../libs/libs"; +import { getReadmeQuery, populateHistory, transformProjectSource, getErrorMessage } from "../utils"; +import { getMaximizedSelectedLibs, selectRequiredFunctions, toMaximizedLibrariesFromLibJson } from "./../libs/funcs"; +import { GetFunctionResponse } from "./../libs/funcs_inter_types"; +import { LANGLIBS } from "./../libs/langlibs"; +import { Library } from "./../libs/libs_types"; +import { + ChatNotify, + DiagnosticEntry, + FileAttatchment, + GenerateCodeRequest, + onChatNotify, + PostProcessResponse, + ProjectDiagnostics, + ProjectSource, + RepairParams, + RepairResponse, + SourceFiles, +} from "@wso2/ballerina-core"; +import { getProjectSource, postProcess } from "../../../../rpc-managers/ai-panel/rpc-manager"; +import { CopilotEventHandler, createWebviewEventHandler } from "../event"; + +// Core code generation function that emits events +export async function generateCodeCore(params: GenerateCodeRequest, eventHandler: CopilotEventHandler): Promise { + const project: ProjectSource = await getProjectSource("CODE_GENERATION"); + const packageName = project.projectName; + const sourceFiles: SourceFiles[] = transformProjectSource(project); + const prompt = getReadmeQuery(params, sourceFiles); + const relevantTrimmedFuncs: Library[] = ( + await getRelevantLibrariesAndFunctions({ query: prompt }, GenerationType.CODE_GENERATION) + ).libraries; + + const historyMessages = populateHistory(params.chatHistory); + + const allMessages: CoreMessage[] = [ + { + role: "system", + content: getSystemPromptPrefix(relevantTrimmedFuncs), + }, + { + role: "system", + content: getSystemPromptSuffix(LANGLIBS), + providerOptions: { + anthropic: { cacheControl: { type: "ephemeral" } }, + }, + }, + ...historyMessages, + { + role: "user", + content: getUserPrompt(prompt, sourceFiles, params.fileAttachmentContents, packageName), + providerOptions: { + anthropic: { cacheControl: { type: "ephemeral" } }, + }, + }, + ]; + + const { fullStream } = streamText({ + model: anthropic("claude-3-5-sonnet-20241022"), + maxTokens: 4096, + temperature: 0, + messages: allMessages, + }); + + eventHandler({ type: "start" }); + let assistantResponse: string = ""; + for await (const part of fullStream) { + switch (part.type) { + case "text-delta": { + const textPart = part.textDelta; + 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; + const postProcessedResp: PostProcessResponse = await postProcess({ + assistant_response: assistantResponse, + }); + assistantResponse = postProcessedResp.assistant_response; + let diagnostics: DiagnosticEntry[] = postProcessedResp.diagnostics.diagnostics; + + const MAX_REPAIR_ATTEMPTS = 3; + let repair_attempt = 0; + let diagnosticFixResp = assistantResponse; //TODO: Check if we need this variable + while ( + hasCodeBlocks(diagnosticFixResp) && + diagnostics.length > 0 && + repair_attempt < MAX_REPAIR_ATTEMPTS + ) { + console.log("Repair iteration: ", repair_attempt); + console.log("Diagnotsics trynna fix: ", diagnostics); + + const repairedResponse: RepairResponse = await repairCodeCore( + { + previousMessages: allMessages, + assistantResponse: diagnosticFixResp, + diagnostics: diagnostics, + }, + eventHandler + ); + diagnosticFixResp = repairedResponse.repairResponse; + diagnostics = repairedResponse.diagnostics; + repair_attempt++; + } + + eventHandler({ type: "content_replace", content: diagnosticFixResp }); + eventHandler({ type: "diagnostics", diagnostics: diagnostics }); + eventHandler({ type: "messages", messages: allMessages }); + eventHandler({ type: "stop" }); + break; + } + } + } +} + +// Main public function that uses the default event handler +export async function generateCode(params: GenerateCodeRequest): Promise { + const eventHandler = createWebviewEventHandler(); + try { + await generateCodeCore(params, eventHandler); + } catch (error) { + console.error("Error during code generation:", error); + eventHandler({ type: "error", content: getErrorMessage(error) }); + } +} + +function getSystemPromptPrefix(apidocs: Library[]) { + return `You are an expert assistant who specializes in writing Ballerina code. 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.error, 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. + +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 you are accessing fields of a record, always assign it into new variables. +- Avoid long comments in the code. +- Always use named arguments when providing values to any parameter. (eg: .get(key="value")) +_ Do not use var keyword (variable declarations, for loops ...). Use explicit types insteads. +- 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. +- For GraphQL service related queries, If the user haven't specified their own GraphQL Scehma, Write the proposed GraphQL schema for the user query right after explanation before generating the ballerina code. Use same names as the GraphQL Schema when defining record types. + +Begin your response with an explanation, then end the response with the codeblock segments(if any). +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. Do not provide any explanation after codeblocks. + +If the user hasn't provided the information, request the missing information concisely. + +Example Codeblock segment: + +\`\`\`ballerina +//code goes here +\`\`\` + +`; +} + +function getUserPrompt( + usecase: string, + existingCode: SourceFiles[], + fileUploadContents: FileAttatchment[], + packageName: string +): string { + let fileInstructions = ""; + if (fileUploadContents.length > 0) { + fileInstructions = `4. File Upload Contents. : Contents of the file which the user uploaded as addtional information for the query. + +${fileUploadContents + .map( + (file) => `File Name: ${file.fileName} +Content: ${file.content}` + ) + .join("\n")}`; + } + + return `QUERY: The query you need to answer using the provided api documentation. + +${usecase} + + +Existing Code: Users existing code. + +${stringifyExistingCode(existingCode)} + + +Current Package name: ${packageName} + +${fileInstructions} + +`; +} + +export async function triggerGeneratedCodeRepair(params: RepairParams): Promise { + console.log("Triggering code repair with params: ", params); + const eventHandler = createWebviewEventHandler(); + return await repairCodeCore(params, eventHandler); +} + +// Core repair function that emits events +export async function repairCodeCore(params: RepairParams, eventHandler: CopilotEventHandler): Promise { + try { + eventHandler({ type: "start" }); + const resp = await repairCode(params); + eventHandler({ type: "content_replace", content: resp.repairResponse }); + eventHandler({ type: "diagnostics", diagnostics: resp.diagnostics }); + eventHandler({ type: "stop" }); + return resp; + } catch (error) { + console.error("Error during code repair:", error); + eventHandler({ type: "error", content: getErrorMessage(error) }); + throw error; + } +} + +export async function repairCode(params: RepairParams): Promise { + const allMessages: CoreMessage[] = [ + ...params.previousMessages, + { + role: "assistant", + content: params.assistantResponse, + }, + { + role: "user", + content: + "Generated code returns following errors. Double-check all functions, types, record field access against the API documentation again. Fix the compiler errors and return the new response. \n Errors: \n " + + params.diagnostics.map((d) => d.message).join("\n"), + }, + ]; + + const { text } = await generateText({ + model: anthropic("claude-3-5-sonnet-20241022"), + maxTokens: 4096, + temperature: 0, + messages: allMessages, + }); + + // replace original response with new code blocks + let diagnosticFixResp = replaceCodeBlocks(params.assistantResponse, text); + const postProcessResp: PostProcessResponse = await postProcess({ + assistant_response: diagnosticFixResp, + }); + diagnosticFixResp = postProcessResp.assistant_response; + console.log("After auto repair, Diagnostics : ", postProcessResp.diagnostics.diagnostics); + + return { repairResponse: diagnosticFixResp, diagnostics: postProcessResp.diagnostics.diagnostics }; +} + +function stringifyExistingCode(existingCode: SourceFiles[], isBallerinaSourcesOnly: boolean = false): string { + let existingCodeStr = ""; + for (const file of existingCode) { + const filePath = file.filePath; + if (isBallerinaSourcesOnly && !filePath.endsWith(".bal")) { + continue; + } + + existingCodeStr = existingCodeStr + "filepath : " + filePath + "\n"; + existingCodeStr = existingCodeStr + file.content + "\n"; + } + return existingCodeStr; +} + +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/connection.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts new file mode 100644 index 00000000000..8640867d9f1 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts @@ -0,0 +1,29 @@ +import { createAnthropic } from "@ai-sdk/anthropic"; + +export const anthropic = createAnthropic({ + baseURL: "http://localhost:9090/intel/claude/v2", + apiKey: "xx", //TODO: Gives error without this. see if we can remove, +}); + + +//Components +//TODO: Move libs into lang server API. - done +//TODO: Host claude api with Auth +//TODO: OpenAI Compatible API? +//TODO: Token based throttling? + +//Auth +//TODO: send oauth header / api-key +//TODO: use apiKey if BYOK + +//Migrations +//TODO: Migrate healthcare n Natural programmming +//TODO: Abort controller +//TODO: Evals? + +// Why? +// As our 80% our customer base dont wanna use wso2 managed platform, we need to provide either self hosting capabilities or BYOK. BYOK is way easier for these customers. +// Earlier, we had opininated API for the backend, but when features evolving, maintaining that API is hard while keeping backward compatibility. ex - changing llm response format without breaking frontend. +// Agent mode, Local mcp tools needs the tools to be executed in local machine, either we'll have to go with websockets or to go with complex imlp +// As all logic is contained in ballerina-extension module, can reduce the code complexity by reducing RPC calls by more than 70%. Easier to test the full flow without relying on other variables, state management. + diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts new file mode 100644 index 00000000000..9262cb93cb7 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts @@ -0,0 +1,542 @@ +/** + * Data Mapper Context API + * + * This module provides TypeScript functions for processing files and text content + * to generate Ballerina mapping instructions, record types, and requirement analysis. + * + * Migrated from Python FastAPI service with the following changes: + * - HTTP endpoints replaced with function-based API + * - File writing removed (content returned directly) + * - DOCX support removed (not needed) + * - File representation using {fileName, content} records + * - Prompts defined as functions instead of files + * - Uses existing Claude endpoint for LLM calls + * - File type detection based on extension only (no content-type needed) + * + * Usage: + * ```typescript + * // Generate mapping instructions from text + * const result = await generateMappingInstruction({ + * text: "source data structure..." + * }); + * + * // Generate Ballerina records from image + * const result = await generateRecord({ + * file: { fileName: "schema.png", content: "base64ImageData..." } + * }); + * + * // Extract requirements from PDF + * const result = await extractRequirements({ + * file: { fileName: "requirements.pdf", content: "base64PdfData..." } + * }); + * ``` + */ + +import { generateText, CoreMessage } from "ai"; +import { anthropic } from "../connection"; + +// Types +export type FileData = { + fileName: string; + content: string; +}; + +export type ProcessType = "mapping_instruction" | "records" | "requirements"; + +export type DataMapperRequest = { + file?: FileData; + text?: string; + processType: ProcessType; + isRequirementAnalysis?: boolean; //TODO: Why is this +}; + +export type DataMapperResponse = { + fileContent: string; +}; + +export type SupportedFileExtension = "pdf" | "jpg" | "jpeg" | "png" | "txt"; + +// Maybe have better names and types? +export async function processDataMapperInput(request: DataMapperRequest): Promise { + if (request.file) { + return await processFile(request.file, request.processType, request.isRequirementAnalysis); + } else if (request.text) { + const message = await processText(request.text, request.processType); + const fileContent = request.isRequirementAnalysis + ? message + : extractBallerinaCode(message, request.processType); + return { fileContent }; + } else { + throw new Error("No file or text provided. Please provide file data or text input."); + } +} + +// Process file data +async function processFile(file: FileData, processType: ProcessType, isRequirementAnalysis: boolean = false): Promise { + let message: string; + + const extension = getFileExtension(file.fileName); + + try { + //TODO: I think we should handle supported files from one place. + if (extension === "pdf") { + message = await processPdf(file.content, processType); + } else if (extension === "jpeg" || extension === "jpg" || extension === "png") { + message = await processImage(file.content, processType, extension); + } else if (extension === "txt" || extension === "csv" || !extension) { + const txtContent = atob(file.content); + message = await processText(txtContent, processType); + } else { + throw new Error(`Unsupported file type: ${extension}`); + } + + const fileContent = isRequirementAnalysis + ? getRequirementsContent(message) + : extractBallerinaCode(message, processType); + + return { fileContent }; + } catch (error) { + throw new Error(`Error processing file: ${error instanceof Error ? error.message : String(error)}`); + } +} + +// Process PDF content +async function processPdf(base64Content: string, processType: ProcessType): Promise { + try { + return await extractionUsingClaude({ + pdfData: base64Content, + processType + }); + } catch (error) { + throw new Error(`PDF processing error: ${error instanceof Error ? error.message : String(error)}`); + } +} + +// Process image content +async function processImage(base64Content: string, processType: ProcessType, extension: string): Promise { + // Only process actual image extensions + if (extension !== "jpeg" && extension !== "jpg" && extension !== "png") { + throw new Error(`Unsupported image extension: ${extension}`); + } + + try { + return await imageExtractionUsingClaude({ + imgData: base64Content, + processType, + extension + }); + } catch (error) { + throw new Error(`Image processing error: ${error instanceof Error ? error.message : String(error)}`); + } +} + +// Process text content +async function processText(text: string, processType: ProcessType): Promise { + try { + return await textExtractionUsingClaude({ + textContent: text, + processType + }); + } catch (error) { + throw new Error(`Error processing text: ${error instanceof Error ? error.message : String(error)}`); + } +} + +// Extract Ballerina code or mapping fields from the response +function extractBallerinaCode(message: string, processType: ProcessType): string { + if (processType === "records") { + const ballerinaCodeMatch = message.match(/([\s\S]*?)<\/ballerina_code>/); + if (ballerinaCodeMatch) { + return ballerinaCodeMatch[1].trim(); + } + console.log("No Ballerina code found."); + } else { + const mappingFieldsMatch = message.match(/([\s\S]*?)<\/mapping_fields>/); + if (mappingFieldsMatch) { + return mappingFieldsMatch[1].trim(); + } + console.log("No mapping fields found."); + } + return ""; +} + +// Get requirements content from response +function getRequirementsContent(message: any): string { + if (typeof message === "string") { + return message; + } + // Handle different response structures + if (message?.content?.[0]?.text) { + return message.content[0].text; + } + if (message?.fileContent?.content?.[0]?.text) { + return message.fileContent.content[0].text; + } + return String(message); +} + +// Get file extension from filename +function getFileExtension(fileName: string): string { + const extension = fileName.toLowerCase().split('.').pop(); + return extension || ""; +} + +// Prompt generation functions +function getMappingInstructionPrompt(): string { + return `You are an AI assistant specialized in generating data field mappings for data integration and transformation tasks. +Your goal is to create a detailed mapping between input and output data fields based on the provided content. + +Important: + - Use clear and concise descriptions in the "MAPPING_TIP" field. + - Include all relevant input fields for each output field. + - Do not take any assumptions based on data types and mappings. + - Do not include any mappings you are unsure about. + - Consider all provided information, including comments and conditions. + - Final output has only Ballerina code within tags. + +Please follow these instructions carefully: + +1. Read and analyze the content thoroughly. +2. Identify all input and output fields, including their correct path names, exact data types, and any relevant attributes or descriptions in the content. +3. If it is an image, Input records appear on the left side of the image, and output records appear on the right side. +4. All subfields of nested fields or subfields should be structured hierarchically, expanding downwards recursively within their respective parent fields. This hierarchy should reflect nested relationships. +5. If it is an image, Consider only lines that connect input and output fields from left to right, including any mapping details shown in text or diagram lines. +6. Create mappings that follow a left-to-right direction from input to output records. +7. Ensure all input fields and their subfields are mapped to their corresponding output fields/subfields. +8. Include mappings for array to array fields. +9. For nested fields, focus on mapping the subfields rather than the parent nested field. +10. Document all mapping operations, data transformations, and type conversions from input field(s) to output field(s). +11. Include details about complex operations that involve multiple input fields to construct a single output field value. +12. Document any nested mappings, operations, or data transformations required for the mapping. +13. Do not map anything if you are unsure about the correct mapping. + +Before generating the final output, wrap your thought process inside tags: + +1. Analyze the content: + - List all input fields and their exact data types (e.g., 1.1 field1: SI, 1.2 field2: int ). + - List all output fields and their exact data types (e.g., 1.1 field1: SI, 1.2 field2: int ) + - Note any comments, conditions, or additional information provided + +2. Plan the mappings: + - Identify direct field mappings + - Identify fields requiring transformations or type conversions + - Identify and list complex mappings involving multiple input fields + - Note any array to array mappings + - Consider nested field mappings + +3. Identify complex transformations: + - List and describe any complex transformations or mappings + - Provide examples of how these transformations would work + +4. Review the mapping plan: + - Ensure all input fields are accounted for + - Check for any ambiguities or uncertainties + - Verify that all provided information has been considered + +After your analysis, provide the mapping in the following JSON format in tags: + +{ + "mapping_fields": { + "output_field_name": { + "MAPPING_TIP": "Describe the mapping, including any transformations or special considerations", + "INPUT_FIELDS": ["input_field_name_1", "input_field_name_2", "input_field_name_3", ...] // Add more input fields as needed + }, + // Add more output fields as needed + } +} + +Simple example for the required format: + +{ + "mapping_fields" : { + "id": { + "MAPPING_TIP": "Direct mapping from Person.id to Student.id", + "INPUT_FIELDS": ["person.id"] + }, + "name": { + "MAPPING_TIP": "Direct mapping from Person.name to Student.name", + "INPUT_FIELDS": ["person.name"] + }, + "age": { + "MAPPING_TIP": "Direct mapping from Person.age to Student.age", + "INPUT_FIELDS": ["person.age"] + }, + "weight": { + "MAPPING_TIP": "Direct mapping from Person.weight to Student.weight with type conversion from string to float", + "INPUT_FIELDS": ["person.weight"] + } + } +} + +Generate only Ballerina code with in tags based on the provided content. +`; +} + +function getRecordsPrompt(): string { + return `You are an AI assistant specializing in the Ballerina programming language. +Your task is to analyze given content and create Ballerina code for type records based on the content provided. + +IMPORTANT: + - Do not take any assumptions based on data types or records. + - Do not include any comments in the code + - Final output has only Ballerina code within tags. + - Extract as much as all possible records and fields + +Please follow these steps to create the Ballerina code: + + 1. Analyze the content: + a) If it is an image, Input records appear on the left side of the image, and output records appear on the right side. + b) All subfields of nested fields or subfields should be structured hierarchically, expanding downwards recursively within their respective parent fields. This hierarchy should reflect nested relationships. + c) Must extract all records and their all fields and their data types in the content. + d) Using and refer to all links or hyperlinks that provide additional information about records and data types in the content. + e) Quote and number specific parts of the content that mention record types and data types. + f) List all record types mentioned in the content, numbering them (e.g., 1. RecordType1, 2. RecordType2, ...). + g) For each record type, list it's all fields and their exact data types as mentioned in the content, also numbering them (e.g., 1.1 field1: SI, 1.2 field2: int, ... ). + h) Identify any nested structures and explain how they relate to the main records. + i) Summarize and use relevant comments or conditions or additional information about the records or data types in the content. + + 2. Define the record types: + Based on your analysis: + - Create a type record for each identified record with its sub-fields + - Consider all records and fields with optional and nullable feature + - Use only the exact data types you identified in step 1 for each field and record + - Apply these naming conventions: PascalCase for record names, camelCase for field names + - For nested fields, create recursive record types, stopping at simple data types + +After your analysis, provide the Ballerina code within tags. The code should include: + - Type record definitions for all identified records with its all fields + +Example output structure (generic, without specific content): + + +type RecordName1 record { + FieldDataType1 fieldName1; + FieldDataType2 fieldName2; + }; + +type RecordName2 record { + FieldDataType3 fieldName3; + RecordName1 nestedField; +}; + +type RecordName3 record { + FieldDataType4 fieldName4; + RecordName4 nestedField; +}; + + +Sample example for the required format: + +type Person record { + int? id?; + string firstName; + string? lastName; + int? age; + string country?; + College? college?; +}; + +type College record { + Course[] courses; +}; + +type Course record { + string? id?; + decimal credits?; + Address? address; +}; + +type Student record { + string id; + string firstName; + float? age; + record { + int id; + float credits?; + Address address; + }[] courses; +}; + +type A record { + Person[] person; +}; + +type B record { + Student[] student?; +}; + +type Address record { + string? city?; + string street; + string? zipcode; +}; + +Generate only Ballerina code with in tags based on the provided content.`; +} + +function getRequirementsPrompt(): string { + return `You are tasked with providing a comprehensive explanation of the content in a file. +Your goal is to thoroughly extract all the information present in the file, +including both textual content and visual elements such as diagrams and images. + +Carefully analyze all the information provided in the file content above. +This may include text, diagrams, images, and any other visual or textual elements. + +For the textual content: +1. Extract the complete content and identify the main points and key ideas presented in the text. +2. Identify and explain all important concepts, definitions, or arguments. +3. Identify any significant data, statistics, or numerical information. + +For diagrams and images: +1. Extract each visual element in detail, including its layout, components, and any labels or captions with preserving all the information as it is. +2. Extract the purpose or significance of each diagram or image in relation to the overall content. +3. Interpret any data visualizations, charts, or graphs, providing insights on the information they convey. + +Provide a comprehensive explanation of the entire file content, integrating your analysis of both the textual and visual elements. Ensure that your explanation: +1. Covers all major aspects of the content +2. Highlights relationships between different parts of the content +3. Offers insights into the overall message or purpose of the document + +Present your explanation in a clear, well-structured format. Use paragraphs to separate different topics or aspects of the content. If appropriate, use bullet points or numbered lists to organize information. + +Begin your response with an introductory paragraph that briefly outlines what the file contains and its main subject matter. End with a concluding paragraph that summarizes the key takeaways from the file content. + +No need of unnecessary greetings or any other unrelated texts needed in the begining and the end. Just give the comprehensive explanation. No additional information is needed. + +Write your comprehensive explanation as a text. +`; +} + +function getPromptForProcessType(processType: ProcessType): string { + switch (processType) { + case "mapping_instruction": + return getMappingInstructionPrompt(); + case "records": + return getRecordsPrompt(); + case "requirements": + return getRequirementsPrompt(); + default: + throw new Error(`Unsupported process type: ${processType}`); + } +} + +// Claude API integration functions +async function extractionUsingClaude({ pdfData, processType }: { pdfData: string; processType: ProcessType }): Promise { + const promptText = getPromptForProcessType(processType); + + const messages: CoreMessage[] = [ + { + role: "user", + content: [ + { + type: "file", + data: pdfData, + mimeType: "application/pdf" + }, + { + type: "text", + text: promptText + } + ] + } + ]; + + const { text } = await generateText({ + model: anthropic("claude-3-5-sonnet-20241022"), + maxTokens: 8192, + temperature: 0, + messages: messages + }); + + return text; +} + +async function imageExtractionUsingClaude({ + imgData, + processType, + extension +}: { + imgData: string; + processType: ProcessType; + extension: string; +}): Promise { + const promptText = getPromptForProcessType(processType); + + // Convert extension to proper media type + const mimeType = extension === "png" ? "image/png" : "image/jpeg"; + + const messages: CoreMessage[] = [ + { + role: "user", + content: [ + { + type: "image", + image: imgData, + mimeType: mimeType + }, + { + type: "text", + text: promptText + } + ] + } + ]; + + const { text } = await generateText({ + model: anthropic("claude-3-5-sonnet-20241022"), + maxTokens: 8192, + temperature: 0, + messages: messages + }); + + return text; +} + +async function textExtractionUsingClaude({ + textContent, + processType +}: { + textContent: string; + processType: ProcessType; +}): Promise { + const promptText = getPromptForProcessType(processType); + + const messages: CoreMessage[] = [ + { + role: "user", + content: promptText + "\n\n" + textContent + } + ]; + + const { text } = await generateText({ + model: anthropic("claude-3-5-sonnet-20241022"), + maxTokens: 8192, + temperature: 0, + messages: messages + }); + + return text; +} + +// Utility functions for specific use cases +export async function generateMappingInstruction(input: { file?: FileData; text?: string }): Promise { + return await processDataMapperInput({ + ...input, + processType: "mapping_instruction" + }); +} + +export async function generateRecord(input: { file?: FileData; text?: string }): Promise { + return await processDataMapperInput({ + ...input, + processType: "records" + }); +} + +export async function extractRequirements(input: { file?: FileData; text?: string }): Promise { + return await processDataMapperInput({ + ...input, + processType: "requirements", + isRequirementAnalysis: true + }); +} 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 new file mode 100644 index 00000000000..3efeb650f4c --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts @@ -0,0 +1,972 @@ +/** + * AI-Powered Data Mapping Generator for Ballerina + * + * This module provides intelligent data transformation mapping capabilities using AI. + * It analyzes input and output schemas to generate appropriate mapping operations. + * + * Key Features: + * - AI-powered mapping generation using Claude AI + * - Support for multiple operation types (DIRECT, LENGTH, SPLIT, etc.) + * - Comprehensive validation and error handling + * - Retry logic for robust operation + * + * Usage: + * ```typescript + * import { generateAutoMappings, createSamplePayload } from './datamapper'; + * + * const payload = createSamplePayload(); + * const response = await generateAutoMappings(payload); + * console.log(response.mappings); + * ``` + * + * Expected Response Format: + * ```json + * { + * "mappings": { + * "id": { + * "operation": "DIRECT", + * "targetType": "string", + * "parameters": ["person.id"] + * }, + * "firstName": { + * "operation": "DIRECT", + * "targetType": "string", + * "parameters": ["person.firstName"] + * } + * } + * } + * ``` + * + * Configuration: + * - Ensure the Claude endpoint is running and properly configured + * - The implementation supports various operation types defined in the operations table + * - Mapping validation ensures compatibility with supported data types + */ + +import { generateText, CoreMessage, generateObject } from "ai"; +import { getDataMappingPrompt } from "./prompt"; +import { anthropic } from "../connection"; +import { + Payload, + DatamapperResponse, + AIDataMappings, + MappingJson, + MappingRecord, + Inputs, + MappingOperation, + FieldMetadata, + MetadataField, + MetadataType, + Metadata, + ParameterMetadata, + MappingFields, + Operation, + Structure, + ChatResponse, +} from "./types"; +import { DataMappingSchema } from "./schema"; + +// ============================================================================= +// OPERATION TYPE CONSTANTS +// ============================================================================= +const DIRECT = "DIRECT"; +const LENGTH = "LENGTH"; +const SPLIT = "SPLIT"; +const ADDITION = "ADDITION"; +const SUBTRACTION = "SUBTRACTION"; +const MULTIPLICATION = "MULTIPLICATION"; +const DIVISION = "DIVISION"; +const MODULAR = "MODULAR"; +const EQUAL = "EQUAL"; +const NOTEQUAL = "NOTEQUAL"; +const LESS_THAN = "LESS_THAN"; +const LESS_THAN_OR_EQUAL = "LESS_THAN_OR_EQUAL"; +const AND = "AND"; +const OR = "OR"; +const REPLACE_ALL = "REPLACE_ALL"; +const AVERAGE = "AVERAGE"; +const MAXIMUM = "MAXIMUM"; +const MINIMUM = "MINIMUM"; +const SUMMATION = "SUMMATION"; +const ABSOLUTE = "ABSOLUTE"; + +// Parameter constants +const PARAMETER_1 = "PARAMETER_1"; +const PARAMETER_2 = "PARAMETER_2"; +const PARAMETER_3 = "PARAMETER_3"; +const NAME = "NAME"; + +// Operations table - In a real implementation, this would be loaded from JSON files +const operationsTable: Map = new Map([ + [ + DIRECT, + { + name: DIRECT, + structure: { + operation: "DIRECT", + outputType: ["int", "float", "decimal", "string", "boolean"], + inputType: ["int", "float", "decimal", "string", "boolean"], + imports: {}, + errorReturned: false, + expression: "${LHS} : ${PA_1}", + }, + }, + ], + [ + ADDITION, + { + name: ADDITION, + structure: { + operation: "ADDITION", + outputType: ["int", "float", "decimal"], + inputType: ["int", "float", "decimal"], + imports: {}, + errorReturned: false, + expression: "+", + }, + }, + ], + [ + DIVISION, + { + name: DIVISION, + structure: { + operation: "DIVISION", + outputType: ["int", "float", "decimal"], + inputType: ["int", "float", "decimal"], + imports: {}, + errorReturned: false, + expression: "/", + }, + }, + ], + [ + LENGTH, + { + name: LENGTH, + structure: { + operation: "LENGTH", + outputType: ["int"], + inputType: ["string[]", "int[]", "float[]", "decimal[]", "boolean[]", "record[]"], + imports: {}, + errorReturned: false, + expression: "${LHS} : ${RHS}.length()", + }, + }, + ], + [ + MODULAR, + { + name: MODULAR, + structure: { + operation: "MODULAR", + outputType: ["int"], + inputType: ["int"], + imports: {}, + errorReturned: false, + expression: "%", + }, + }, + ], + [ + MULTIPLICATION, + { + name: MULTIPLICATION, + structure: { + operation: "MULTIPLICATION", + outputType: ["int", "float", "decimal"], + inputType: ["int", "float", "decimal"], + imports: {}, + errorReturned: false, + expression: "*", + }, + }, + ], + [ + SPLIT, + { + name: SPLIT, + structure: { + operation: "SPLIT", + outputType: ["string[]", "string"], + inputType: ["string"], + imports: { org: "ballerina", package: "lang.regexp" }, + errorReturned: false, + expression: "${LHS} : re `,`.split(${RHS})", + }, + }, + ], + [ + SUBTRACTION, + { + name: SUBTRACTION, + structure: { + operation: "SUBTRACTION", + outputType: ["int", "float", "decimal"], + inputType: ["int", "float", "decimal"], + imports: {}, + errorReturned: false, + expression: "-", + }, + }, + ], +]); + +// ============================================================================= +// MAIN ORCHESTRATOR FUNCTION +// ============================================================================= + +/** + * Main function for AI-powered data mapping generation + * Coordinates the entire data mapping workflow with retry logic and error handling + */ +async function mapData(payload: Payload): Promise { + const maxRetries = 6; + let retries = 0; + + while (retries < maxRetries) { + if (retries > 1) { + console.debug("Retrying to generate mappings for the payload."); + } + + try { + // Extract existing mapping field hints + const mappingFields: { [key: string]: MappingFields } = payload.mapping_fields || {}; + + // STEP 1: Generate AI-powered mappings using Claude + const generatedMappings = await getAutoMappings(payload.inputs, payload.output, mappingFields); + + // STEP 2: Prepare metadata for validation + const input: Inputs = { + input: payload.inputMetadata, + output: payload.outputMetadata, + }; + + // STEP 3: Validate and process AI-generated mappings + const evaluateMappingsResult = await evaluateMappings([], generatedMappings, operationsTable, input); + + if (evaluateMappingsResult) { + // STEP 4: Extract and structure the validated mappings + const mappings = extractMappings(evaluateMappingsResult); + return mappings; + } else { + throw new Error("Failed to generate mappings for the payload."); + } + } catch (error) { + console.error(`Error occurred while generating mappings: ${error}`); + retries += 1; + continue; + } + } + + throw new Error("Failed to generate mappings for the payload after all retries."); +} + +// ============================================================================= +// MAPPING EXTRACTION FUNCTION +// ============================================================================= + +/** + * Recursive mapping extraction and structuring function + * Processes AI-generated and validated mappings into clean, hierarchical structure + */ +function extractMappings(evaluateMappingsResult: MappingJson): DatamapperResponse { + const mappings: { [key: string]: MappingJson } = {}; + + // Guard clause: Ensure we have map-type data (not single mapping record) + if (isMappingRecord(evaluateMappingsResult)) { + throw new Error("EvaluateMappingsResult is a MappingRecord, expected map structure."); + } + + // Process nested mapping structure + if (typeof evaluateMappingsResult === "object" && evaluateMappingsResult !== null) { + for (const [key, value] of Object.entries(evaluateMappingsResult)) { + if (isMappingRecord(value)) { + // Direct mapping record - add to results + mappings[key] = value; + } else if (typeof value === "object" && value !== null) { + // Nested mapping structure - recursively process + const nestedMappingsResult = extractMappings(value as MappingJson); + mappings[key] = nestedMappingsResult.mappings; + } + } + } + + return { mappings }; +} + +// ============================================================================= +// AI-POWERED DATA MAPPING GENERATION +// ============================================================================= + +/** + * Generates intelligent data transformation mappings by analyzing input and output schemas + */ +async function getAutoMappings( + inputJsonRecord: { [key: string]: any }, + outputJsonRecord: { [key: string]: any }, + mappingFields: { [key: string]: MappingFields } +): Promise { + // STEP 1: Construct AI prompt with schema information + const prompt = getDataMappingPrompt( + JSON.stringify(inputJsonRecord), + JSON.stringify(outputJsonRecord), + JSON.stringify(mappingFields) + ); + + // STEP 3: Call Claude API using AI SDK + const messages: CoreMessage[] = [ + { role: "user", content: prompt } + ]; + + try { + const { object } = await generateObject({ + model: anthropic("claude-3-5-sonnet-20241022"), + maxTokens: 4096, + temperature: 0, + messages: messages, + schema: DataMappingSchema + }); + + const generatedMappings = object as AIDataMappings; + return generatedMappings; + } catch (error) { + console.error("Failed to parse response:", error); + throw new Error(`Failed to parse mapping response: ${error}`); + } +} + +// ============================================================================= +// MAPPING VALIDATION AND PROCESSING ENGINE +// ============================================================================= + +/** + * Recursively validates and processes AI-generated mappings against supported operations + */ +async function evaluateMappings( + path: string[], + input: AIDataMappings, + operations: Map, + initialRecords: Inputs +): Promise { + const returnRec: { [key: string]: MappingJson } = {}; + + if (isMapping(input)) { + // STEP 1: Extract operation record from AI-generated mapping + const operationRecord = input.OPERATION; + const parametersTypes: { [key: string]: ParameterMetadata } = {}; + let validParameters = false; + + // STEP 2: Process and validate each parameter in the operation + for (const subKey of Object.keys(operationRecord)) { + if (subKey !== NAME) { + const subPathString = operationRecord[subKey as keyof MappingOperation] as string; + if (!subPathString) { + continue; + } + + // Extract operation details and input path + const operationName = operationRecord.NAME; + const paths = subPathString.split("."); + if (paths.length <= 1) { + continue; + } + + // STEP 3: Validate input record instance exists + const recordInstance = paths.shift()!; + if (!initialRecords.input[recordInstance]) { + continue; + } + + // STEP 4: Extract and validate field type metadata + const inputFields = initialRecords.input[recordInstance]; + const inputType = getTypeMetadataOfField(inputFields, [...paths].reverse(), subKey, operationName); + if (!inputType) { + continue; + } + + // STEP 5: Store validated parameter metadata + parametersTypes[subKey] = { + type: inputType.type, + input: subPathString, + optional: inputType.optional, + nullable: inputType.nullable, + }; + validParameters = true; + } + } + + // STEP 6: Validate operation if parameters are valid + if (validParameters) { + const outputFields = initialRecords.output; + const outputType = getTypeMetadataOfField(outputFields, [...path].reverse()); + if (!outputType) { + return null; + } + + // STEP 7: Perform comprehensive operation validation + const mapping = validateMappingOperation( + operationRecord, + operations, + parametersTypes, + outputType, + path[path.length - 1], + initialRecords.input + ); + return mapping; + } + return null; + } else if (typeof input === "object" && input !== null) { + // STEP 8: Recursively process nested mapping structures + for (const [key, value] of Object.entries(input)) { + if (value === null || value === undefined) { + continue; + } + + // Process nested mapping with extended path + const newPath = [...path, key]; + const temporaryRecord = await evaluateMappings( + newPath, + value as AIDataMappings, + operations, + initialRecords + ); + + if (temporaryRecord) { + if ( + isMappingRecord(temporaryRecord) || + (typeof temporaryRecord === "object" && Object.keys(temporaryRecord).length > 0) + ) { + returnRec[key] = temporaryRecord; + } + } + } + return returnRec; + } else { + throw new Error("Invalid input type"); + } +} + +// ============================================================================= +// OPERATION-SPECIFIC VALIDATION ENGINE +// ============================================================================= + +/** + * Validates individual mapping operations against their specific requirements + */ +function validateMappingOperation( + mapping: MappingOperation, + operations: Map, + inputType: { [key: string]: ParameterMetadata }, + outputType: FieldMetadata, + name: string, + inputs: { [key: string]: Metadata } +): MappingJson | null { + const operation = mapping.NAME; + + // STEP 1: Verify operation exists in operations database + const op = operations.get(operation); + if (!op) { + return null; + } + + // STEP 2: Validate DIRECT mapping operation + if (op.name === DIRECT) { + const paramOne = inputType[PARAMETER_1]; + if (!paramOne) { + return null; + } + + const paths = paramOne.input.split("."); + if (paths.length === 0) { + throw new Error("Invalid path in input type for DIRECT operation"); + } + + const recordInstance = paths[0]; + if (!inputs[recordInstance]) { + throw new Error("Record instance not found in inputs for DIRECT operation"); + } + + return { + operation: DIRECT, + targetType: outputType.type, + parameters: [paramOne.input], + }; + + // STEP 3: Validate LENGTH operation + } else if (op.name === LENGTH) { + const paramOne = inputType[PARAMETER_1]; + if (!paramOne) { + throw new Error("Parameter 1 not found in input type for LENGTH operation"); + } + + const pathString = paramOne.input; + if (outputType.type === "int" || outputType.type === "int|()") { + const paths = pathString.split("."); + if (paths.length === 0) { + throw new Error("Invalid path in input type for LENGTH operation"); + } + + const recordInstance = paths[0]; + if (!inputs[recordInstance]) { + throw new Error("Record instance not found in inputs for LENGTH operation"); + } + + return { + operation: LENGTH, + targetType: outputType.type, + parameters: [pathString], + }; + } else { + throw new Error("Invalid input or output type for LENGTH operation"); + } + + // STEP 4: Validate SPLIT operation + } else if (op.name === SPLIT) { + const paramOne = inputType[PARAMETER_1]; + const paramTwo = mapping.PARAMETER_2; + + if (!paramOne || !paramTwo) { + throw new Error("Required parameters not found in input type for SPLIT operation"); + } + + if ( + paramOne.type !== "regex" || + !( + outputType.type === "string[]" || + outputType.type === "string[]|()" || + outputType.type === "(string|())[]" || + outputType.type === "(string|())[]|()" + ) + ) { + throw new Error("Invalid input or output type for SPLIT operation"); + } + + const paths = paramOne.input.split("."); + if (paths.length === 0) { + throw new Error("Invalid path in input type for SPLIT operation"); + } + + const recordInstance = paths[0]; + if (!inputs[recordInstance]) { + throw new Error("Record instance not found in inputs for SPLIT operation"); + } + + return { + operation: "SPLIT", + targetType: outputType.type, + parameters: [paramOne.input, paramTwo], + }; + } + + return null; +} + +// ============================================================================= +// TYPE METADATA EXTRACTION ENGINE +// ============================================================================= + +/** + * Extracts type information from schema metadata for validation purposes + */ +function getTypeMetadataOfField( + input: MetadataType, + pathParameters: string[], + paramName?: string, + operationName?: string +): FieldMetadata | null { + // STEP 1: Handle special parameter types (e.g., regex for SPLIT operation) + if (paramName && operationName) { + if (operationName === SPLIT && paramName === PARAMETER_2) { + return { type: "regex", optional: false, nullable: false }; + } + } + + // STEP 2: Process nested field path navigation + if (pathParameters.length > 0) { + let modifiedInputs: { [key: string]: MetadataField } | undefined; + + // Extract field map from different metadata types + if ("fields" in input && input.fields && typeof input.fields === "object" && !("typeName" in input.fields)) { + modifiedInputs = input.fields as { [key: string]: MetadataField }; + } else if ( + "members" in input && + input.members && + typeof input.members === "object" && + !("typeName" in input.members) + ) { + modifiedInputs = input.members as { [key: string]: MetadataField }; + } else if (typeof input === "object" && !("typeName" in input)) { + modifiedInputs = input as { [key: string]: MetadataField }; + } + + if (!modifiedInputs) { + throw new Error("No fields found in MetadataField"); + } + + // STEP 3: Navigate to next level in field hierarchy + const index = pathParameters.pop()!; + const temporaryRecord = modifiedInputs[index]; + if (temporaryRecord) { + return getTypeMetadataOfField(temporaryRecord, pathParameters, paramName, operationName); + } else { + return null; + } + } else { + // STEP 4: Extract final field type metadata + try { + if ("typeName" in input && "optional" in input && "nullable" in input) { + const metadataField = input as MetadataField; + return { + type: metadataField.typeName, + optional: metadataField.optional, + nullable: metadataField.nullable, + }; + } else { + throw new Error("Invalid metadata structure"); + } + } catch (error) { + throw new Error(`Error occurred while getting the type metadata of the field: ${error}`); + } + } +} + +// ============================================================================= +// UTILITY FUNCTIONS +// ============================================================================= + +/** + * Type guard to check if value is a MappingRecord + */ +function isMappingRecord(value: any): value is MappingRecord { + return value && typeof value === "object" && "operation" in value && "targetType" in value && "parameters" in value; +} + +/** + * Type guard to check if value is a Mapping + */ +function isMapping(value: any): value is { OPERATION: MappingOperation } { + return value && typeof value === "object" && "OPERATION" in value; +} + +// ============================================================================= +// MAIN EXPORT FUNCTION +// ============================================================================= + +/** + * Main export function for generating auto mappings + * This function matches the original signature and provides a simple interface + */ +export async function generateAutoMappings(payload?: Payload): Promise { + if (!payload) { + throw new Error("Payload is required for generating auto mappings"); + } + try { + return await mapData(payload); + } catch (error) { + console.error(`Error generating auto mappings: ${error}`); + throw new Error(`Failed to generate auto mappings: ${error}`); + } +} + +/** + * Helper function to create a sample payload for testing + */ +export function createSamplePayload(): Payload { + return { + inputs: { + person: { + id: { type: "string", comment: "Unique identifier for the person" }, + firstName: { type: "string", comment: "First name of the person" }, + lastName: { type: "string", comment: "Last name of the person" }, + age: { type: "int", comment: "Age of the person" }, + country: { type: "string", comment: "Country of the person" }, + courses: { + id: { type: "string", comment: "Unique identifier for the course" }, + name: { type: "string", comment: "Name of the course" }, + credits: { type: "int", comment: "Credits of the course" }, + }, + }, + }, + output: { + id: { type: "string", comment: "Unique identifier for the student" }, + firstName: { type: "string", comment: "First name of the student" }, + age: { type: "int", comment: "Age of the student" }, + country: { type: "string", comment: "Country of the student" }, + courses: { + id: { type: "string", comment: "Unique identifier for the course" }, + name: { type: "string", comment: "Name of the course" }, + credits: { type: "int", comment: "Credits of the course" }, + }, + }, + inputMetadata: { + person: { + parameterType: "Person", + parameterName: "person", + isArrayType: false, + type: "record", + fields: { + id: { + type: "string", + typeInstance: "id", + typeName: "string", + nullable: false, + optional: false, + }, + firstName: { + type: "string", + typeInstance: "firstName", + typeName: "string", + nullable: false, + optional: false, + }, + lastName: { + type: "string", + typeInstance: "lastName", + typeName: "string", + nullable: false, + optional: false, + }, + age: { + type: "int", + typeInstance: "age", + typeName: "int", + nullable: false, + optional: false, + }, + country: { + type: "string", + typeInstance: "country", + typeName: "string", + nullable: false, + optional: false, + }, + courses: { + type: "record[]", + typeInstance: "courses", + typeName: "record[]", + nullable: false, + optional: false, + fields: { + id: { + type: "string", + typeInstance: "id", + typeName: "string", + nullable: false, + optional: false, + }, + name: { + type: "string", + typeInstance: "name", + typeName: "string", + nullable: false, + optional: false, + }, + credits: { + type: "int", + typeInstance: "credits", + typeName: "int", + nullable: false, + optional: false, + }, + }, + }, + }, + }, + }, + outputMetadata: { + id: { + type: "string", + typeInstance: "id", + typeName: "string", + nullable: false, + optional: false, + }, + firstName: { + type: "string", + typeInstance: "firstName", + typeName: "string", + nullable: false, + optional: false, + }, + age: { + type: "int", + typeInstance: "age", + typeName: "int", + nullable: false, + optional: false, + }, + country: { + type: "string", + typeInstance: "country", + typeName: "string", + nullable: false, + optional: false, + }, + courses: { + type: "record[]", + typeInstance: "courses", + typeName: "record[]", + nullable: false, + optional: false, + fields: { + id: { + type: "string", + typeInstance: "id", + typeName: "string", + nullable: false, + optional: false, + }, + name: { + type: "string", + typeInstance: "name", + typeName: "string", + nullable: false, + optional: false, + }, + credits: { + type: "int", + typeInstance: "credits", + typeName: "int", + nullable: false, + optional: false, + }, + }, + }, + }, + }; +} + +/** + * Helper function to validate the structure of a mapping response + */ +export function validateMappingResponse(response: DatamapperResponse): boolean { + if (!response || !response.mappings) { + return false; + } + + for (const [key, mapping] of Object.entries(response.mappings)) { + if (!isValidMapping(mapping)) { + console.warn(`Invalid mapping found for key: ${key}`); + return false; + } + } + + return true; +} + +/** + * Recursive function to validate a mapping structure + */ +function isValidMapping(mapping: MappingJson): boolean { + if (isMappingRecord(mapping)) { + return Boolean( + mapping.operation && mapping.targetType && mapping.parameters && Array.isArray(mapping.parameters) + ); + } + + if (typeof mapping === "object" && mapping !== null) { + return Object.values(mapping).every((value) => isValidMapping(value)); + } + + return false; +} + +// ============================================================================= +// EXPORTS +// ============================================================================= + +// Export operation constants for external use +export { + DIRECT, + LENGTH, + SPLIT, + ADDITION, + SUBTRACTION, + MULTIPLICATION, + DIVISION, + MODULAR, + EQUAL, + NOTEQUAL, + LESS_THAN, + LESS_THAN_OR_EQUAL, + AND, + OR, + REPLACE_ALL, + AVERAGE, + MAXIMUM, + MINIMUM, + SUMMATION, + ABSOLUTE, +}; + +// Default export for the main function +export default generateAutoMappings; + +/* +// Example Usage: +async function testDataMapping() { + try { + // Create sample payload + const payload = createSamplePayload(); + + // Generate mappings + const response = await generateAutoMappings(payload); + + // Validate response + const isValid = validateMappingResponse(response); + + if (isValid) { + console.log("Generated mappings:", JSON.stringify(response, null, 2)); + } else { + console.error("Invalid mapping response"); + } + + // Expected output structure: + // { + // "mappings": { + // "id": { + // "operation": "DIRECT", + // "targetType": "string", + // "parameters": ["person.id"] + // }, + // "firstName": { + // "operation": "DIRECT", + // "targetType": "string", + // "parameters": ["person.firstName"] + // }, + // "age": { + // "operation": "DIRECT", + // "targetType": "int", + // "parameters": ["person.age"] + // }, + // "courses": { + // "id": { + // "operation": "DIRECT", + // "targetType": "string", + // "parameters": ["person.courses.id"] + // }, + // "name": { + // "operation": "DIRECT", + // "targetType": "string", + // "parameters": ["person.courses.name"] + // }, + // "credits": { + // "operation": "DIRECT", + // "targetType": "int", + // "parameters": ["person.courses.credits"] + // } + // }, + // "country": { + // "operation": "DIRECT", + // "targetType": "string", + // "parameters": ["person.country"] + // } + // } + // } + + } catch (error) { + console.error("Error generating mappings:", error); + } +} +*/ diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/prompt.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/prompt.ts new file mode 100644 index 00000000000..2daac9d3158 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/prompt.ts @@ -0,0 +1,334 @@ +// ============================================================================= +// AI PROMPT FUNCTIONS +// ============================================================================= + +/** + * Generates the main data mapping prompt for AI + */ +export function getDataMappingPrompt(inputJson: string, outputJson: string, mappingFields: string): string { + return `You are an assistant that can help to map attributes between multiple json (a.k.a data-mapping). +Before starting the mapping process, consider the mappings provided by the user below. +Use the user's mappings as a guide/tip to do the mapping process, ensuring that they are relevant to input and output json. +Only use the tips in user's mappings that is input and output records and their fields and subfields are in input and output json. Otherwise omit the irrelevant user's mapping guides. +Also, use the below rules to do the data mapping. + +Following rules should be followed during data mapping. +1) One or more input json can be given +2) Only a single output json can be given +3) Mapping the fields requires performing operations on the data. Most common operation is to do a one-to-one mapping with no transformations. +4) One or more fields in the input json may be required to construct the output field value in-case we have complex operations that require multiple input fields. +5) Some input fields may not participate in any mappings if they are irrelevant to the output field. +6) Some output fields may not participate in any mappings if they are irrelevant to the input field. +7) Accessing the subfield "abc" from object "xyz" can be denoted as "xyz.abc". If the field contains a single quote at the beginning of the field name, include that field with the single quote in front of it in the path. +8) Strictly follow data types accepted and returned by the operations when mapping input fields. +9) When mapping, you must use operators which return the expected data type. +10) When Mapping, consider the information mentioned in the comments. +11) DO NOT use the value in the field "optional" when mapping the fields. +12) DO NOT map anything if you aren't sure. +13) If both input and output are records type, DO mapping for all its fields and subfields but DO NOT map in the root level. + +Following operations/transformations can be used during a mapping between input and output fields. Use ONLY the operations listed below. +0) Direct Mapping + DIRECT(x) used to substitute with x without any transformations +1) Arithmetic Expressions + 1.1) ADDITION(x, y, z, ...) : add variables x, y and z and so on + 1.2) SUBTRACTION(x, y) : subtract y from x + 1.3) MULTIPLICATION(x, y, z, ...) : multiply x, y and z and so on + 1.4) DIVISION(x, y) : divide x by y + 1.5) MODULAR(x, y) : get the modular division between x and y i.e. x%y +2) Equality Expressions + 2.1) EQUAL(x, y) : return true if x and y are equal + 2.2) NOTEQUAL(x, y) : return true if x and y are not equal +3) Relational Expressions + 3.1) LESS_THAN(x, y) : return true if x is less than y + 3.2) LESS_THAN_OR_EQUAL(x, y) : return true if x is less than or equals to y +4) Logical Expressions + 4.1) AND(x, y) : return x AND y value + 4.2) OR(x, y) : return x OR y value +5) Member Access Expressions + 5.1) x[y] : access y th element of x array object in the json +6) Regex Operations + 6.1) SPLIT(regex, text) : Split the string text based on the regex and returns an array of strings (string[]). + Example: + SPLIT(",", “word1, word2, word3”) will return a string array [“word1”, “word2”, “word3”]. + SPLIT(" ", “word1 word2 word3”) will return a string array [“word1”, “word2”, “word3”]. + 6.2) REPLACE_ALL(regex, text, replacement) : Replace all the instances of regex in the text using string replacement. + Example - REPLACE_ALL(" ", “word1 word2 word3”, "") will return a string “word1word2word3” + For above two operations, regex value must be one or combination of the following : [" ", "_", "-", "\n", ",", "\." ], here "\" is used to escape special characters. + +7) Numerical Operations + 7.1) AVERAGE(x, TYPE) : get the average over x. x is a single array of variables of TYPE (ex - [12, 13, 14]) when TYPE is INTEGER .TYPE can be either INT, DECIMAL, or FLOAT. + 7.2) MAXIMUM(x, TYPE) : get the maximum over x. x is an array of variables of TYPE(ex - [12, 13, 14]) when TYPE is INTEGER .TYPE can be either INT, DECIMAL, or FLOAT. + 7.3) MINIMUM(x, TYPE) : get the minimum over x. x is an array of variables of TYPE (ex - [12, 13, 14]) when TYPE is INTEGER .TYPE can be either INT, DECIMAL, or FLOAT. + 7.4) SUMMATION(x, TYPE) : get the summation over x. x is a single array of variables of TYPE(ex - [12, 13, 14]) when TYPE is INTEGER .TYPE can be either INT, DECIMAL, or FLOAT. + 7.5) ABSOLUTE(x, TYPE) : get the absolute value of the given variable of TYPE, x .TYPE can be either INT, DECIMAL, or FLOAT. + +8) Array Operations + 8.1) LENGTH(x) : Get the length of an array named x + +Always use the following json format to respond. +\`\`\` +{ + "": { + "OPERATION": { + "NAME": "", + "PARAMETER_1" : , + "PARAMETER_2" : , + ... + ... + ... + } + }, + ... +} +\`\`\` +Following is an example of the input, output and the mapping: + +Example Input json : + +\`\`\` +{ + "studentDetails": { + "id":{ + "type":"string", + "optional" : false, + "nullable" : false, + "comment":"student id" + }, + "tags":{ + "type":"string", + "optional" : false, + "nullable" : false, + "comment":"student tags" + }, + "bio":{ + "firstName": { + "type":"string", + "optional" : false, + "nullable" : false, + "comment":"first name of the student" + }, + "lastName":{ + "type":"string", + "optional" : false, + "nullable" : false, + "comment":"Last name of the student" + }, + "age":{ + "type":"int", + "optional" : false, + "nullable" : false, + "comment":"age in years" + } + }, + "address":{ + "address1": { + "type":"string", + "optional" : false, + "nullable" : false, + "comment":"address line 1" + }, + "address2":{ + "type":"string", + "optional" : false, + "nullable" : false, + "comment":"address line 2" + }, + "city":{ + "type":"string", + "optional" : false, + "nullable" : false, + "comment":"city of the address" + }, + "country":{ + "type":"string", + "optional" : false, + "nullable" : false, + "comment":"country of residence" + }, + "zip":{ + "type":"string", + "optional" : false, + "nullable" : false, + "comment":"zip code" + } + }, + academicDetails: { + "major":{ + "type":"string", + "optional" : false, + "nullable" : false, + "comment":"major of the degree" + }, + "subjects":{ + "type":"string[]", + "optional" : false, + "nullable" : false, + "comment":"enrolled subjects" + } + } + }, + "studentProgress": { + "studentId":{ + "type":"string", + "optional" : false, + "nullable" : false, + "comment":"student id" + }, + "currentLevel":{ + "type": "string", + "optional" : false, + "nullable" : false, + "comment": "current grade of the student" + } + } +} + +\`\`\` + +Example Output json : + +\`\`\` +{ + "studentId":{ + "type":"int", + "optional" : true, + "nullable" : true, + "comment":"reservation id" + }, + "studentTags":{ + "type":"string[]", + "optional" : false, + "nullable" : false, + "comment":"student tags" + }, + "bio":{ + "fullName": { + "type":"string", + "optional" : false, + "nullable" : false, + "comment":"full name of the student" + }, + "age":{ + "type":"int", + "optional" : false, + "nullable" : false, + "comment":"age in years" + } + }, + "address":{ + "type":"string", + "optional" : false, + "nullable" : false, + "comment":"address of the student" + }, + "AcademicMajor":{ + "type":"string", + "optional" : true, + "comment":"major of the degree" + }, + "subjects":{ + "type":"string[]", + "optional" : false, + "nullable" : false, + "comment":"enrolled subjects" + }, + "currentLevel": { + "type": "string", + "optional" : true, + "nullable" : true, + "comment": "current grade of the student" + } +} + +\`\`\` + +Example Mapping: +\`\`\` +{ + "studentId": { + "OPERATION": { + "NAME": "DIRECT", + "PARAMETER_1": "studentDetails.id", + "PARAMETER_2": "INT" + } + }, + "studentTags": { + "OPERATION": { + "NAME": "SPLIT", + "PARAMETER_1": "studentDetails.tags", + "PARAMETER_2": "," + } + }, + "bio": { + "fullName": { + "OPERATION": { + "NAME": "ADDITION", + "PARAMETER_1": "studentDetails.bio.firstName", + "PARAMETER_2": " ", + "PARAMETER_3": "studentDetails.bio.lastName" + } + }, + "age": { + "OPERATION": { + "NAME": "DIRECT", + "PARAMETER_1": "studentDetails.bio.age" + } + } + }, + "address": { + "OPERATION": { + "NAME": "ADDITION", + "PARAMETER_1": "studentDetails.address.address1", + "PARAMETER_2": ", " + "PARAMETER_3": "studentDetails.address.address2", + "PARAMETER_4": ", ", + "PARAMETER_5": "studentDetails.address.country", + "PARAMETER_6": ", ", + "PARAMETER_7": "studentDetails.address.zip", + } + }, + "academicMajor": { + "OPERATION": { + "NAME": "DIRECT", + "PARAMETER_1": "studentDetails.academicDetails.major" + } + }, + "subjects": { + "OPERATION": { + "NAME": "DIRECT", + "PARAMETER_1": "studentDetails.academicDetails.subjects" + } + }, + "currentLevel": { + "OPERATION": "DIRECT", + "PARAMETER_1": "studentDetails.studentProgress.currentLevel" + } +} + +\`\`\` +Now using the above rules find the mappings for the following input and output records. + +IMPORTANT : +DO NOT RETURN ANYTHING OTHER THAN THE MAPPING JSON! +DO NOT ENCLOSE THE RESULT JSON WITH ANYTHING. +FOR DIRECT MAPPINGS THE PARAMETER MUST BE A FIELD PATH IN THE INPUT. DEFAULT VALUES AND NULL LIKE VALUES MUST NOT BE MAPPED DIRECT. + +User's mappings +\`\`\` +${mappingFields} +\`\`\` + + +Input json +\`\`\` +${inputJson} +\`\`\` + + +Output json +\`\`\` +${outputJson} +\`\`\` +`; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/schema.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/schema.ts new file mode 100644 index 00000000000..ba28e5f7b27 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/schema.ts @@ -0,0 +1,40 @@ +import { z } from 'zod'; + +// Schema for individual operation +const OperationSchema = z.object({ + NAME: z.string(), + PARAMETER_1: z.union([z.string(), z.number()]).optional(), + PARAMETER_2: z.union([z.string(), z.number()]).optional(), + PARAMETER_3: z.union([z.string(), z.number()]).optional(), + PARAMETER_4: z.union([z.string(), z.number()]).optional(), + PARAMETER_5: z.union([z.string(), z.number()]).optional(), + PARAMETER_6: z.union([z.string(), z.number()]).optional(), + PARAMETER_7: z.union([z.string(), z.number()]).optional(), + PARAMETER_8: z.union([z.string(), z.number()]).optional(), + PARAMETER_9: z.union([z.string(), z.number()]).optional(), + PARAMETER_10: z.union([z.string(), z.number()]).optional(), +}); + +// Schema for a field mapping that contains an operation +const FieldMappingSchema = z.object({ + OPERATION: OperationSchema +}); + +// Schema for nested field mappings (like bio.fullName, bio.age) +const NestedFieldMappingSchema = z.record( + z.string(), + z.union([ + FieldMappingSchema, + z.lazy(() => NestedFieldMappingSchema) + ]) +); + +// Main schema for the complete data mapping +export const DataMappingSchema = z.record( + z.string(), + z.union([ + FieldMappingSchema, + NestedFieldMappingSchema + ]) +); + diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/types.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/types.ts new file mode 100644 index 00000000000..b2ce205edb6 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/types.ts @@ -0,0 +1,146 @@ +// ============================================================================= +// OPERATION TYPES +// ============================================================================= + +export type OperationType = string; + +// ============================================================================= +// MAPPING TYPES +// ============================================================================= + +export interface MappingRecord { + operation: OperationType; + targetType: string; + parameters: string[]; +} + +export type MappingJson = MappingRecord | { [key: string]: MappingJson }; + +export interface DatamapperResponse { + mappings: { [key: string]: MappingJson }; +} + +export interface Payload { + inputs: { [key: string]: RecordField }; + output: { [key: string]: RecordField }; + inputMetadata: { [key: string]: Metadata }; + outputMetadata: { [key: string]: MetadataField }; + mapping_fields?: { [key: string]: MappingFields }; +} + +// ============================================================================= +// FIELD AND METADATA TYPES +// ============================================================================= + +export interface SimpleField { + type: string; + comment: string; +} + +export interface MappingOperation { + NAME: OperationType; + PARAMETER_1: string; + PARAMETER_2?: string; + PARAMETER_3?: string; + PARAMETER_4?: string; +} + +export type RecordField = SimpleField | { [key: string]: RecordField }; + +export interface Mapping { + OPERATION: MappingOperation; +} + +export type AIDataMappings = (Mapping) | { [key: string]: AIDataMappings }; + +export interface Metadata { + parameterName: string; + parameterType: string; + type: string; + isArrayType?: boolean; + fields: { [key: string]: MetadataField }; +} + +export interface MetadataField { + type: string; + typeInstance: string; + typeName: string; + nullable: boolean; + optional: boolean; + fields?: { [key: string]: MetadataField }; + members?: { [key: string]: MetadataField }; +} + +// ============================================================================= +// MAPPING HINT TYPES +// ============================================================================= + +export interface MappingField { + MAPPING_TIP: string; + INPUT_FIELDS: string[]; +} + +export type MappingFields = MappingField | { [key: string]: MappingFields }; + +export type MetadataType = Metadata | MetadataField | { [key: string]: MetadataField }; + +export interface Inputs { + input: { [key: string]: Metadata }; + output: { [key: string]: MetadataField }; +} + +// ============================================================================= +// OPERATION METADATA STRUCTURES +// ============================================================================= + +export interface FieldMetadata { + type: string; + optional: boolean; + nullable: boolean; +} + +export interface ParameterMetadata extends FieldMetadata { + input: string; +} + +export interface Structure { + operation: string; + outputType: string[]; + inputType: string[]; + imports: { + org?: string; + package?: string; + }; + errorReturned: boolean; + expression: string; +} + +export interface Operation { + readonly name: string; + structure: Structure; +} + +// ============================================================================= +// API RESPONSE TYPES +// ============================================================================= + +export interface ChatMessage { + role: string; + content: string; +} + +export interface ChatChoice { + message: ChatMessage; + index: number; + finish_reason: string; +} + +export interface ChatResponse { + choices: ChatChoice[]; + usage?: { + prompt_tokens: number; + completion_tokens: number; + total_tokens: number; + }; +} + diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts new file mode 100644 index 00000000000..311b4a4496a --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts @@ -0,0 +1,39 @@ +import { ChatNotify, ChatContent } from "@wso2/ballerina-core"; +import { sendContentAppendNotification, sendContentReplaceNotification, sendDiagnosticMessageNotification, sendErrorNotification, sendMessagesNotification, sendMessageStartNotification, sendMessageStopNotification, sendTestGenIntermidateStateNotification } from "./utils"; + +export type CopilotEventHandler = (event: ChatNotify) => void; + +// Event listener that handles events and sends notifications +export function createWebviewEventHandler(): CopilotEventHandler { + return (event: ChatNotify) => { + switch (event.type) { + case 'start': + sendMessageStartNotification(); + break; + case 'content_block': + sendContentAppendNotification(event.content); + break; + case 'content_replace': + sendContentReplaceNotification(event.content); + break; + case 'error': + sendErrorNotification(event.content); + break; + case 'stop': + sendMessageStopNotification(); + break; + case 'intermediary_state': + sendTestGenIntermidateStateNotification(event.state); + break; + case 'messages': + sendMessagesNotification(event.messages); + break; + case 'diagnostics': + sendDiagnosticMessageNotification(event.diagnostics); + break; + default: + console.warn(`Unhandled event type: ${event}`); + break; + } + }; +} 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 new file mode 100644 index 00000000000..b65a48bc367 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts @@ -0,0 +1,334 @@ +import { CoreMessage, generateObject, generateText, streamText } from "ai"; +import { anthropic } from "../connection"; +import { GenerationType, getRelevantLibrariesAndFunctions } from "../libs/libs"; +import { getReadmeQuery, populateHistory, transformProjectSource, getErrorMessage } from "../utils"; +import { getMaximizedSelectedLibs, libraryContains, selectRequiredFunctions, toMaximizedLibrariesFromLibJson } from "../libs/funcs"; +import { GetFunctionResponse, GetFunctionsRequest, getFunctionsResponseSchema } from "../libs/funcs_inter_types"; +import { LANGLIBS } from "../libs/langlibs"; +import { GetTypeResponse, GetTypesRequest, GetTypesResponse, getTypesResponseSchema, Library, MiniType, TypeDefinition } from "../libs/libs_types"; +import { ChatNotify, DiagnosticEntry, FileAttatchment, GenerateCodeRequest, onChatNotify, PostProcessResponse, ProjectDiagnostics, ProjectSource, RepairParams, RepairResponse, SourceFiles } from "@wso2/ballerina-core"; +import { getProjectSource, postProcess } from "../../../../rpc-managers/ai-panel/rpc-manager"; +import { CopilotEventHandler, createWebviewEventHandler } from "../event"; + +// Core healthcare code generation function that emits events +export async function generateHealthcareCodeCore(params: GenerateCodeRequest, eventHandler: CopilotEventHandler): Promise { + const project: ProjectSource = await getProjectSource("CODE_GENERATION"); + const sourceFiles: SourceFiles[] = transformProjectSource(project); + const prompt = getReadmeQuery(params, sourceFiles); + const relevantTrimmedFuncs: Library[] = (await getRelevantLibrariesAndFunctions({query:prompt}, GenerationType.HEALTHCARE_GENERATION)).libraries; + + const historyMessages = populateHistory(params.chatHistory); + + const allMessages: CoreMessage[] = [ + { + role: "system", + content: getSystemPromptPrefix(relevantTrimmedFuncs), + }, + { + role: "system", + content: getSystemPromptSuffix(LANGLIBS, [], sourceFiles, params.fileAttachmentContents, prompt), + providerOptions: { + anthropic: { cacheControl: { type: "ephemeral" } }, + }, + }, + ...historyMessages, + { + role: "user", + content: prompt, + providerOptions: { + anthropic: { cacheControl: { type: "ephemeral" } }, + }, + }, + ]; + + try { + const { fullStream } = streamText({ + model: anthropic("claude-3-5-sonnet-20241022"), + maxTokens: 4096, + temperature: 0, + messages: allMessages, + }); + + eventHandler({ type: 'start' }); + let assistantResponse: string = ""; + for await (const part of fullStream) { + switch (part.type) { + case "text-delta": { + const textPart = part.textDelta; + 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; + const postProcessedResp: PostProcessResponse = await postProcess({ + assistant_response: assistantResponse + }); + assistantResponse = postProcessedResp.assistant_response; + + eventHandler({ type: 'content_replace', content: assistantResponse }); + eventHandler({ type: 'stop' }); + break; + } + } + } + } catch (error) { + console.error("Error during Healthcare code generation:", error); + eventHandler({ type: 'error', content: getErrorMessage(error) }); + } +} + +// Main public function that uses the default event handler +export async function generateHealthcareCode(params: GenerateCodeRequest): Promise { + const eventHandler = createWebviewEventHandler(); + await generateHealthcareCodeCore(params, eventHandler); +} + +function getSystemPromptPrefix(apidocs: Library[]) { + 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 thinking step-by-step and following the instructions provided. + +First, review and learn about the Ballerina libraries available for healthcare integration scenarios: + +${JSON.stringify(apidocs)} + +`; +} + +function getSystemPromptSuffix(langlibs: Library[], types: string[], existingCode: SourceFiles[], fileUploadContents: FileAttatchment[], usecase: string): string { + return `Then, learn and understand the core Ballerina language libraries, the types and the functions they offer: + +${JSON.stringify(langlibs)} + + +Consider the following types and their corresponding libraries when generating the code: + +${JSON.stringify(types)} + +If you require these types, you have to import the corresponding libraries related to the selected types. + +Have a look and understand the current healthcare integrations that the user is being working on: + +${JSON.stringify(existingCode)} + + +Read and try to understand the files user have attached to the query: +${JSON.stringify(fileUploadContents)} + +Now, consider this user query that explains the healthcare integration requirement to be considered when generating the Ballerina code: + +${usecase} + + +Your goal is to generate accurate Ballerina code for the given query considering the knowledge you have, existing code and the files that are uploaded. I encourage you to plan the implementation first, before start writing code. Follow these steps in order: +- planning_phase +- writing_code phase +- verify_code phase +- generate_output phase + + +Think step-by-step and plan your code generation flow. Follow these steps when planning the code generation task: + +1. Understand whether the query requires code generation or not. If no code generation is required, skip the planning and codegen phases and answer the query based on your current understanding. +2. Deeply understand the query that requires code generation. Follow these steps: + - Carefully read and analyze the query. + - Identify input requirements, expected outputs, and constraints. + - Clarify any ambiguities, take judgemental calls and take necessary assumptions. Write down your assumptions. +3. Break the Problem Down. Follow these steps: + - Decompose the problem into smaller, manageable parts. + - Identify dependencies between different components. +4. Identify Edge Cases and Constraints. Follow these steps: + - Consider boundary conditions (e.g., empty inputs, large datasets). + - Identify performance constraints like time complexity and memory usage. +5. Choose the Right Approach. Follow these steps: + - Determine if existing algorithms or data structures can be applied. + - Select an optimal approach. +6. Design the Solution. Follow these steps: + - Create a high-level algorithm or flowchart. + - Define the key functions, data structures, and logic required. + - Identify whether these required functions, data structures are already available through the knowledge you have. + - Identify the model objects and use the types provided as much as possible. + - Identify the required libraries. 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; + +7. Write Pseudocode. Follow these steps: + - Draft a step-by-step logical representation of the solution. + - This helps validate the logic before coding. +8. Review and Iterate. Follow these steps: + - Validate whether you covered the requirements collected in step 2. + - Plan any thing you missed using the steps in the planning phase. + + + +Think step-by-step and start writing code. Adhere to the outcomes of the planning phase and follow these steps: + - You are writing a Ballerina program. + Important reminders: + - Only use the libraries, functions, types, and clients specified in the provided healthcare docs and types. + - Always strictly respect the types given in the types section. + - Do not introduce any additional libraries or functions not mentioned in the healthcare docs. + - Only use specified fields in records according to the healthcare 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. + To find the alias, split the library name from . and get the last element of the array as the name of the alias. + - 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 you are accessing fields of a record, always assign it into new variables. + - Avoid long comments in the code. + - Always use named arguments when providing values to any parameter. (eg: .get(key="value")) + _ Do not use var keyword (variable declarations, for loops ...). Use explicit types instead. + - 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. + - Start with the required import statements. Add all the must to have imports mentioned in Step 6 of the planning phase section. + - 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. + - 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 etc. + - Use defined connectors based on the query by following the healthcare docs. + - Use only the functions, types, and clients specified in the healthcare docs. + - Use dot notation 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 separate statements. + + + + Review and refine your code. Follow the steps below: + - Check that all query requirements are met. + - Make sure the special imports noted in step 6 of the planning phase are added in the code. + - Verify that you are only using elements from the provided healthcare docs. + - Ensure all the imports are properly specified and accurate. + - Make sure the types of the variables are correct based on the types specified in the types section. DOUBLE CHECK and FIX any incorrect imports. ALWAYS respect the section. + - Ensure the code follows Ballerina best practices and conventions. + + + + Begin your response with the very high level explanation about overall changes, then end the response with the codeblock segments(if any). Each file which needs modifications, should have a codeblock segment and it MUST have complete file content with the proposed change. Do not provide any explanation after codeblocks. + + + Example Codeblock segment: + 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 \`service\` as a prefix to the file name. Example: + + \`\`\ballerina + //code goes here + \`\`\ + + +`; +} + +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: CoreMessage[] = [ + { role: "system", content: getLibSystemPrompt }, + { role: "user", content: getLibUserPrompt } + ]; + try { + const { object } = await generateObject({ + model: anthropic("claude-3-5-haiku-20241022"), + maxTokens: 8192, + temperature: 0, + messages: messages, + schema: getTypesResponseSchema + }); + + 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.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts new file mode 100644 index 00000000000..0637104d02a --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts @@ -0,0 +1,326 @@ +import { generateObject, CoreMessage, generateText } from "ai"; + +import { BACKEND_URL } from "../../utils"; +import { GetFunctionResponse, GetFunctionsRequest, GetFunctionsResponse, getFunctionsResponseSchema, MinifiedClient, MinifiedRemoteFunction, MinifiedResourceFunction } from "./funcs_inter_types"; +import { Client, GetTypeResponse, Library, RemoteFunction, ResourceFunction } from "./libs_types"; +import { anthropic } from "../connection"; +import { GenerationType } from "./libs"; +import { getRequiredTypesFromLibJson } from "../healthcare/healthcare"; +import { langClient } from "../../activator"; +import { getGenerationMode } from "../utils"; + + +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); + let typeLibraries: Library[] = []; + if (generationType === GenerationType.HEALTHCARE_GENERATION) { + const resp: GetTypeResponse[] = await getRequiredTypesFromLibJson(selectedLibNames, prompt, selectedLibs); + typeLibraries = toTypesToLibraries(resp, selectedLibs); + } + const maximizedLibraries: Library[] = toMaximizedLibrariesFromLibJson(functionsResponse, selectedLibs); + + // Merge typeLibraries and maximizedLibraries without duplicates + const mergedLibraries = mergeLibrariesWithoutDuplicates(maximizedLibraries, typeLibraries); + + return mergedLibraries; +} + +function getClientFunctionCount(clients: MinifiedClient[]): number { + return clients.reduce((count, client) => count + client.functions.length, 0); +} + +function toTypesToLibraries(types: GetTypeResponse[], fullLibs: Library[]): Library[] { + const librariesWithTypes: Library[] = []; + + for (const minifiedSelectedLib of types) { + try { + const fullDefOfSelectedLib = getLibraryByNameFromLibJson(minifiedSelectedLib.libName, fullLibs); + if (!fullDefOfSelectedLib) { + continue; + } + + const filteredTypes = selectTypes(fullDefOfSelectedLib.typeDefs, minifiedSelectedLib); + + librariesWithTypes.push({ + name: fullDefOfSelectedLib.name, + description: fullDefOfSelectedLib.description, + typeDefs: filteredTypes, + services: fullDefOfSelectedLib.services, + clients: [] + }); + } catch (error) { + console.error(`Error processing library ${minifiedSelectedLib.libName}:`, error); + } + } + + return librariesWithTypes; +} + +function getLibraryByNameFromLibJson(libName: string, librariesJson: Library[]): Library | null { + return librariesJson.find(lib => lib.name === libName) || null; +} + +function selectTypes(fullDefOfSelectedLib: any[], minifiedSelectedLib: GetTypeResponse): any[] { + const typesResult = minifiedSelectedLib.types; + if (!typesResult) { + return []; + } + + const output: any[] = []; + + if (fullDefOfSelectedLib.length === 0) { + throw new Error("Complete type list is not available"); + } + + for (const miniType of typesResult) { + const miniTypeName = miniType.name; + + for (const item of fullDefOfSelectedLib) { + if (item.name === miniTypeName) { + output.push(item); + break; + } + } + } + + return output; +} + +async function getRequiredFunctions(libraries: string[], prompt: string, librariesJson: Library[]): Promise { + if (librariesJson.length === 0) { + return []; + } + const startTime = Date.now(); + + const libraryList: GetFunctionsRequest[] = librariesJson + .filter(lib => libraryContains(lib.name, libraries)) + .map(lib => ({ + name: lib.name, + description: lib.description, + clients: filteredClients(lib.clients), + functions: filteredNormalFunctions(lib.functions) + })); + + const largeLibs = libraryList.filter(lib => getClientFunctionCount(lib.clients) >= 100); + const smallLibs = libraryList.filter(lib => !largeLibs.includes(lib)); + + const suggestedFunctions: Promise[] = []; + + // Process large libraries individually + for (const funcItem of largeLibs) { + suggestedFunctions.push(getSuggestedFunctions(prompt, [funcItem])[0]); + } + + let collectiveResp: GetFunctionResponse[] = []; + + // Process small libraries in bulk + if (smallLibs.length !== 0) { + collectiveResp = await getSuggestedFunctions(prompt, smallLibs); + } + + // Wait for all individual large library processing + const individualResults = await Promise.all(suggestedFunctions); + collectiveResp.push(...individualResults); + + const endTime = Date.now(); + console.log(`Time taken to get the functions: ${(endTime - startTime) / 1000} seconds`); + + return collectiveResp; +} + +async function getSuggestedFunctions(prompt: string, libraryList: GetFunctionsRequest[]): Promise { + const getLibSystemPrompt = "You are an AI assistant tasked with filtering and removing unwanted functions and clients from a given set of libraries and clients based on a user query. Your goal is to return only the relevant libraries, clients, and functions that match the user's needs."; + const getLibUserPrompt = ` +You will be provided with a list of libraries, clients, and their functions and user query. + + +${prompt} + + + +${JSON.stringify(libraryList)} + + +To process the user query and filter the libraries, clients, and functions, follow these steps: + +1. Analyze the user query to understand the specific requirements or needs. +2. Review the list of libraries, clients, and their functions. +3. Identify which libraries, clients, and functions are relevant to the user query. +4. Remove any libraries, clients, and functions that are not directly related to the user's needs. +5. Organize the remaining relevant information. + +Ensure that you only include libraries, clients, and functions that are directly relevant to the user query. If no relevant results are found, return an empty array for the libraries. + +Now, based on the provided libraries, clients, and functions, and the user query, please filter and return the relevant information. +`; + + const messages: CoreMessage[] = [ + { role: "system", content: getLibSystemPrompt }, + { role: "user", content: getLibUserPrompt } + ]; + try { + const { object } = await generateObject({ + model: anthropic("claude-3-5-haiku-20241022"), + maxTokens: 8192, + temperature: 0, + messages: messages, + schema: getFunctionsResponseSchema + }); + + const libList = object as GetFunctionsResponse; + printSelectedFunctions(libList.libraries); + return libList.libraries; + } catch (error) { + throw new Error(`Failed to parse bulk functions response: ${error}`); + } +} + +function printSelectedFunctions(libraries: GetFunctionResponse[]): void { + console.log("Selected functions:", JSON.stringify(libraries, null, 2)); +} + +export function libraryContains(library: string, libraries: string[]): boolean { + return libraries.includes(library); +} + +function filteredClients(clients: Client[]): MinifiedClient[] { + return clients.map(cli => ({ + name: cli.name, + description: cli.description, + functions: filteredFunctions(cli.functions) + })); +} + +function filteredFunctions(functions: (RemoteFunction | ResourceFunction)[]): (MinifiedRemoteFunction | MinifiedResourceFunction)[] { + const output: (MinifiedRemoteFunction | MinifiedResourceFunction)[] = []; + + for (const item of functions) { + if ('accessor' in item) { // ResourceFunction + const res: MinifiedResourceFunction = { + accessor: item.accessor, + paths: item.paths, + parameters: item.parameters.map(param => param.name), + returnType: item.return.type.name + }; + output.push(res); + } else { // RemoteFunction + if (item.type !== "Constructor") { + const rem: MinifiedRemoteFunction = { + name: item.name, + parameters: item.parameters.map(param => param.name), + returnType: item.return.type.name + }; + output.push(rem); + } + } + } + + return output; +} + +function filteredNormalFunctions(functions?: RemoteFunction[]): MinifiedRemoteFunction[] | undefined { + if (!functions) { + return undefined; + } + + return functions.map(item => ({ + name: item.name, + parameters: item.parameters.map(param => param.name), + returnType: item.return.type.name + })); +} + +export async function getMaximizedSelectedLibs(libNames:string[], generationType: GenerationType): Promise { + const result = await langClient.getCopilotFilteredLibraries({ + libNames: libNames, + mode: getGenerationMode(generationType) + }) as { libraries: Library[] }; + return result.libraries as Library[]; +} + +export function toMaximizedLibrariesFromLibJson(functionResponses: GetFunctionResponse[], originalLibraries: Library[]): Library[] { + const maximizedLibraries: Library[] = []; + + for (const funcResponse of functionResponses) { + // Find the original library to get complete information + const originalLib = originalLibraries.find(lib => lib.name === funcResponse.name); + if (!originalLib) { + continue; + } + + const maximizedLib: Library = { + name: funcResponse.name, + description: originalLib.description, + typeDefs: originalLib.typeDefs, // Include all type definitions + clients: [], + functions: [], + services: originalLib.services + }; + + // Convert minified clients back to full clients + if (funcResponse.clients) { + for (const minClient of funcResponse.clients) { + const originalClient = originalLib.clients.find(c => c.name === minClient.name); + if (originalClient) { + const maximizedClient: Client = { + name: minClient.name, + description: originalClient.description, + functions: [] + }; + + // Convert minified functions back to full functions + for (const minFunc of minClient.functions) { + const originalFunc = originalClient.functions.find(f => { + if ('accessor' in minFunc && 'accessor' in f) { + return f.accessor === minFunc.accessor; + } else if ('name' in minFunc && 'name' in f) { + return f.name === minFunc.name; + } + return false; + }); + + if (originalFunc) { + maximizedClient.functions.push(originalFunc); + } + } + + maximizedLib.clients.push(maximizedClient); + } + } + } + + // Convert minified standalone functions back to full functions + if (funcResponse.functions && originalLib.functions) { + for (const minFunc of funcResponse.functions) { + const originalFunc = originalLib.functions.find(f => f.name === minFunc.name); + if (originalFunc) { + maximizedLib.functions!.push(originalFunc); + } + } + } + + maximizedLibraries.push(maximizedLib); + } + + return maximizedLibraries; +} + +function mergeLibrariesWithoutDuplicates(maximizedLibraries: Library[], typeLibraries: Library[]): Library[] { + const finalLibraries: Library[] = maximizedLibraries; + + for (const typeLib of typeLibraries) { + const finalLib = findLibraryByName(typeLib.name, finalLibraries); + if (finalLib) { + finalLib.typeDefs.push(...typeLib.typeDefs); + } else { + finalLibraries.push(typeLib); + } + } + + return finalLibraries; +} + +function findLibraryByName(name: string, libraries: Library[]): Library | null { + return libraries.find(lib => lib.name === name) || null; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs_inter_types.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs_inter_types.ts new file mode 100644 index 00000000000..aa4290ddf59 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs_inter_types.ts @@ -0,0 +1,136 @@ +import { jsonSchema } from 'ai'; + +export interface GetFunctionsRequest { + name: string; + description: string; + clients: MinifiedClient[]; + functions?: MinifiedRemoteFunction[]; +} + +export interface MinifiedClient { + name: string; + description?: string; + functions: (MinifiedRemoteFunction | MinifiedResourceFunction)[]; +} + +export interface MinifiedRemoteFunction extends MiniFunction { + name: string; +} + +export interface MiniFunction { + parameters?: string[]; + returnType?: string; +} + +export interface MinifiedResourceFunction extends MiniFunction { + accessor: string; + paths: (PathParameter | string)[]; +} + +export interface GetFunctionsResponse { + libraries: GetFunctionResponse[]; +} + +export interface GetFunctionResponse { + name: string; + clients?: MinifiedClient[]; + functions?: MinifiedRemoteFunction[]; +} + +export interface PathParameter { + name: string; + type: string; +} + +export const getFunctionsResponseSchema = jsonSchema({ + type: 'object', + properties: { + libraries: { + type: 'array', + items: { + type: 'object', + properties: { + name: { type: 'string' }, + clients: { + type: 'array', + items: { + type: 'object', + properties: { + name: { type: 'string' }, + description: { type: 'string' }, + functions: { + type: 'array', + items: { + oneOf: [ + { + type: 'object', + properties: { + name: { type: 'string' }, + parameters: { + type: 'array', + items: { type: 'string' } + }, + returnType: { type: 'string' } + }, + required: ['name'] + }, + { + type: 'object', + properties: { + accessor: { type: 'string' }, + paths: { + type: 'array', + items: { + oneOf: [ + { type: 'string' }, + { + type: 'object', + properties: { + name: { type: 'string' }, + type: { type: 'string' } + }, + required: ['name', 'type'] + } + ] + } + }, + parameters: { + type: 'array', + items: { type: 'string' } + }, + returnType: { type: 'string' } + }, + required: ['accessor', 'paths'] + } + ] + } + } + }, + required: ['name', 'functions'] + } + }, + functions: { + type: 'array', + items: { + type: 'object', + properties: { + name: { type: 'string' }, + parameters: { + type: 'array', + items: { type: 'string' } + }, + returnType: { type: 'string' } + }, + required: ['name'] + } + } + }, + required: ['name'] + } + } + }, + required: ['libraries'] +}); + + + 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 new file mode 100644 index 00000000000..68177b1d013 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/langlibs.ts @@ -0,0 +1,4 @@ +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 new file mode 100644 index 00000000000..16f44d1bb3b --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts @@ -0,0 +1,107 @@ +import { generateObject, CoreMessage } from "ai"; +import { z } from "zod"; +import { MinifiedLibrary, RelevantLibrariesAndFunctionsRequest, RelevantLibrariesAndFunctionsResponse } from "@wso2/ballerina-core"; +import { BACKEND_URL } from "../../utils"; +import { Library } from "./libs_types"; +import { selectRequiredFunctions } from "./funcs"; +import { anthropic } from "../connection"; +import { langClient } from "../../activator"; +import { getGenerationMode } from "../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 messages: CoreMessage[] = [ + { role: "system", content: getSystemPrompt() }, + { role: "user", content: getUserPrompt(prompt, allLibraries, generationType) }, + ]; + //TODO: Add thinking and test with claude haiku + const { object } = await generateObject({ + model: anthropic("claude-3-5-haiku-20241022"), + maxTokens: 4096, + temperature: 0, + messages: messages, + schema: LibraryListSchema + }); + + console.log("Selected libraries:", object.libraries); + return object.libraries; +} + +function getSystemPrompt(): 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.`; +} + +function getUserPrompt(prompt: string, libraryList: MinifiedLibrary[], generationType: GenerationType): string { + return ` +# Library Context JSON +${JSON.stringify(libraryList)} +# 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.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/libs/libs_types.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs_types.ts new file mode 100644 index 00000000000..1725f2047a7 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs_types.ts @@ -0,0 +1,206 @@ +// TypeScript interfaces corresponding to Ballerina types + +import { jsonSchema } from "ai"; + +export interface Type { + name: string; + links?: Link[]; +} + +export interface Link { + category: Category; + recordName: string; + libraryName?: string; +} + +export type Category = "internal" | "external"; + +export interface Parameter { + name: string; + description: string; + type: Type; + default?: string; +} + +export interface ParameterDef { + description: string; + type: Type; + default?: string; + optional: boolean; +} + +export interface Return { + description?: string; + type: Type; +} + +export interface EnumValue { + name: string; + description: string; +} + +export interface Field { + name: string; + description: string; + type: Type; + default?: string; +} + +export interface UnionValue { + name: string; + type: Type; +} + +export interface PathParameter { + name: string; + type: string; +} + +export interface TypeDefinitionBase { + name: string; + description: string; + type: string; +} + +export interface ConstantTypeDefinition extends TypeDefinitionBase { + value: string; + varType: Type; +} + +export interface RecordTypeDefinition extends TypeDefinitionBase { + fields: Field[]; +} + +export interface EnumTypeDefinition extends TypeDefinitionBase { + members: EnumValue[]; +} + +export interface UnionTypeDefinition extends TypeDefinitionBase { + members: UnionValue[]; +} + +export interface ClassTypeDefinition extends TypeDefinitionBase { + functions: any[]; +} + +export type TypeDefinition = + | RecordTypeDefinition + | EnumTypeDefinition + | UnionTypeDefinition + | ClassTypeDefinition + | TypeDefinitionBase + | ConstantTypeDefinition; + +export interface AbstractFunction { + type: string; + description: string; + parameters: Parameter[]; + return: Return; +} + +export interface ResourceFunction extends AbstractFunction { + accessor: string; + paths: (PathParameter | string)[]; +} + +export interface RemoteFunction extends AbstractFunction { + name: string; +} + +export interface ServiceRemoteFunction { + type: "remote" | "resource"; + description: string; + parameters: ParameterDef[]; + return: Return; + optional: boolean; +} + +export interface Client { + name: string; + description: string; + functions: (RemoteFunction | ResourceFunction)[]; +} + +export interface Listener { + name: string; + parameters: Parameter[]; +} + +export interface Service { + listener: Listener; + type: "generic" | "fixed"; +} + +export interface GenericService extends Service { + instructions: string; + type: "generic"; +} + +export interface FixedService extends Service { + type: "fixed"; + methods: ServiceRemoteFunction[]; +} + +export interface Library { + name: string; + description: string; + typeDefs: TypeDefinition[]; + clients: Client[]; + functions?: RemoteFunction[]; + services?: Service[]; +} + + +export interface LibraryWithUrl extends Library { + library_link: string; +} + +export interface MiniType { + name: string; + description: string; +} + +export interface GetTypesRequest { + name: string; + description: string; + types: MiniType[]; + +} + +export interface GetTypeResponse { + libName: string; + types: MiniType[]; +} + +export interface GetTypesResponse { + libraries: GetTypeResponse[]; +} + + +export const getTypesResponseSchema = jsonSchema({ + type: 'object', + properties: { + libraries: { + type: 'array', + items: { + type: 'object', + properties: { + libName: { type: 'string' }, + types: { + type: 'array', + items: { + type: 'object', + properties: { + name: { type: 'string' }, + description: { type: 'string' } + }, + required: ['name', 'description'] + } + } + }, + required: ['libName', 'types'] + } + } + }, + required: ['libraries'] +}); diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts new file mode 100644 index 00000000000..28c9b6371b0 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts @@ -0,0 +1,102 @@ +import { ChatEntry, ChatNotify, GenerateOpenAPIRequest, onChatNotify } from "@wso2/ballerina-core"; +import { CreateMessageRequest, Message, MessageRole, SystemMessage, TextBlock } from "../types"; +import { BACKEND_URL } from "../../utils"; +import { RPCLayer } from "../../../../../src/RPCLayer"; +import { AiPanelWebview } from "../../../../views/ai-panel/webview"; +import { CoreMessage, generateText, streamText } from "ai"; +import { anthropic } from "../connection"; +import { getErrorMessage, populateHistory } from "../utils"; +import { CopilotEventHandler, createWebviewEventHandler } from "../event"; + +// Core OpenAPI generation function that emits events +export async function generateOpenAPISpecCore(params: GenerateOpenAPIRequest, eventHandler: CopilotEventHandler): Promise { + // Populate chat history and add user message + const historyMessages = populateHistory(params.chatHistory); + + try { + const { fullStream } = streamText({ + model: anthropic("claude-3-5-haiku-20241022"), + maxTokens: 8192, + temperature: 0, + messages: [ + { + role: "system", + content: getSystemPrompt(), + providerOptions: { + anthropic: { cacheControl: { type: "ephemeral" } }, + }, + }, + ...historyMessages, + { + role: "user", + content: getUserPrompt(params.query), + }, + ], + }); + + eventHandler({ type: 'start' }); + + for await (const part of fullStream) { + switch (part.type) { + case "text-delta": { + const textPart = part.textDelta; + eventHandler({ type: 'content_block', content: textPart }); + break; + } + case "error": { + const error = part.error; + console.error("Error during OpenAPI generation:", error); + eventHandler({ type: 'error', content:getErrorMessage(error) }); + break; + } + case "finish": { + const finishReason = part.finishReason; + eventHandler({ type: 'stop'}); + break; + } + } + } + } catch (error) { + console.log("Error during OpenAPI generation:", error); + eventHandler({ type: 'error', content: getErrorMessage(error) }); + } +} + + +// Main public function that uses the default event handler +export async function generateOpenAPISpec(params: GenerateOpenAPIRequest): Promise { + const eventHandler = createWebviewEventHandler(); + await generateOpenAPISpecCore(params, eventHandler); +} + +function getSystemPrompt() { + return `You are an expert architect who specializes in API Design. +For a given user scenario, you need to design the optimal OpenAPI Specification. + +Think step by step to design the perfect OpenAPI Spec. +1. Analyze the given scenario and understand the scenario. +2. Identify the resources, input types, and output types needed. +3. Write the OpenAPI Spec according to REST conventions. + +Politely reject any queries which are not related to OpenAPI Specification Design. + +* Always generate the Complete self contained OpenAPI Spec even if the user ask to modify part of the spec. + +Begin with a short description on the response and end with the OpenAPI spec. + +Example Output: +Short description about the response. + +${"```"}yaml +//openapi spec goes here +${"```"} + +`; +} + +function getUserPrompt(query: string): string { + return `User Scenario: +${query}`; +} + + 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 new file mode 100644 index 00000000000..4d59282715a --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/function_tests.ts @@ -0,0 +1,84 @@ +import { TestGenerationTarget, TestGeneratorIntermediaryState } from "@wso2/ballerina-core"; +import { getErrorMessage } from "../utils"; +import { generateTest, getDiagnostics } from "../../testGenerator"; +import { BACKEND_URL } from "../../utils"; +import { getBallerinaProjectRoot } from "../../../../rpc-managers/ai-panel/rpc-manager"; +import { URI } from "vscode-uri"; +import * as fs from 'fs'; +import { CopilotEventHandler, createWebviewEventHandler } from "../event"; + + +// Core function test generation that emits events +export async function generateFunctionTestsCore(params: TestGeneratorIntermediaryState, eventHandler: CopilotEventHandler): Promise { + const testPath = "tests/test.bal"; + const functionIdentifier = params.resourceFunction; + + try { + 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.` }); + + const projectRoot = await getBallerinaProjectRoot(); + const response = await generateTest(projectRoot, { + backendUri: BACKEND_URL, + 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(projectRoot, { + 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(projectRoot, { + backendUri: BACKEND_URL, + 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' }); + } catch (error) { + console.error("Error during function test generation:", error); + eventHandler({ type: 'error', content: getErrorMessage(error) }); + } +} + +// Main public function that uses the default event handler +export async function generateFunctionTests(params: TestGeneratorIntermediaryState): Promise { + const eventHandler = createWebviewEventHandler(); + await generateFunctionTestsCore(params, eventHandler); +} 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 new file mode 100644 index 00000000000..561195e9edd --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/prompts.ts @@ -0,0 +1,770 @@ +import { TestGenerationRequest1, ProjectSource, Diagnostic } from "./test"; +import { CoreMessage } 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): CoreMessage[] { + 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): CoreMessage { + 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(): CoreMessage { + return { + role: "assistant", + content: getServiceTestGenAssistant1Prompt() + }; +} + +export function createServiceTestGenUser2Message(request: TestGenerationRequest1): CoreMessage { + const prompt = request.testPlan + ? getServiceTestGenUser2WithPlanPrompt(request.targetIdentifier, request.testPlan) + : getServiceTestGenUser2Prompt(request.targetIdentifier); + + return { + role: "user", + content: prompt + }; +} + +export function createServiceTestDiagnosticsAssistant1Message(request: TestGenerationRequest1): CoreMessage { + return { + role: "assistant", + content: getServiceTestDiagnosticsAssistant1Prompt() + }; +} + +export function createServiceTestDiagnosticsUser2Message(request: TestGenerationRequest1): CoreMessage { + 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): CoreMessage[] { + const functionTestGenUser = createFunctionTestGenUserMessage(request); + return [functionTestGenUser]; +} + +export function createFunctionTestGenUserMessage(request: TestGenerationRequest1): CoreMessage { + 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 new file mode 100644 index 00000000000..2c367874de5 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts @@ -0,0 +1,109 @@ +import { generateText, CoreMessage } from "ai"; +import { anthropic } from "../connection"; +import { + getServiceTestGenerationSystemPrompt, + getServiceTestDiagnosticsSystemPrompt, + getFunctionTestGenerationSystemPrompt, + createServiceTestGenMessages, + createFunctionTestGenMessages +} from "./prompts"; +import { + extractCodeFromResponse, + extractConfigFromResponse +} from "./utils"; +import { CopilotEventHandler, createWebviewEventHandler } from "../event"; +import { getErrorMessage } from "../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(); + 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: CoreMessage[] = []; + + 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'.`); + } + + const { text } = await generateText({ + model: anthropic("claude-sonnet-4-20250514"), + maxTokens: 16384, + system: systemPrompt, + messages: messages + }); + + 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 new file mode 100644 index 00000000000..5dec6afa5e1 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test_plan.ts @@ -0,0 +1,342 @@ +import { CoreMessage, streamText } from "ai"; +import { anthropic } from "../connection"; +import { getErrorMessage } from "../utils"; +import { TestGenerationTarget, TestPlanGenerationRequest } from "@wso2/ballerina-core"; +import { generateTest, getDiagnostics } from "../../testGenerator"; +import { getBallerinaProjectRoot } from "../../../../rpc-managers/ai-panel/rpc-manager"; +import { BACKEND_URL } from "../../utils"; +import { CopilotEventHandler, createWebviewEventHandler } from "../event"; + +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: CoreMessage[] = [ + { + role: "system", + content: systemPrompt, + }, + { + role: "user", + content: userPrompt, + }, + ]; + + try { + const { fullStream } = streamText({ + model: anthropic("claude-3-5-sonnet-20241022"), + maxTokens: 4096, + temperature: 0, + messages: allMessages, + }); + + 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.textDelta; + 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.` }); + const projectRoot = await getBallerinaProjectRoot(); + const testResp = await generateTest(projectRoot, { + backendUri: BACKEND_URL, + targetType: TestGenerationTarget.Service, + targetIdentifier: target, + testPlan: assistantResponse + }); + eventHandler({ type: 'content_block', content: `\nAnalyzing generated tests for potential issues.` }); + const diagnostics = await getDiagnostics(projectRoot, 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(projectRoot, { + backendUri: BACKEND_URL, + 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' }); + } else { + eventHandler({ type: 'content_block', content: `\n\n` }); + eventHandler({ type: 'intermediary_state', state: { + resourceFunction: target, + testPlan: assistantResponse, + }}); + } + break; + } + } + } + } catch (error) { + console.error("Error during test plan generation:", error); + eventHandler({ type: 'error', content: getErrorMessage(error) }); + } +} + +// Main public function that uses the default event handler +export async function generateTestPlan(params: TestPlanGenerationRequest): Promise { + const eventHandler = createWebviewEventHandler(); + await generateTestPlanCore(params, eventHandler); +} + +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 new file mode 100644 index 00000000000..98f394efb65 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/utils.ts @@ -0,0 +1,121 @@ +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 new file mode 100644 index 00000000000..5e925c98f11 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/types.ts @@ -0,0 +1,105 @@ +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/service/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts new file mode 100644 index 00000000000..eb2178db7fa --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts @@ -0,0 +1,185 @@ +import { + ChatEntry, + ChatError, + ChatNotify, + ChatStart, + DiagnosticEntry, + GenerateCodeRequest, + IntermidaryState, + onChatNotify, + ProjectSource, + SourceFiles, + TestGeneratorIntermediaryState, +} from "@wso2/ballerina-core"; +import { CoreMessage } from "ai"; +import { MessageRole } from "./types"; +import { RPCLayer } from "../../../../src/RPCLayer"; +import { AiPanelWebview } from "../../../views/ai-panel/webview"; +import { GenerationType } from "./libs/libs"; + +export function populateHistory(chatHistory: ChatEntry[]): CoreMessage[] { + if (!chatHistory || chatHistory.length === 0) { + return []; + } + + const messages: CoreMessage[] = []; + for (const history of chatHistory) { + // Map actor to role, defaulting to "user" if not "assistant" + const role: MessageRole = history.actor === "assistant" ? "assistant" : "user"; + + messages.push({ + role: role, + content: history.message, + }); + } + return messages; +} + +export function transformProjectSource(project: ProjectSource): SourceFiles[] { + const sourceFiles: SourceFiles[] = []; + project.sourceFiles.forEach((file) => { + sourceFiles.push({ + filePath: file.filePath, + content: file.content, + }); + }); + project.projectModules?.forEach((module) => { + let basePath = ""; + if (!module.isGenerated) { + basePath += "modules/"; + } else { + basePath += "generated/"; + } + + basePath += module.moduleName + "/"; + // const path = + module.sourceFiles.forEach((file) => { + sourceFiles.push({ + filePath: basePath + file.filePath, + content: file.content, + }); + }); + }); + return sourceFiles; +} + +//TODO: This should be a query rewriter ideally. +export function getReadmeQuery(params: GenerateCodeRequest, sourceFiles: SourceFiles[]) { + const prompt = params.usecase; + if (!prompt.toLowerCase().includes("readme")) { + return prompt; + } + + 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", + messages: messages, + }; + sendAIPanelNotification(msg); +} + +export function sendDiagnosticMessageNotification(diags: DiagnosticEntry[]): void { + const msg: ChatNotify = { + type: "diagnostics", + diagnostics: diags, + }; + sendAIPanelNotification(msg); +} + +export function sendContentReplaceNotification(content: string): void { + const msg: ChatNotify = { + type: "content_replace", + content: content, + }; + sendAIPanelNotification(msg); +} + +export function sendContentAppendNotification(chunk: string): void { + const msg: ChatNotify = { + type: "content_block", + content: chunk, + }; + sendAIPanelNotification(msg); +} + +export function sendMessageStopNotification(): void { + const msg: ChatNotify = { + type: "stop", + }; + sendAIPanelNotification(msg); +} + +export function sendErrorNotification(errorMessage: string): void { + const msg: ChatError = { + type: "error", + content: errorMessage, + }; + sendAIPanelNotification(msg); +} + +export function sendMessageStartNotification(): void { + const msg: ChatStart = { + type: "start", + }; + sendAIPanelNotification(msg); +} + +export function sendTestGenIntermidateStateNotification(testGenState: TestGeneratorIntermediaryState): void { + const msg: IntermidaryState = { + type: "intermediary_state", + state: testGenState, + }; + sendAIPanelNotification(msg); +} + +function sendAIPanelNotification(msg: ChatNotify): void { + RPCLayer._messenger.sendNotification(onChatNotify, { type: "webview", webviewType: AiPanelWebview.viewType }, msg); +} + +export function getGenerationMode(generationType: GenerationType) { + return generationType === GenerationType.CODE_GENERATION ? "CORE" : "HEALTHCARE"; +} + +/** + * Normalize any thrown value into a string message. + */ +export function getErrorMessage(error: unknown): string { + if (error instanceof Error) { + // Standard Error objects have a .message property + if (error.name === "AI_RetryError") { + return "An error occured connecting with the AI service. Please try again later."; + } + + return error.message; + } + // If it’s an object with a .message field, use that + if ( + typeof error === "object" && + error !== null && + "message" in error && + typeof (error as Record).message === "string" + ) { + return (error as { message: string }).message; + } + // Fallback: try to JSON-stringify, otherwise call toString() + try { + return JSON.stringify(error); + } catch { + return String(error); + } +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/testGenerator.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/testGenerator.ts index cf9b6db4cd0..9905ee9a08f 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/testGenerator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/testGenerator.ts @@ -28,6 +28,7 @@ import * as os from 'os'; import { writeBallerinaFileDidOpen } from '../../utils/modification'; import { fetchData } from '../../rpc-managers/ai-panel/utils/fetch-data-utils'; import { closeAllBallerinaFiles } from './utils'; +import { generateTestFromLLM, TestGenerationRequest1 } from './service/test/test'; const TEST_GEN_REQUEST_TIMEOUT = 100000; @@ -35,7 +36,7 @@ const TEST_GEN_REQUEST_TIMEOUT = 100000; export async function generateTest( projectRoot: string, testGenRequest: TestGenerationRequest, - abortController: AbortController + abortController: AbortController = null ): Promise { const projectSource = await getProjectSource(projectRoot); if (!projectSource) { @@ -368,18 +369,14 @@ async function getOpenAPISpecification(documentFilePath: string): Promise { try { let response = await sendTestGeneRequest(request, projectSource, abortController, openApiSpec); - if (isErrorCode(response)) { - return (response as ErrorCode); - } - response = (response as Response); - return await filterTestGenResponse(response); + return response; } catch (error) { return UNKNOWN_ERROR; } } -async function sendTestGeneRequest(request: TestGenerationRequest, projectSource: ProjectSource, abortController: AbortController, openApiSpec?: string): Promise { - const body = { +async function sendTestGeneRequest(request: TestGenerationRequest, projectSource: ProjectSource, abortController: AbortController, openApiSpec?: string): Promise { + const body:TestGenerationRequest1 = { targetType: request.targetType, targetIdentifier: request.targetIdentifier, projectSource: { @@ -405,16 +402,17 @@ async function sendTestGeneRequest(request: TestGenerationRequest, projectSource ...(request.existingTests && { existingTests: request.existingTests }), }; - const response = await fetchWithTimeout(request.backendUri + "/tests", { - method: "POST", - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json', - 'User-Agent': 'Ballerina-VSCode-Plugin' - }, - body: JSON.stringify(body) - }, abortController, TEST_GEN_REQUEST_TIMEOUT); - return response; + // const response = await fetchWithTimeout(request.backendUri + "/tests", { + // method: "POST", + // headers: { + // 'Accept': 'application/json', + // 'Content-Type': 'application/json', + // 'User-Agent': 'Ballerina-VSCode-Plugin' + // }, + // body: JSON.stringify(body) + // }, abortController, TEST_GEN_REQUEST_TIMEOUT); + const resp: TestGenerationResponse = await generateTestFromLLM(body); + return resp; } function getErrorDiagnostics(diagnostics: Diagnostics[], filePath: string): ProjectDiagnostics { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts index 2fe4cad6e2a..06eb1ec0759 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts @@ -28,6 +28,9 @@ export const AUTH_ORG : string = config.get('authOrg') || process.env.BALLERINA_ export const AUTH_CLIENT_ID : string = config.get('authClientID') || process.env.BALLERINA_AUTH_CLIENT_ID; export const AUTH_REDIRECT_URL : string = config.get('authRedirectURL') || process.env.BALLERINA_AUTH_REDIRECT_URL; +// Add new config exports for other services +export const LIBS_URL : string = "https://e95488c8-8511-4882-967f-ec3ae2a0f86f-dev.e1-us-east-azure.choreoapis.dev/ballerina-copilot/libs-api/v1.0"; + export async function closeAllBallerinaFiles(dirPath: string): Promise { // Check if the directory exists if (!fs.existsSync(dirPath)) { 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 12bd848d933..4c9c1b4e12c 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 @@ -16,36 +16,34 @@ * under the License. */ import { - AIChatSummary, - AddToProjectRequest, - DeleteFromProjectRequest, - DeveloperDocument, - FetchDataRequest, - GenerateMappingsFromRecordRequest, - GenerateMappingsRequest, - GenerateTypesFromRecordRequest, - GetFromFileRequest, - GetModuleDirParams, - NotifyAIMappingsRequest, - PostProcessRequest, - ProjectSource, - RequirementSpecification, - SubmitFeedbackRequest, - TestGenerationRequest, - TestGenerationResponse, abortTestGeneration, addChatSummary, addToProject, + AddToProjectRequest, + AIChatSummary, applyDoOnFailBlocks, checkSyntaxError, clearInitialPrompt, createTestDirecoryIfNotExists, deleteFromProject, + DeleteFromProjectRequest, + DeveloperDocument, fetchData, + FetchDataRequest, + generateCode, + GenerateCodeRequest, + generateFunctionTests, + generateHealthcareCode, generateMappings, - getAIMachineSnapshot, + GenerateMappingsFromRecordRequest, + GenerateMappingsRequest, + generateOpenAPI, + GenerateOpenAPIRequest, + generateTestPlan, + GenerateTypesFromRecordRequest, getAccessToken, getActiveFile, + getAIMachineSnapshot, getBackendUrl, getContentFromFile, getDefaultPrompt, @@ -53,12 +51,15 @@ import { getFileExists, getFromDocumentation, getFromFile, + GetFromFileRequest, getGeneratedTests, getMappingsFromRecord, getModuleDirectory, + GetModuleDirParams, getProjectSource, getProjectUuid, getRefreshedAccessToken, + getRelevantLibrariesAndFunctions, getResourceMethodAndPaths, getResourceSourceForMethodAndPath, getServiceNames, @@ -72,13 +73,25 @@ import { isRequirementsSpecificationFileExist, markAlertShown, notifyAIMappings, + NotifyAIMappingsRequest, postProcess, + PostProcessRequest, + ProjectSource, promptGithubAuthorize, promptWSO2AILogout, readDeveloperMdFile, + RelevantLibrariesAndFunctionsRequest, + repairGeneratedCode, + RepairParams, + RequirementSpecification, showSignInAlert, stopAIMappings, submitFeedback, + SubmitFeedbackRequest, + TestGenerationRequest, + TestGenerationResponse, + TestGeneratorIntermediaryState, + TestPlanGenerationRequest, updateDevelopmentDocument, updateRequirementSpecification } from "@wso2/ballerina-core"; @@ -135,4 +148,11 @@ export function registerAiPanelRpcHandlers(messenger: Messenger) { messenger.onRequest(getModuleDirectory, (args: GetModuleDirParams) => rpcManger.getModuleDirectory(args)); messenger.onRequest(getContentFromFile, (args: GetFromFileRequest) => rpcManger.getContentFromFile(args)); 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)); } 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 94063c1cd20..a62fae16cc2 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 @@ -32,10 +32,12 @@ import { Diagnostics, FetchDataRequest, FetchDataResponse, + GenerateCodeRequest, GenerateMappingFromRecordResponse, GenerateMappingsFromRecordRequest, GenerateMappingsRequest, GenerateMappingsResponse, + GenerateOpenAPIRequest, GenerateTypesFromRecordRequest, GenerateTypesFromRecordResponse, GetFromFileRequest, @@ -47,15 +49,19 @@ import { ProjectDiagnostics, ProjectModule, ProjectSource, + RelevantLibrariesAndFunctionsRequest, + RelevantLibrariesAndFunctionsResponse, + RepairParams, RequirementSpecification, - STModification, SourceFile, SubmitFeedbackRequest, SyntaxTree, TemplateId, TestGenerationMentions, TestGenerationRequest, - TestGenerationResponse + TestGenerationResponse, + TestGeneratorIntermediaryState, + TestPlanGenerationRequest } from "@wso2/ballerina-core"; import { STKindChecker, STNode } from "@wso2/syntax-tree"; import * as crypto from 'crypto'; @@ -65,19 +71,26 @@ import path from "path"; import { parse } from 'toml'; import { Uri, commands, window, workspace } from 'vscode'; -import { writeFileSync } from "fs"; import { isNumber } from "lodash"; import { URI } from "vscode-uri"; +import { generateOpenAPISpec } from "../../../src/features/ai/service/openapi/openapi"; import { AIStateMachine } from "../../../src/views/ai-panel/aiMachine"; import { extension } from "../../BalExtensionContext"; import { NOT_SUPPORTED } from "../../core"; import { generateDataMapping, generateTypeCreation } from "../../features/ai/dataMapping"; +import { generateCode, triggerGeneratedCodeRepair } from "../../features/ai/service/code/code"; +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 { BACKEND_URL, closeAllBallerinaFiles } from "../../features/ai/utils"; import { getLLMDiagnosticArrayAsString, handleChatSummaryFailure } from "../../features/natural-programming/utils"; import { StateMachine, updateView } from "../../stateMachine"; import { getAccessToken, getRefreshedAccessToken, loginGithubCopilot } from "../../utils/ai/auth"; import { modifyFileContent, writeBallerinaFileDidOpen } from "../../utils/modification"; +import { updateSourceCode } from "../../utils/source-utils"; import { PARSING_ERROR, UNKNOWN_ERROR } from "../../views/ai-panel/errorCodes"; import { DEVELOPMENT_DOCUMENT, @@ -89,7 +102,7 @@ import { import { attemptRepairProject, checkProjectDiagnostics } from "./repair-utils"; import { cleanDiagnosticMessages, handleStop, isErrorCode, requirementsSpecification, searchDocumentation } from "./utils"; import { fetchData } from "./utils/fetch-data-utils"; -import { updateSourceCode } from "../../utils/source-utils"; +import { generateHealthcareCode } from "../../features/ai/service/healthcare/healthcare"; export let hasStopped: boolean = false; @@ -347,39 +360,7 @@ export class AiPanelRpcManager implements AIPanelAPI { } async getProjectSource(requestType: string): Promise { - // Fetch the Ballerina project source - const project: BallerinaProject = await getCurrentProjectSource(requestType); - - // Initialize the ProjectSource object - const projectSource: ProjectSource = { - sourceFiles: [], - projectModules: [], - projectName: project.projectName, - }; - - // 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)) { - // const filePath = `modules/${module.moduleName}/${fileName}`; - // projectSource.sourceFiles.push({ filePath, content }); - projectModule.sourceFiles.push({ filePath: fileName, content }); - } - projectSource.projectModules.push(projectModule); - } - } - - return projectSource; + return getProjectSource(requestType); } async getShadowDiagnostics(project: ProjectSource): Promise { @@ -528,27 +509,7 @@ export class AiPanelRpcManager implements AIPanelAPI { } async postProcess(req: PostProcessRequest): Promise { - let assist_resp = req.assistant_response; - assist_resp = assist_resp.replace(/import ballerinax\/client\.config/g, "import ballerinax/'client.config"); - const project: ProjectSource = getProjectFromResponse(assist_resp); - const environment = await setupProjectEnvironment(project); - if (!environment) { - return { assistant_response: assist_resp, diagnostics: { diagnostics: [] } }; - } - - const { langClient, tempDir } = environment; - // check project diagnostics - let remainingDiags: Diagnostics[] = await attemptRepairProject(langClient, tempDir); - - const filteredDiags: DiagnosticEntry[] = getErrorDiagnostics(remainingDiags); - const newAssistantResponse = getModifiedAssistantResponse(assist_resp, tempDir, project); - await closeAllBallerinaFiles(tempDir); - return { - assistant_response: newAssistantResponse, - diagnostics: { - diagnostics: filteredDiags - } - }; + return await postProcess(req); } async applyDoOnFailBlocks(): Promise { @@ -796,6 +757,38 @@ 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 repairGeneratedCode(params: RepairParams): Promise { + await triggerGeneratedCodeRepair(params); + } + + async generateTestPlan(params: TestPlanGenerationRequest): Promise { + await generateTestPlan(params); + } + + async generateFunctionTests(params: TestGeneratorIntermediaryState): Promise { + await generateFunctionTests(params); + } + + async generateHealthcareCode(params: GenerateCodeRequest): Promise { + await generateHealthcareCode(params); + } } function getModifiedAssistantResponse(originalAssistantResponse: string, tempDir: string, project: ProjectSource): string { @@ -1007,7 +1000,7 @@ async function populateModules(modulesDir: string, project: BallerinaProject) { } } -async function getBallerinaProjectRoot(): Promise { +export async function getBallerinaProjectRoot(): Promise { const workspaceFolders = workspace.workspaceFolders; if (!workspaceFolders) { @@ -1023,3 +1016,65 @@ async function getBallerinaProjectRoot(): Promise { } return null; } + + +export async function postProcess(req: PostProcessRequest): Promise { + let assist_resp = req.assistant_response; + assist_resp = assist_resp.replace(/import ballerinax\/client\.config/g, "import ballerinax/'client.config"); + const project: ProjectSource = getProjectFromResponse(assist_resp); + const environment = await setupProjectEnvironment(project); + if (!environment) { + return { assistant_response: assist_resp, diagnostics: { diagnostics: [] } }; + } + + const { langClient, tempDir } = environment; + // check project diagnostics + let remainingDiags: Diagnostics[] = await attemptRepairProject(langClient, tempDir); + + const filteredDiags: DiagnosticEntry[] = getErrorDiagnostics(remainingDiags); + const newAssistantResponse = getModifiedAssistantResponse(assist_resp, tempDir, project); + await closeAllBallerinaFiles(tempDir); + return { + assistant_response: newAssistantResponse, + diagnostics: { + diagnostics: filteredDiags + } + }; +} + + + export async function getProjectSource(requestType: string): Promise { + // Fetch the Ballerina project source + const project: BallerinaProject = await getCurrentProjectSource(requestType); + + // Initialize the ProjectSource object + const projectSource: ProjectSource = { + sourceFiles: [], + projectModules: [], + projectName: project.projectName, + }; + + // 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)) { + // const filePath = `modules/${module.moduleName}/${fileName}`; + // projectSource.sourceFiles.push({ filePath, content }); + projectModule.sourceFiles.push({ filePath: fileName, content }); + } + projectSource.projectModules.push(projectModule); + } + } + + return projectSource; + } 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 ea29d62788d..962a1e35754 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 @@ -42,6 +42,10 @@ import { BACKEND_URL } from "../../features/ai/utils"; import { getAccessToken, getRefreshedAccessToken } from "../../../src/utils/ai/auth"; import { AIStateMachine } from "../../../src/views/ai-panel/aiMachine"; import { AIChatError } from "./utils/errors"; +import { generateAutoMappings } from "../../../src/features/ai/service/datamapper/datamapper"; +import { DatamapperResponse, Payload } from "../../../src/features/ai/service/datamapper/types"; +import { DataMapperRequest, DataMapperResponse, FileData, processDataMapperInput } from "../../../src/features/ai/service/datamapper/context_api"; +import { getAskResponse } from "../../../src/features/ai/service/ask/ask"; const BACKEND_BASE_URL = BACKEND_URL.replace(/\/v2\.0$/, ""); //TODO: Temp workaround as custom domain seem to block file uploads @@ -1281,32 +1285,9 @@ export async function getDatamapperCode(parameterDefinitions: ErrorCode | Parame console.error(error); return NOT_LOGGED_IN; }); - let response = await sendDatamapperRequest(parameterDefinitions, accessToken); - if (isErrorCode(response)) { - return (response as ErrorCode); - } - - response = (response as Response); + let response: DatamapperResponse = await sendDatamapperRequest(parameterDefinitions, accessToken); - // Refresh - if (response.status === 401) { - const newAccessToken = await getRefreshedAccessToken(); - if (!newAccessToken) { - AIStateMachine.service().send(AIMachineEventType.LOGOUT); - return; - } - let retryResponse: Response | ErrorCode = await sendDatamapperRequest(parameterDefinitions, newAccessToken); - - if (isErrorCode(retryResponse)) { - return (retryResponse as ErrorCode); - } - - retryResponse = (retryResponse as Response); - let intermediateMapping = await filterResponse(retryResponse); - let finalCode = await generateBallerinaCode(intermediateMapping, parameterDefinitions, "", nestedKeyArray); - return finalCode; - } - let intermediateMapping = await filterResponse(response); + let intermediateMapping = response.mappings; let finalCode = await generateBallerinaCode(intermediateMapping, parameterDefinitions, "", nestedKeyArray); return finalCode; } catch (error) { @@ -1357,45 +1338,23 @@ export function notifyNoGeneratedMappings() { window.showInformationMessage(msg); } -async function sendDatamapperRequest(parameterDefinitions: ParameterMetadata | ErrorCode, accessToken: string | ErrorCode): Promise { - const response = await fetchWithTimeout(BACKEND_URL + "/datamapper", { - method: "POST", - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json', - 'User-Agent': 'Ballerina-VSCode-Plugin', - 'Authorization': 'Bearer ' + accessToken - }, - body: JSON.stringify(parameterDefinitions) - }, REQUEST_TIMEOUT); - - return response; -} - -async function sendMappingFileUploadRequest(file: Blob): Promise { - const formData = new FormData(); - formData.append("file", file); - const response = await fetchWithToken(CONTEXT_UPLOAD_URL_V1 + "/file_upload/generate_mapping_instruction", { - method: "POST", - body: formData - }); +async function sendDatamapperRequest(parameterDefinitions: ParameterMetadata | ErrorCode, accessToken: string | ErrorCode): Promise { + const response : DatamapperResponse= await generateAutoMappings(parameterDefinitions as Payload); return response; } export async function searchDocumentation(message: string): Promise { - const response = await fetchWithToken(ASK_API_URL_V1 + "/documentation-assistant", { - method: "POST", - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - "query": `${message}` - }) - }); + const resp = await getAskResponse(message,); + const finalResponse = resp.content.replace(/[\s\S]*?<\/thinking>/g, ''); + const referenceSources = resp.references; + let responseContent: string; + if (referenceSources.length > 0) { + responseContent = `${finalResponse} \nreference sources: \n${referenceSources.join(' \n')}`; + }else{ + responseContent = finalResponse; + } - return await filterDocumentation(response as Response); - + return responseContent; } export async function filterDocumentation(resp: Response): Promise { @@ -1439,59 +1398,22 @@ async function filterMappingResponse(resp: Response): Promise } } -export async function getMappingFromFile(file: Blob): Promise { - try { - let response = await sendMappingFileUploadRequest(file); - if (isErrorCode(response)) { - return response as ErrorCode; - } - response = response as Response; - let mappingContent = JSON.parse((await filterMappingResponse(response)) as string); - if (isErrorCode(mappingContent)) { - return mappingContent as ErrorCode; - } - return mappingContent; - } catch (error) { - console.error(error); - return TIMEOUT; - } -} - -async function sendTypesFileUploadRequest(file: Blob): Promise { - const formData = new FormData(); - formData.append("file", file); - const response = await fetchWithToken(CONTEXT_UPLOAD_URL_V1 + "/file_upload/generate_record", { - method: "POST", - body: formData - }); - return response; -} - -export async function getTypesFromFile(file: Blob): Promise { - try { - let response = await sendTypesFileUploadRequest(file); - if (isErrorCode(response)) { - return response as ErrorCode; - } - response = response as Response; - let typesContent = await filterMappingResponse(response) as string; - return typesContent; - } catch (error) { - console.error(error); - return TIMEOUT; - } +async function attatchmentToFileData(file: Attachment): Promise { + return { + fileName: file.name, + content: file.content + }; } export async function mappingFileParameterDefinitions(file: Attachment, parameterDefinitions: ErrorCode | ParameterMetadata): Promise { if (!file) { return parameterDefinitions; } - - const convertedFile = convertBase64ToBlob(file); - if (!convertedFile) { throw new Error("Invalid file content"); } - - let mappingFile = await getMappingFromFile(convertedFile); - if (isErrorCode(mappingFile)) { return mappingFile as ErrorCode; } - - mappingFile = mappingFile as MappingFileRecord; + const fileData = await attatchmentToFileData(file); + const params: DataMapperRequest = { + file: fileData, + processType: "mapping_instruction" + }; + const resp: DataMapperResponse = await processDataMapperInput(params); + let mappingFile: MappingFileRecord = JSON.parse(resp.fileContent) as MappingFileRecord; return { ...parameterDefinitions, @@ -1502,13 +1424,13 @@ export async function mappingFileParameterDefinitions(file: Attachment, paramete export async function typesFileParameterDefinitions(file: Attachment): Promise { if (!file) { throw new Error("File is undefined"); } - const convertedFile = convertBase64ToBlob(file); - if (!convertedFile) { throw new Error("Invalid file content"); } - - let typesFile = await getTypesFromFile(convertedFile); - if (isErrorCode(typesFile)) { return typesFile as ErrorCode; } - - return typesFile; + const fileData = await attatchmentToFileData(file); + const params: DataMapperRequest = { + file: fileData, + processType: "records" + }; + const resp: DataMapperResponse = await processDataMapperInput(params); + return resp.fileContent; } function convertBase64ToBlob(file: Attachment): Blob | null { @@ -2108,17 +2030,15 @@ export async function requirementsSpecification(filepath: string): Promise fs.lstatSync(path.join(dirPath, file)).isDirectory()); } -suite.only("AI Datamapper Tests Suite", () => { +suite.skip("AI Datamapper Tests Suite", () => { setup(done => { done(); }); 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 new file mode 100644 index 00000000000..2a261ed3cae --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts @@ -0,0 +1,234 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. + * + * This software is the property of WSO2 LLC. and its suppliers, if any. + * Dissemination of any information or reproduction of any material contained + * herein in any form is strictly forbidden, unless permitted by WSO2 expressly. + * You may not alter or remove any copyright or other notice from copies of this content. + */ + +import * as path from "path"; +import { generateCodeCore } from "../../../../src/features/ai/service/code/code"; +import * as assert from "assert"; +import * as fs from "fs"; +import { ChatNotify, GenerateCodeRequest } from "@wso2/ballerina-core"; +import { CopilotEventHandler } from "../../../../src/features/ai/service/event"; +import { commands, Uri, workspace } from "vscode"; +import { ExtendedLangClient } from "../../../../src/core/extended-language-client"; +import { ballerinaExtInstance } from "../../../../src/core/extension"; +import { getServerOptions } from "../../../../src/utils/server/server"; + +const RESOURCES_PATH = path.resolve(__dirname, "../../../../../test/ai/evals/code/resources"); + +function getTestFolders(dirPath: string): string[] { + return fs.readdirSync(dirPath).filter((file) => fs.lstatSync(path.join(dirPath, file)).isDirectory()); +} + +// Test event handler that captures events for testing +interface TestEventResult { + events: ChatNotify[]; + fullContent: string; + hasStarted: boolean; + hasCompleted: boolean; + errorOccurred: string | null; + diagnostics: any[]; + messages: any[]; +} + +function createTestEventHandler(): { handler: CopilotEventHandler; getResult: () => TestEventResult } { + const events: ChatNotify[] = []; + let fullContent = ""; + let hasStarted = false; + let hasCompleted = false; + let errorOccurred: string | null = null; + const diagnostics: any[] = []; + const messages: any[] = []; + + const handler: CopilotEventHandler = (event: ChatNotify) => { + events.push(event); + + switch (event.type) { + case "start": + hasStarted = true; + console.log("Code generation started"); + break; + case "content_block": + fullContent += event.content; + console.log("Content block received:", event.content.substring(0, 100) + "..."); + break; + case "content_replace": + fullContent = event.content; + console.log("Content replaced, new length:", event.content.length); + break; + case "error": + errorOccurred = event.content; + console.error("Error occurred during code generation:", event.content); + break; + case "stop": + hasCompleted = true; + console.log("Code generation completed"); + console.log("Final content length:", fullContent.length); + console.log("Total events received:", events.length); + break; + case "intermediary_state": + console.log("Intermediary state:", event.state); + break; + case "messages": + console.log("Messages received:", event.messages?.length || 0); + messages.push(...(event.messages || [])); + break; + case "diagnostics": + console.log("Diagnostics received:", event.diagnostics?.length || 0); + diagnostics.push(...(event.diagnostics || [])); + break; + default: + console.warn(`Unhandled event type: ${(event as any).type}`); + break; + } + }; + + const getResult = (): TestEventResult => ({ + events, + fullContent, + hasStarted, + hasCompleted, + errorOccurred, + diagnostics, + messages, + }); + + return { handler, getResult }; +} + +suite.only("AI Code Generator Tests Suite", () => { + test("basic workspace test", async function () { + this.timeout(30000); + //TODO: Set new langserver jar + + const PROJECT_ROOT = "/Users/wso2/repos/ballerina-copilot/evals/project_samples/fresh_bi_package"; + + const success = workspace.updateWorkspaceFolders(0, 0, { + uri: Uri.file(PROJECT_ROOT), + }); + + await wait(2000); + + console.log("Workspace folders after update:", workspace.workspaceFolders?.length || 0); + const { handler: testEventHandler, getResult } = createTestEventHandler(); + + await wait(15000); + const params: GenerateCodeRequest = { + usecase: "write a hello world", + chatHistory: [], + operationType: "CODE_GENERATION", + fileAttachmentContents: [], + }; + + try { + await generateCodeCore(params, testEventHandler); + + const result = getResult(); + + // Basic assertions + assert.strictEqual(result.hasStarted, true, "Code generation should have started"); + assert.strictEqual(result.errorOccurred, null, "No errors should have occurred"); + assert.ok(result.events.length > 0, "Should have received events"); + + console.log(`Test completed for folder: ${PROJECT_ROOT}`); + console.log(`Generated content length: ${result.fullContent.length}`); + console.log(`Total events: ${result.events.length}`); + + //TODO: Take the response. Add to files, then compile the project. Get diagnostics + // + } catch (error) { + console.error(`Test failed for folder ${PROJECT_ROOT}:`, error); + throw error; + } + + console.log("Test completed successfully"); + }); +}); + +// suite.only("AI Code Generator Tests Suite", () => { +// // let langClient: ExtendedLangClient; + +// // suiteSetup(async (done): Promise => { +// // langClient = new ExtendedLangClient( +// // 'ballerina-vscode', +// // 'Ballerina LS Client', +// // getServerOptions(ballerinaExtInstance), +// // { documentSelector: [{ scheme: 'file', language: 'ballerina' }] }, +// // undefined, +// // false +// // ); +// // await langClient.start(); +// // await langClient.registerExtendedAPICapabilities(); +// // done(); +// // }); + +// function runTests(basePath: string) { +// const testFolders = getTestFolders(basePath); + +// testFolders.forEach((folder) => { +// const folderPath = path.join(basePath, folder); + +// suite(`Group: ${folder}`, () => { +// const subFolders = getTestFolders(folderPath); + +// test("should generate code successfully", async () => { +// const { handler: testEventHandler, getResult } = createTestEventHandler(); +// const PROJECT_ROOT = "/Users/wso2/repos/ballerina-copilot/evals/project_samples/fresh_bi_package"; + +// // Add workspace folder programmatically +// const success = workspace.updateWorkspaceFolders( +// workspace.workspaceFolders ? workspace.workspaceFolders.length : 0, +// 0, +// { uri: Uri.file(PROJECT_ROOT) } +// ); + +// if (!success) { +// throw new Error("Failed to add workspace folder"); +// } + +// // Wait for workspace to be updated +// await wait(2000); + +// const uri = Uri.file(path.join(PROJECT_ROOT, "main.bal").toString()); +// await commands.executeCommand("vscode.open", uri); +// await workspace.openTextDocument(uri); + +// await wait(15000); +// const params: GenerateCodeRequest = { +// usecase: "write a hello world", +// chatHistory: [], +// operationType: "CODE_GENERATION", +// fileAttachmentContents: [], +// }; + +// try { +// await generateCodeCore(params, testEventHandler); + +// const result = getResult(); + +// // Basic assertions +// assert.strictEqual(result.hasStarted, true, "Code generation should have started"); +// assert.strictEqual(result.errorOccurred, null, "No errors should have occurred"); +// assert.ok(result.events.length > 0, "Should have received events"); + +// console.log(`Test completed for folder: ${folder}`); +// console.log(`Generated content length: ${result.fullContent.length}`); +// console.log(`Total events: ${result.events.length}`); +// } catch (error) { +// console.error(`Test failed for folder ${folder}:`, error); +// throw error; +// } +// }); +// }); +// }); +// } +// runTests(RESOURCES_PATH); +// }); + +function wait(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} diff --git a/workspaces/ballerina/ballerina-extension/test/data/string.bal b/workspaces/ballerina/ballerina-extension/test/data/string.bal index 362b5ca8fc8..bbece422f38 100644 --- a/workspaces/ballerina/ballerina-extension/test/data/string.bal +++ b/workspaces/ballerina/ballerina-extension/test/data/string.bal @@ -1 +1 @@ -string st = "sample giga string"; +strixng st = "saample giga string"; diff --git a/workspaces/ballerina/ballerina-extension/test/runTest.ts b/workspaces/ballerina/ballerina-extension/test/runTest.ts index 0ead7f70cc1..6b732f34ee3 100644 --- a/workspaces/ballerina/ballerina-extension/test/runTest.ts +++ b/workspaces/ballerina/ballerina-extension/test/runTest.ts @@ -17,15 +17,32 @@ */ import * as path from 'path'; import { runTests } from './lib/index'; +const dotenv = require('dotenv'); +const { createEnvDefinePlugin } = require('../../../../../common/scripts/env-webpack-helper'); async function go() { try { const extensionDevelopmentPath = path.resolve(__dirname, '../../'); const extensionTestsPath = path.resolve(__dirname, '.'); + const envPath = path.resolve(__dirname, '../../.env'); + const env = dotenv.config({ path: envPath }).parsed; + console.log("Fetching values for environment variables..."); + const { envKeys, missingVars } = createEnvDefinePlugin(env); + if (missingVars.length > 0) { + console.warn( + '\n⚠️ Environment Variable Configuration Warning:\n' + + `Missing required environment variables: ${missingVars.join(', ')}\n` + + `Please provide values in either .env file or runtime environment.\n` + ); + } + await runTests({ extensionDevelopmentPath, - extensionTestsPath + extensionTestsPath, + extensionTestsEnv: { + ...envKeys + } }); } catch (err) { process.exit(1); diff --git a/workspaces/ballerina/ballerina-rpc-client/src/BallerinaRpcClient.ts b/workspaces/ballerina/ballerina-rpc-client/src/BallerinaRpcClient.ts index 684d35a7ae2..6719b9c9839 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/BallerinaRpcClient.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/BallerinaRpcClient.ts @@ -46,7 +46,9 @@ import { onArtifactUpdatedNotification, onArtifactUpdatedRequest, ColorThemeKind, - currentThemeChanged + currentThemeChanged, + ChatNotify, + onChatNotify } from "@wso2/ballerina-core"; import { LangClientRpcClient } from "./rpc-clients/lang-client/rpc-client"; import { LibraryBrowserRpcClient } from "./rpc-clients/library-browser/rpc-client"; @@ -214,6 +216,10 @@ export class BallerinaRpcClient { this.messenger.onNotification(onDownloadProgress, callback); } + onChatNotify(callback: (state: ChatNotify) => void) { + this.messenger.onNotification(onChatNotify, callback); + } + getPopupVisualizerState(): Promise { return this.messenger.sendRequest(getPopupVisualizerState, 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 b3355b3ed21..cedf0abce22 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 @@ -25,10 +25,12 @@ import { DeveloperDocument, FetchDataRequest, FetchDataResponse, + GenerateCodeRequest, GenerateMappingFromRecordResponse, GenerateMappingsFromRecordRequest, GenerateMappingsRequest, GenerateMappingsResponse, + GenerateOpenAPIRequest, GenerateTypesFromRecordRequest, GenerateTypesFromRecordResponse, GetFromFileRequest, @@ -39,11 +41,16 @@ import { PostProcessResponse, ProjectDiagnostics, ProjectSource, + RelevantLibrariesAndFunctionsRequest, + RelevantLibrariesAndFunctionsResponse, + RepairParams, RequirementSpecification, SubmitFeedbackRequest, TestGenerationMentions, TestGenerationRequest, TestGenerationResponse, + TestGeneratorIntermediaryState, + TestPlanGenerationRequest, abortTestGeneration, addChatSummary, addToProject, @@ -53,7 +60,12 @@ import { createTestDirecoryIfNotExists, deleteFromProject, fetchData, + generateCode, + generateFunctionTests, + generateHealthcareCode, generateMappings, + generateOpenAPI, + generateTestPlan, getAIMachineSnapshot, getAccessToken, getActiveFile, @@ -70,6 +82,7 @@ import { getProjectSource, getProjectUuid, getRefreshedAccessToken, + getRelevantLibrariesAndFunctions, getResourceMethodAndPaths, getResourceSourceForMethodAndPath, getServiceNames, @@ -87,6 +100,7 @@ import { promptGithubAuthorize, promptWSO2AILogout, readDeveloperMdFile, + repairGeneratedCode, showSignInAlert, stopAIMappings, submitFeedback, @@ -294,4 +308,32 @@ export class AiPanelRpcClient implements AIPanelAPI { submitFeedback(params: SubmitFeedbackRequest): Promise { return this._messenger.sendRequest(submitFeedback, HOST_EXTENSION, params); } + + getRelevantLibrariesAndFunctions(params: RelevantLibrariesAndFunctionsRequest): Promise { + return this._messenger.sendRequest(getRelevantLibrariesAndFunctions, HOST_EXTENSION, params); + } + + generateOpenAPI(params: GenerateOpenAPIRequest): void { + return this._messenger.sendNotification(generateOpenAPI, HOST_EXTENSION, params); + } + + generateCode(params: GenerateCodeRequest): void { + return this._messenger.sendNotification(generateCode, HOST_EXTENSION, params); + } + + repairGeneratedCode(params: RepairParams): void { + return this._messenger.sendNotification(repairGeneratedCode, HOST_EXTENSION, params); + } + + generateTestPlan(params: TestPlanGenerationRequest): void { + return this._messenger.sendNotification(generateTestPlan, HOST_EXTENSION, params); + } + + generateFunctionTests(params: TestGeneratorIntermediaryState): void { + return this._messenger.sendNotification(generateFunctionTests, HOST_EXTENSION, params); + } + + generateHealthcareCode(params: GenerateCodeRequest): void { + return this._messenger.sendNotification(generateHealthcareCode, HOST_EXTENSION, params); + } } diff --git a/workspaces/ballerina/ballerina-visualizer/package.json b/workspaces/ballerina/ballerina-visualizer/package.json index a795f47cce6..44e62d0b06d 100644 --- a/workspaces/ballerina/ballerina-visualizer/package.json +++ b/workspaces/ballerina/ballerina-visualizer/package.json @@ -82,7 +82,9 @@ "webpack": "^5.56.0", "@types/react-lottie": "^1.2.5", "@types/lodash.debounce": "^4.0.6", - "webpack-dev-server": "^4.11.1" + "webpack-dev-server": "^4.11.1", + "@ai-sdk/openai": "^1.3.22", + "ai": "^4.3.16" }, "author": "wso2", "license": "UNLICENSED", diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx index 8e5857a9f86..4a5ab4e280a 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx @@ -32,6 +32,12 @@ import { AIPanelPrompt, Command, TemplateId, + ChatNotify, + GenerateCodeRequest, + TestPlanGenerationRequest, + TestGeneratorIntermediaryState, + SourceFiles, + ChatEntry, } from "@wso2/ballerina-core"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; @@ -47,7 +53,6 @@ import { AIChatView, Header, HeaderButtons, ChatMessage, Badge } from "../../sty import ReferenceDropdown from "../ReferenceDropdown"; import AccordionItem from "../TestScenarioSegment"; import { VSCodeButton } from "@vscode/webview-ui-toolkit/react"; -import { TestGeneratorIntermediaryState } from "../../features/testGenerator"; import { CopilotContentBlockContent, CopilotErrorContent, @@ -82,20 +87,11 @@ import { getOnboardingOpens, incrementOnboardingOpens } from "./utils/utils"; import FeedbackBar from "./../FeedbackBar"; import { useFeedback } from "./utils/useFeedback"; -/* REFACTORED CODE START [1] */ -/* REFACTORED CODE END [1] */ - interface CodeBlock { filePath: string; content: string; } -interface ChatEntry { - actor: string; - message: string; - isCodeGeneration?: boolean; -} - interface ApiResponse { event: string; error: string | null; @@ -142,7 +138,6 @@ const CHECK_DRIFT_BETWEEN_CODE_AND_DOCUMENTATION = "Check drift between code and const GENERATE_CODE_AGAINST_THE_PROVIDED_REQUIREMENTS = "Generate code based on the following requirements: "; const GENERATE_CODE_AGAINST_THE_PROVIDED_REQUIREMENTS_TRIMMED = GENERATE_CODE_AGAINST_THE_PROVIDED_REQUIREMENTS.trim(); -//TOOD: Add the backend URL //TODO: Add better error handling from backend. stream error type and non 200 status codes const AIChat: React.FC = () => { @@ -167,6 +162,8 @@ const AIChat: React.FC = () => { const functionsRef = useRef([]); const lastAttatchmentsRef = useRef([]); const aiChatInputRef = useRef(null); + const messagesRef = useRef([]); + const messagesEndRef = React.createRef(); @@ -283,6 +280,50 @@ const AIChat: React.FC = () => { }); }, []); + rpcClient?.onChatNotify((response: ChatNotify) => { + const type = response.type; + if (type === "content_block") { + const content = response.content; + setMessages((prevMessages) => { + const newMessages = [...prevMessages]; + newMessages[newMessages.length - 1].content += content; + return newMessages; + }); + } else if (type === "content_replace") { + const content = response.content; + setMessages((prevMessages) => { + const newMessages = [...prevMessages]; + newMessages[newMessages.length - 1].content = content; + return newMessages; + }); + } else if (type === "intermediary_state") { + const state = response.state; + setTestGenIntermediaryState(state); + } else if (type === "diagnostics") { + const content = response.diagnostics; + currentDiagnosticsRef.current = content; + } else if (type === "messages") { + const messages = response.messages; + messagesRef.current = messages; + } else if (type === "stop") { + console.log("Received stop signal"); + setIsCodeLoading(false); + setIsLoading(false); + addChatEntry("user", messages[messages.length - 2].content,); // Handle this in input layer? + addChatEntry("assistant", messages[messages.length - 1].content); + } else if (type === "error") { + console.log("Received error signal"); + const errorTemplate = `\n${response.content}`; + setMessages((prevMessages) => { + const newMessages = [...prevMessages]; + newMessages[newMessages.length - 1].content += errorTemplate; + return newMessages; + }); + setIsCodeLoading(false); + setIsLoading(false); + } + }); + function generateNaturalProgrammingTemplate(isReqFileExists: boolean) { if (isReqFileExists) { upsertTemplate( @@ -637,212 +678,19 @@ const AIChat: React.FC = () => { async function processCodeGeneration(content: [string, Attachment[], string], message: string) { const [useCase, attachments, operationType] = content; - - let assistant_response = ""; - let project: ProjectSource; - try { - project = await rpcClient.getAiPanelRpcClient().getProjectSource(operationType); - } catch (error) { - throw new Error( - "This workspace doesn't appear to be a Ballerina project. Please open a folder that contains a Ballerina.toml file to continue." - ); - } - const requestBody: any = { - usecase: useCase, - chatHistory: chatArray, - sourceFiles: transformProjectSource(project), - operationType, - packageName: project.projectName, - }; - const fileAttatchments = attachments.map((file) => ({ fileName: file.name, content: file.content, })); - requestBody.fileAttachmentContents = fileAttatchments; - lastAttatchmentsRef.current = fileAttatchments; - - const response = await fetchWithAuth({ - url: backendRootUri + "/code", - method: "POST", - body: requestBody, - rpcClient: rpcClient, - }); - - if (!response.ok) { - setIsLoading(false); - let error = `Failed to fetch response.`; - if (response.status == 429) { - response.json().then((body) => { - error += RATE_LIMIT_ERROR; - }); - } - throw new Error(error); - } - const reader: ReadableStreamDefaultReader = response.body?.getReader(); - const decoder = new TextDecoder(); - let buffer = ""; - let codeSnippetBuffer = ""; - remainingTokenPercentage = "Unlimited"; - setIsCodeLoading(true); - while (true) { - const { done, value } = await reader.read(); - if (done) { - setIsLoading(false); - break; - } - - buffer += decoder.decode(value, { stream: true }); - - let boundary = buffer.indexOf("\n\n"); - while (boundary !== -1) { - const chunk = buffer.slice(0, boundary + 2); - buffer = buffer.slice(boundary + 2); - try { - await processSSEEvent(chunk); - } catch (error) { - console.error("Failed to parse SSE event:", error); - } - - boundary = buffer.indexOf("\n\n"); - } - } - - async function processSSEEvent(chunk: string) { - const event = parseSSEEvent(chunk); - if (event.event == "content_block_delta") { - let textDelta = event.body.text; - assistant_response += textDelta; - - handleContentBlockDelta(textDelta); - } else if (event.event == "functions") { - // Update the functions state instead of the global variable - functionsRef.current = event.body; - } else if (event.event == "message_stop") { - let diagnostics: DiagnosticEntry[] = []; - try { - const postProcessResp: PostProcessResponse = await rpcClient.getAiPanelRpcClient().postProcess({ - assistant_response: assistant_response, - }); - console.log("Raw resp Before repair:", assistant_response); - assistant_response = postProcessResp.assistant_response; - diagnostics = postProcessResp.diagnostics.diagnostics; - console.log("Initial Diagnostics : ", diagnostics); - currentDiagnosticsRef.current = diagnostics; - } catch (error) { - // Add this catch block because `Add to Integration` button not appear for `/code` - // Related issue: https://github.com/wso2/vscode-extensions/issues/5065 - console.log("A critical error occurred while post processing the response: ", error); - diagnostics = []; - } - const MAX_REPAIR_ATTEMPTS = 3; - let repair_attempt = 0; - let diagnosticFixResp = assistant_response; - while ( - hasCodeBlocks(assistant_response) && - diagnostics.length > 0 && - repair_attempt < MAX_REPAIR_ATTEMPTS - ) { - console.log("Repair iteration: ", repair_attempt); - console.log("Diagnotsics trynna fix: ", diagnostics); - const diagReq = { - response: diagnosticFixResp, - diagnostics: diagnostics, - }; - const startTime = performance.now(); - let newReqBody: any = { - usecase: useCase, - chatHistory: chatArray, - sourceFiles: transformProjectSource(project), - diagnosticRequest: diagReq, - functions: functionsRef.current, - operationType, - packageName: project.projectName, - }; - if (attachments.length > 0) { - newReqBody.fileAttachmentContents = fileAttatchments; - } - const response = await fetchWithAuth({ - url: backendRootUri + "/code/repair", - method: "POST", - body: newReqBody, - rpcClient: rpcClient, - }); - if (!response.ok) { - setIsCodeLoading(false); - console.log("errr"); - break; - } else { - const jsonBody = await response.json(); - const repairResponse = jsonBody.repairResponse; - console.log("Resposne of attempt" + repair_attempt + " : ", repairResponse); - // replace original response with new code blocks - diagnosticFixResp = replaceCodeBlocks(diagnosticFixResp, repairResponse); - const postProcessResp: PostProcessResponse = await rpcClient.getAiPanelRpcClient().postProcess({ - assistant_response: diagnosticFixResp, - }); - diagnosticFixResp = postProcessResp.assistant_response; - const endTime = performance.now(); - const executionTime = endTime - startTime; - console.log(`Repair call time: ${executionTime} milliseconds`); - console.log("After auto repair, Diagnostics : ", postProcessResp.diagnostics.diagnostics); - diagnostics = postProcessResp.diagnostics.diagnostics; - currentDiagnosticsRef.current = postProcessResp.diagnostics.diagnostics; - repair_attempt++; - } - } - assistant_response = diagnosticFixResp; - setIsCodeLoading(false); - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - newMessages[newMessages.length - 1].content = assistant_response; - return newMessages; - }); - } else if (event.event == "error") { - console.log("Streaming Error: " + event.body); - setIsLoading(false); - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - newMessages[newMessages.length - 1].content += - "\nUnknown error occurred while receiving the response."; - newMessages[newMessages.length - 1].type = "Error"; - return newMessages; - }); - assistant_response = "\nUnknown error occurred while receiving the response."; - throw new Error("Streaming error"); - } - } - - function handleContentBlockDelta(textDelta: string) { - const matchText = codeSnippetBuffer + textDelta; - const matchedResult = findRegexMatches(matchText); - if (matchedResult.length > 0) { - if (matchedResult[0].end === matchText.length) { - codeSnippetBuffer = matchText; - } else { - codeSnippetBuffer = ""; - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - newMessages[newMessages.length - 1].content += matchText; - return newMessages; - }); - } - } else { - codeSnippetBuffer = ""; - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - newMessages[newMessages.length - 1].content += matchText; - return newMessages; - }); - } - } + const requestBody: GenerateCodeRequest = { + usecase: useCase, + chatHistory: chatArray, + operationType, + fileAttachmentContents: fileAttatchments + }; - const userMessage = getUserMessage([message, attachments]); - addChatEntry("user", userMessage, true); - const diagnosedSourceFiles: ProjectSource = getProjectFromResponse(assistant_response); - setIsSyntaxError(await rpcClient.getAiPanelRpcClient().checkSyntaxError(diagnosedSourceFiles)); - addChatEntry("assistant", assistant_response); + await rpcClient.getAiPanelRpcClient().generateCode(requestBody) } // Helper function to escape regex special characters in a string @@ -1133,54 +981,13 @@ const AIChat: React.FC = () => { targetType === "service" ? await rpcClient.getAiPanelRpcClient().getServiceSourceForName(target) : await rpcClient.getAiPanelRpcClient().getResourceSourceForMethodAndPath(target); - const requestBody = { - targetType: targetType, + const requestBody: TestPlanGenerationRequest = { + targetType: targetType === "service" ? TestGenerationTarget.Service : TestGenerationTarget.Function, targetSource: targetSource, + target: target }; - const response = await fetchWithAuth({ - url: backendRootUri + "/testplan", - method: "POST", - body: requestBody, - rpcClient: rpcClient, - }); - - if (!response.ok) { - handleErrorResponse(response); - } - - const reader = response.body?.getReader(); - const decoder = new TextDecoder(); - let buffer = ""; - - while (true) { - const { done, value } = await reader.read(); - if (done) { - if (targetType === "service") { - await processServiceTestGeneration(content, target, assistantResponse); - setIsLoading(false); - } else if (targetType === "function") { - assistantResponse += `\n\n`; - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - newMessages[newMessages.length - 1].content = assistantResponse; - return newMessages; - }); - setTestGenIntermediaryState({ - content: content, - resourceFunction: target, - testPlan: assistantResponse, - }); - } else { - setIsLoading(false); - throw new Error(`Invalid target type: ${targetType}`); - } - break; - } - - buffer += decoder.decode(value, { stream: true }); - buffer = await processBuffer(buffer); - } + await rpcClient.getAiPanelRpcClient().generateTestPlan(requestBody); } catch (error: any) { setIsLoading(false); const errorName = error instanceof Error ? error.name : "Unknown error"; @@ -1192,223 +999,8 @@ const AIChat: React.FC = () => { throw new Error(errorMessage); } } - - async function processBuffer(buffer: string) { - let boundary = buffer.indexOf("\n\n"); - while (boundary !== -1) { - const chunk = buffer.slice(0, boundary + 2); - buffer = buffer.slice(boundary + 2); - await processSSEEvent(chunk); - boundary = buffer.indexOf("\n\n"); - } - return buffer; - } - - async function processSSEEvent(chunk: string) { - try { - const event = parseCopilotSSEEvent(chunk); - if (event.event === CopilotEvent.CONTENT_BLOCK) { - const text = (event.body as CopilotContentBlockContent).text; - assistantResponse += text; - handleContentBlockDelta(text); - } else if (event.event === "error") { - throw new Error(`Streaming Error: ${(event.body as CopilotErrorContent).message}`); - } - } catch (error) { - setIsLoading(false); - const errorMessage = error instanceof Error ? error.message : "Unknown error"; - throw new Error(`Failed to parse SSE event: ${errorMessage}`); - } - } - - function handleContentBlockDelta(text: string) { - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - newMessages[newMessages.length - 1].content += text; - return newMessages; - }); - } - - async function handleErrorResponse(response: Response) { - if (response.status === 429) { - const body = await response.json(); - throw new Error(`Too many requests: ${RATE_LIMIT_ERROR}`); - } - - throw new Error(`Failed to fetch response. HTTP Status: ${response.status}`); - } - } - - async function processServiceTestGeneration( - content: [string, Attachment[]], - serviceName: string, - testPlan: string - ) { - let assistantResponse = `${testPlan}`; - - const updateAssistantMessage = (message: string) => { - assistantResponse += message; - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - newMessages[newMessages.length - 1].content = assistantResponse; - return newMessages; - }); - }; - - updateAssistantMessage( - `\n\n**Initiating test generation for the ${serviceName} service, following the _outlined test plan_. Please wait...**` - ); - - updateAssistantMessage( - `\n\nGenerating tests for the ${serviceName} service. This may take a moment.` - ); - - try { - const response = await rpcClient.getAiPanelRpcClient().getGeneratedTests({ - backendUri: backendRootUri, - targetType: TestGenerationTarget.Service, - targetIdentifier: serviceName, - testPlan, - }); - updateAssistantMessage(`\nAnalyzing generated tests for potential issues.`); - - const diagnostics = await rpcClient.getAiPanelRpcClient().getTestDiagnostics(response); - let testCode = response.testSource; - const testConfig = response.testConfig; - - if (diagnostics.diagnostics.length > 0) { - updateAssistantMessage( - `\nRefining tests based on feedback to ensure accuracy and reliability.` - ); - const fixedCode = await rpcClient.getAiPanelRpcClient().getGeneratedTests({ - backendUri: backendRootUri, - targetType: TestGenerationTarget.Service, - targetIdentifier: serviceName, - testPlan: testPlan, - diagnostics: diagnostics, - existingTests: response.testSource, - }); - testCode = fixedCode.testSource; - } - - updateAssistantMessage( - `\n\nTest generation completed. Displaying the generated tests for the ${serviceName} service below:` - ); - - setIsLoading(false); - setIsCodeLoading(false); - - updateAssistantMessage( - `\n\n\n\`\`\`ballerina\n${testCode}\n\`\`\`\n` - ); - if (testConfig) { - updateAssistantMessage( - `\n\n\n\`\`\`ballerina\n${testConfig}\n\`\`\`\n` - ); - } - - const userMessage = getUserMessage(content); - addChatEntry("user", userMessage); - addChatEntry("assistant", assistantResponse); - } catch (error) { - throw error; - } } - async function processFunctionTestGeneration( - content: [string, Attachment[]], - functionIdentifier: string, - testPlan: string - ) { - const testPath = "tests/test.bal"; - setIsCodeLoading(true); - let assistantResponse = `${testPlan}`; - - const updateAssistantMessage = (message: string) => { - assistantResponse += message; - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - newMessages[newMessages.length - 1].content = assistantResponse; - return newMessages; - }); - }; - - updateAssistantMessage( - `\n\n**Initiating test generation for the function ${functionIdentifier}, following the _outlined test plan_. Please wait...**` - ); - - updateAssistantMessage( - `\n\nGenerating tests for the function ${functionIdentifier}. This may take a moment.` - ); - - try { - const response = await rpcClient.getAiPanelRpcClient().getGeneratedTests({ - backendUri: backendRootUri, - targetType: TestGenerationTarget.Function, - targetIdentifier: functionIdentifier, - testPlan, - }); - updateAssistantMessage(`\nAnalyzing generated tests for potential issues.`); - - let existingSource = ""; - try { - existingSource = await rpcClient.getAiPanelRpcClient().getFromFile({ filePath: testPath }); - } 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 rpcClient.getAiPanelRpcClient().getTestDiagnostics({ - testSource: generatedFullSource, - }); - - console.log(diagnostics); - - let testCode = response.testSource; - const testConfig = response.testConfig; - - if (diagnostics.diagnostics.length > 0) { - updateAssistantMessage( - `\nRefining tests based on feedback to ensure accuracy and reliability.` - ); - const fixedCode = await rpcClient.getAiPanelRpcClient().getGeneratedTests({ - backendUri: backendRootUri, - targetType: TestGenerationTarget.Function, - targetIdentifier: functionIdentifier, - testPlan: testPlan, - diagnostics: diagnostics, - existingTests: generatedFullSource, - }); - testCode = fixedCode.testSource; - } - - updateAssistantMessage( - `\n\nTest generation completed. Displaying the generated tests for the function ${functionIdentifier} below:` - ); - - setIsLoading(false); - setIsCodeLoading(false); - - updateAssistantMessage( - `\n\n\n\`\`\`ballerina\n${testCode}\n\`\`\`\n` - ); - if (testConfig) { - updateAssistantMessage( - `\n\n\n\`\`\`ballerina\n${testConfig}\n\`\`\`\n` - ); - } - - const userMessage = getUserMessage(content); - addChatEntry("user", userMessage); - addChatEntry("assistant", assistantResponse); - } catch (error) { - throw error; - } - } // Process records from another package function processRecordReference( @@ -1812,232 +1404,23 @@ const AIChat: React.FC = () => { } async function processHealthcareCodeGeneration(useCase: string, message: string) { - let assistant_response = ""; - let project: ProjectSource; - try { - project = await rpcClient.getAiPanelRpcClient().getProjectSource(CodeGenerationType.CODE_GENERATION); - } catch (error) { - throw new Error( - "This workspace doesn't appear to be a Ballerina project. Please open a folder that contains a Ballerina.toml file to continue." - ); - } - const requestBody: any = { + + const requestBody: GenerateCodeRequest = { usecase: useCase, chatHistory: chatArray, - sourceFiles: transformProjectSource(project), - packageName: project.projectName, + fileAttachmentContents: [], + operationType: CodeGenerationType.CODE_GENERATION, }; - const response = await fetchWithAuth({ - url: backendRootUri + "/healthcare", - method: "POST", - body: requestBody, - rpcClient: rpcClient, - }); - - if (!response.ok) { - setIsLoading(false); - let error = `Failed to fetch response.`; - if (response.status == 429) { - response.json().then((body) => { - error += RATE_LIMIT_ERROR; - }); - } - throw new Error(error); - } - const reader: ReadableStreamDefaultReader = response.body?.getReader(); - const decoder = new TextDecoder(); - let buffer = ""; - let codeSnippetBuffer = ""; - remainingTokenPercentage = "Unlimited"; - setIsCodeLoading(true); - while (true) { - const { done, value } = await reader.read(); - if (done) { - setIsLoading(false); - break; - } - - buffer += decoder.decode(value, { stream: true }); - - let boundary = buffer.indexOf("\n\n"); - while (boundary !== -1) { - const chunk = buffer.slice(0, boundary + 2); - buffer = buffer.slice(boundary + 2); - try { - await processSSEEvent(chunk); - } catch (error) { - console.error("Failed to parse SSE event:", error); - } - - boundary = buffer.indexOf("\n\n"); - } - } - - async function processSSEEvent(chunk: string) { - const event = parseSSEEvent(chunk); - if (event.event == "content_block_delta") { - let textDelta = event.body.text; - assistant_response += textDelta; - - handleContentBlockDelta(textDelta); - } else if (event.event == "message_stop") { - setIsCodeLoading(false); - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - newMessages[newMessages.length - 1].content = assistant_response; - return newMessages; - }); - } else if (event.event == "error") { - console.log("Streaming Error: ", event); - setIsLoading(false); - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - newMessages[newMessages.length - 1].content += - "\nUnknown error occurred while receiving the response."; - newMessages[newMessages.length - 1].type = "Error"; - return newMessages; - }); - assistant_response = "\nUnknown error occurred while receiving the response."; - throw new Error("Streaming error"); - } - } - - function handleContentBlockDelta(textDelta: string) { - const matchText = codeSnippetBuffer + textDelta; - const matchedResult = findRegexMatches(matchText); - if (matchedResult.length > 0) { - if (matchedResult[0].end === matchText.length) { - codeSnippetBuffer = matchText; - } else { - codeSnippetBuffer = ""; - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - newMessages[newMessages.length - 1].content += matchText; - return newMessages; - }); - } - } else { - codeSnippetBuffer = ""; - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - newMessages[newMessages.length - 1].content += matchText; - return newMessages; - }); - } - } - - addChatEntry("user", message); - addChatEntry("assistant", assistant_response); + await rpcClient.getAiPanelRpcClient().generateHealthcareCode(requestBody) } async function processOpenAPICodeGeneration(useCase: string, message: string) { - let assistant_response = ""; const requestBody: any = { query: useCase, chatHistory: chatArray, }; - const response = await fetchWithAuth({ - url: backendRootUri + "/openapi", - method: "POST", - body: requestBody, - rpcClient: rpcClient, - }); - - if (!response.ok) { - setIsLoading(false); - let error = `Failed to fetch response.`; - if (response.status == 429) { - response.json().then((body) => { - error += RATE_LIMIT_ERROR; - }); - } - throw new Error(error); - } - const reader: ReadableStreamDefaultReader = response.body?.getReader(); - const decoder = new TextDecoder(); - let buffer = ""; - let codeSnippetBuffer = ""; - remainingTokenPercentage = "Unlimited"; - setIsCodeLoading(true); - while (true) { - const { done, value } = await reader.read(); - if (done) { - setIsLoading(false); - break; - } - - buffer += decoder.decode(value, { stream: true }); - - let boundary = buffer.indexOf("\n\n"); - while (boundary !== -1) { - const chunk = buffer.slice(0, boundary + 2); - buffer = buffer.slice(boundary + 2); - try { - await processSSEEvent(chunk); - } catch (error) { - console.error("Failed to parse SSE event:", error); - } - - boundary = buffer.indexOf("\n\n"); - } - } - - async function processSSEEvent(chunk: string) { - const event = parseSSEEvent(chunk); - if (event.event == "content_block_delta") { - let textDelta = event.body.text; - assistant_response += textDelta; - - handleContentBlockDelta(textDelta); - } else if (event.event == "message_stop") { - setIsCodeLoading(false); - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - newMessages[newMessages.length - 1].content = assistant_response; - return newMessages; - }); - } else if (event.event == "error") { - console.log("Streaming Error: ", event); - setIsLoading(false); - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - newMessages[newMessages.length - 1].content += - "\nUnknown error occurred while receiving the response."; - newMessages[newMessages.length - 1].type = "Error"; - return newMessages; - }); - assistant_response = "\nUnknown error occurred while receiving the response."; - throw new Error("Streaming error"); - } - } - - function handleContentBlockDelta(textDelta: string) { - const matchText = codeSnippetBuffer + textDelta; - const matchedResult = findRegexMatches(matchText); - if (matchedResult.length > 0) { - if (matchedResult[0].end === matchText.length) { - codeSnippetBuffer = matchText; - } else { - codeSnippetBuffer = ""; - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - newMessages[newMessages.length - 1].content += matchText; - return newMessages; - }); - } - } else { - codeSnippetBuffer = ""; - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - newMessages[newMessages.length - 1].content += matchText; - return newMessages; - }); - } - } - - addChatEntry("user", message); - addChatEntry("assistant", assistant_response); + await rpcClient.getAiPanelRpcClient().generateOpenAPI(requestBody); } async function handleStop() { @@ -2198,11 +1581,11 @@ const AIChat: React.FC = () => { }; const generateFunctionTests = async () => { - await processFunctionTestGeneration( - testGenIntermediaryState.content, - testGenIntermediaryState.resourceFunction, - testGenIntermediaryState.testPlan - ); + setIsCodeLoading(true); + await rpcClient.getAiPanelRpcClient().generateFunctionTests({ + testPlan: testGenIntermediaryState.testPlan, + resourceFunction: testGenIntermediaryState.resourceFunction, + }); }; const handleRetryRepair = async () => { @@ -2212,77 +1595,11 @@ const AIChat: React.FC = () => { setIsCodeLoading(true); setIsLoading(true); - try { - const project: ProjectSource = await rpcClient - .getAiPanelRpcClient() - .getProjectSource(CodeGenerationType.CODE_GENERATION); - - const usecase = messages[messages.length - 2].content; - const latestMessage = messages[messages.length - 1].content; - - const diagReq = { - response: latestMessage, - diagnostics: currentDiagnostics, - }; - - const reqBody: any = { - usecase: usecase, - chatHistory: chatArray.slice(0, chatArray.length - 2), - sourceFiles: transformProjectSource(project), - diagnosticRequest: diagReq, - functions: functionsRef.current, - operationType: CodeGenerationType.CODE_GENERATION, - packageName: project.projectName, - }; - - const attatchments = lastAttatchmentsRef.current; - if (attatchments) { - reqBody.fileAttachmentContents = attatchments; - } - console.log("Request body for repair:", reqBody); - const response = await fetchWithAuth({ - url: backendRootUri + "/code/repair", - method: "POST", - body: reqBody, - rpcClient: rpcClient, - }); - - if (!response.ok) { - throw new Error("Repair failed"); - } - - const jsonBody = await response.json(); - const repairResponse = jsonBody.repairResponse; - let fixedResponse = replaceCodeBlocks(latestMessage, repairResponse); - - const postProcessResp: PostProcessResponse = await rpcClient.getAiPanelRpcClient().postProcess({ - assistant_response: fixedResponse, - }); - - fixedResponse = postProcessResp.assistant_response; - currentDiagnosticsRef.current = postProcessResp.diagnostics.diagnostics; - const diagnosedSourceFiles: ProjectSource = getProjectFromResponse(fixedResponse); - setIsSyntaxError(await rpcClient.getAiPanelRpcClient().checkSyntaxError(diagnosedSourceFiles)); - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - newMessages[newMessages.length - 1].content = fixedResponse; - return newMessages; - }); - - // Update chat entry - const lastIndex = chatArray.length - 1; - if (lastIndex >= 0 && chatArray[lastIndex].actor === "assistant") { - updateChatEntry(lastIndex, { - actor: "assistant", - message: fixedResponse, - }); - } - } catch (error) { - console.error("Repair retry failed:", error); - } finally { - setIsCodeLoading(false); - setIsLoading(false); - } + await rpcClient.getAiPanelRpcClient().repairGeneratedCode({ + diagnostics: currentDiagnostics, + assistantResponse: messages[messages.length - 1].content, + previousMessages: messagesRef.current + }); }; return ( @@ -2383,7 +1700,7 @@ const AIChat: React.FC = () => { isReady={!isCodeLoading} message={message} buttonsActive={showGeneratingFiles} - isSyntaxError={isSyntaxError} + isSyntaxError={isContainsSyntaxError(currentDiagnosticsRef.current)} command={segment.command} diagnostics={currentDiagnosticsRef.current} onRetryRepair={handleRetryRepair} @@ -2580,6 +1897,9 @@ function extractRecordTypes(typesCode: string): { name: string; code: string }[] code: match[0].trim(), })); } +interface ContentBlock { + delta: ContentBlockDeltaBody; +} // Define the different event body types interface ContentBlockDeltaBody { @@ -2592,7 +1912,7 @@ interface OtherEventBody { } // Define the SSEEvent type with a discriminated union for the body -type SSEEvent = { event: "content_block_delta"; body: ContentBlockDeltaBody } | { event: string; body: OtherEventBody }; +type SSEEvent = { event: "content_block_delta"; body: ContentBlock } | { event: string; body: OtherEventBody }; /** * Parses a chunk of text to extract the SSE event and body. @@ -2848,11 +2168,6 @@ function generateChatHistoryForSummarize(chatArray: ChatEntry[]): ChatEntry[] { ); } -interface SourceFiles { - filePath: string; - content: string; -} - function transformProjectSource(project: ProjectSource): SourceFiles[] { const sourceFiles: SourceFiles[] = []; project.sourceFiles.forEach((file) => { @@ -2880,3 +2195,19 @@ function transformProjectSource(project: ProjectSource): SourceFiles[] { }); return sourceFiles; } + + +function isContainsSyntaxError(diagnostics: DiagnosticEntry[]): boolean { + return diagnostics.some((diag) => { + 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; + } + } + } + } + ); +} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/features/testGenerator.ts b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/features/testGenerator.ts deleted file mode 100644 index 4457b8867d4..00000000000 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/features/testGenerator.ts +++ /dev/null @@ -1,25 +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 { Attachment } from "@wso2/ballerina-core"; - -export interface TestGeneratorIntermediaryState { - content: [string, Attachment[]]; - resourceFunction: string; - testPlan: string; -} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Overview/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Overview/index.tsx index 0c3f53198da..f3f5c925ece 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Overview/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Overview/index.tsx @@ -18,8 +18,6 @@ import React, { useEffect, useMemo, useRef, useState } from "react"; import { - ProjectDiagnostics, - ProjectSource, ProjectStructureResponse, EVENT_TYPE, MACHINE_VIEW, @@ -498,13 +496,8 @@ export function Overview(props: ComponentDiagramProps) { const { rpcClient } = useRpcContext(); const [workspaceName, setWorkspaceName] = React.useState(""); const [readmeContent, setReadmeContent] = React.useState(""); - const [isCodeGenerating, setIsCodeGenerating] = React.useState(false); const [projectStructure, setProjectStructure] = React.useState(); - const [responseText, setResponseText] = useState(""); - const [isLoading, setIsLoading] = useState(false); - const [loadingMessage, setLoadingMessage] = useState(""); - const backendRootUri = useRef(""); const [enabled, setEnableICP] = useState(false); const { data: devantMetadata } = useQuery({ queryKey: ["devant-metadata", props.projectPath], @@ -545,16 +538,6 @@ export function Overview(props: ComponentDiagramProps) { setEnableICP(res.enabled); }); - // setResponseText(""); - - // Fetching the backend root URI - rpcClient - .getAiPanelRpcClient() - .getBackendUrl() - .then((res) => { - backendRootUri.current = res; - }); - rpcClient .getBIDiagramRpcClient() .getReadmeContent() @@ -576,23 +559,6 @@ export function Overview(props: ComponentDiagramProps) { }); }, []); - useEffect(() => { - console.log(">>> ai responseText", { responseText }); - if (!responseText) { - return; - } - const segments = splitContent(responseText); - console.log(">>> ai code", { segments }); - - segments.forEach((segment) => { - if (segment.isCode) { - let code = segment.text; - let file = segment.fileName; - rpcClient.getAiPanelRpcClient().addToProject({ content: code, filePath: file, isTestCode: false }); - } - }); - }, [responseText]); - const deployableIntegrationTypes = useMemo(() => { if (!projectStructure) { return []; @@ -630,118 +596,6 @@ export function Overview(props: ComponentDiagramProps) { ); } - async function fetchAiResponse(isQuestion: boolean = false) { - if (readmeContent === "" && !isQuestion) { - return; - } - - setIsLoading(true); - setLoadingMessage("Reading..."); - let assistant_response = ""; - const controller = new AbortController(); - const signal = controller.signal; - const url = backendRootUri.current; - const response = await fetch(url + "/code", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ usecase: readmeContent, chatHistory: [] }), - signal: signal, - }); - if (!response.ok) { - setIsLoading(false); - throw new Error("Failed to fetch response"); - } - - const reader = response.body?.getReader(); - const decoder = new TextDecoder(); - let functions: any; - let buffer = ""; - while (true) { - const { done, value } = await reader.read(); - if (done) { - setIsLoading(false); - break; - } - - buffer += decoder.decode(value, { stream: true }); - - let boundary = buffer.indexOf("\n\n"); - while (boundary !== -1) { - const chunk = buffer.slice(0, boundary + 2); - buffer = buffer.slice(boundary + 2); - - try { - const event = parseSSEEvent(chunk); - if (event.event == "libraries") { - setLoadingMessage("Looking for libraries..."); - } else if (event.event == "functions") { - functions = event.body; - setLoadingMessage("Fetching functions..."); - } else if (event.event == "content_block_delta") { - let textDelta = event.body.text; - assistant_response += textDelta; - console.log(">>> Text Delta: " + textDelta); - setLoadingMessage("Generating components..."); - } else if (event.event == "message_stop") { - console.log(">>> Streaming stop: ", { responseText, assistant_response }); - setLoadingMessage("Verifying components..."); - console.log(assistant_response); - const newSourceFiles: ProjectSource = getProjectFromResponse(assistant_response); - // Check diagnostics - const diags: ProjectDiagnostics = await rpcClient - .getAiPanelRpcClient() - .getShadowDiagnostics(newSourceFiles); - if (diags.diagnostics.length > 0) { - console.log("Diagnostics : "); - console.log(diags.diagnostics); - const diagReq = { - response: assistant_response, - diagnostics: diags.diagnostics, - }; - const startTime = performance.now(); - const response = await fetch(url + "/code/repair", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - usecase: readmeContent, - diagnosticRequest: diagReq, - functions: functions, - }), - signal: signal, - }); - if (!response.ok) { - console.log("repair error"); - setIsLoading(false); - } else { - const jsonBody = await response.json(); - const repairResponse = jsonBody.repairResponse; - // replace original response with new code blocks - const fixedResponse = replaceCodeBlocks(assistant_response, repairResponse); - const endTime = performance.now(); - const executionTime = endTime - startTime; - console.log(`Repair call time: ${executionTime} milliseconds`); - assistant_response = fixedResponse; - } - } - setResponseText(assistant_response); - setIsLoading(false); - } else if (event.event == "error") { - console.log(">>> Streaming Error: " + event.body); - setIsLoading(false); - } - } catch (error) { - console.error("Failed to parse SSE event:", error); - } - - boundary = buffer.indexOf("\n\n"); - } - } - } - if (!projectStructure) { return ( From b28ce39ef41743c5c14a2881466f68860c6c0fb2 Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Tue, 15 Jul 2025 10:38:11 +0530 Subject: [PATCH 021/349] Improve error handling --- rush.json | 10 +- .../src/rpc-types/ai-panel/index.ts | 1 + .../src/rpc-types/ai-panel/rpc-type.ts | 5 +- .../src/features/ai/service/ask/ask.ts | 11 +- .../src/features/ai/service/code/code.ts | 38 +-- .../src/features/ai/service/connection.ts | 4 +- .../ai/service/datamapper/context_api.ts | 18 +- .../ai/service/datamapper/datamapper.ts | 8 +- .../ai/service/healthcare/healthcare.ts | 187 ++++++----- .../src/features/ai/service/libs/funcs.ts | 8 +- .../src/features/ai/service/libs/libs.ts | 8 +- .../features/ai/service/openapi/openapi.ts | 97 +++--- .../ai/service/test/function_tests.ts | 133 ++++---- .../src/features/ai/service/test/test.ts | 5 +- .../src/features/ai/service/test/test_plan.ts | 203 +++++++----- .../src/features/ai/service/utils.ts | 3 + .../src/features/ai/utils.ts | 2 +- .../src/rpc-managers/ai-panel/rpc-handler.ts | 4 + .../src/rpc-managers/ai-panel/rpc-manager.ts | 30 +- .../src/rpc-managers/ai-panel/utils.ts | 26 ++ .../src/rpc-clients/ai-panel/rpc-client.ts | 7 + .../views/AIPanel/components/AIChat/index.tsx | 6 +- .../rpc-generator/package-lock.json | 297 +++++++++--------- 23 files changed, 643 insertions(+), 468 deletions(-) diff --git a/rush.json b/rush.json index f600b8dc962..5599eccfe76 100644 --- a/rush.json +++ b/rush.json @@ -425,11 +425,11 @@ "projectFolder": "workspaces/wso2-platform/wso2-platform-extension", "versionPolicyName": "wso2-platform-extension" }, - { - "packageName": "@wso2/wso2-platform-vscode-webviews", - "projectFolder": "workspaces/wso2-platform/wso2-platform-webviews", - "versionPolicyName": "wso2-platform-extension" - }, + // { + // "packageName": "@wso2/wso2-platform-vscode-webviews", + // "projectFolder": "workspaces/wso2-platform/wso2-platform-webviews", + // "versionPolicyName": "wso2-platform-extension" + // }, { "packageName": "@wso2/choreo-core", "projectFolder": "workspaces/choreo/choreo-core", 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 b067305a519..bea3195c99c 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 @@ -78,4 +78,5 @@ export interface AIPanelAPI { generateTestPlan: (params: TestPlanGenerationRequest) => void; generateFunctionTests: (params: TestGeneratorIntermediaryState) => void; generateHealthcareCode: (params: GenerateCodeRequest) => void; + abortAIGeneration: () => void; } 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 4722ecaa32a..59e622cd811 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 @@ -14,8 +14,10 @@ * 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 { AddToProjectRequest, GetFromFileRequest, DeleteFromProjectRequest, GenerateMappingsRequest, GenerateMappingsResponse, NotifyAIMappingsRequest, ProjectSource, ProjectDiagnostics, GenerateMappingsFromRecordRequest, GenerateMappingFromRecordResponse, PostProcessRequest, PostProcessResponse, GenerateTypesFromRecordRequest, GenerateTypesFromRecordResponse, FetchDataRequest, FetchDataResponse, TestGenerationRequest, TestGenerationResponse, TestGenerationMentions, AIChatSummary, DeveloperDocument, RequirementSpecification, LLMDiagnostics, GetModuleDirParams, AIPanelPrompt, AIMachineSnapshot, SubmitFeedbackRequest, RelevantLibrariesAndFunctionsRequest, RelevantLibrariesAndFunctionsResponse, GenerateOpenAPIRequest, GenerateCodeRequest, RepairParams, TestPlanGenerationRequest, TestGeneratorIntermediaryState } from "./interfaces"; +import { AddToProjectRequest, GetFromFileRequest, DeleteFromProjectRequest, GenerateMappingsRequest, GenerateMappingsResponse, NotifyAIMappingsRequest, ProjectSource, ProjectDiagnostics, GenerateMappingsFromRecordRequest, GenerateMappingFromRecordResponse, PostProcessRequest, PostProcessResponse, GenerateTypesFromRecordRequest, GenerateTypesFromRecordResponse, FetchDataRequest, FetchDataResponse, TestGenerationRequest, TestGenerationResponse, TestGenerationMentions, AIChatSummary, DeveloperDocument, RequirementSpecification, LLMDiagnostics, GetModuleDirParams, AIPanelPrompt, AIMachineSnapshot, SubmitFeedbackRequest, RelevantLibrariesAndFunctionsRequest, GenerateOpenAPIRequest, GenerateCodeRequest, TestPlanGenerationRequest, TestGeneratorIntermediaryState, RepairParams, RelevantLibrariesAndFunctionsResponse } from "./interfaces"; import { RequestType, NotificationType } from "vscode-messenger-common"; const _preFix = "ai-panel"; @@ -74,3 +76,4 @@ export const repairGeneratedCode: NotificationType = { method: `${ 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` }; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts index f2ad1a322fa..046880e9478 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts @@ -19,9 +19,10 @@ import { LIBS_URL } from "../../utils"; import { selectRequiredFunctions } from "../libs/funcs"; import { GenerationType, getSelectedLibraries } from "../libs/libs"; import { Library, LibraryWithUrl } from "../libs/libs_types"; -import { anthropic } from "../connection"; +import { anthropic, ANTHROPIC_HAIKU } from "../connection"; import { z } from 'zod'; import { tool } from 'ai'; +import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; interface Document { document: string; @@ -218,7 +219,7 @@ export async function getAskResponse(question: string): Promise async function getToolCallsFromClaude(question: string): Promise { const { text, toolCalls } = await generateText({ - model: anthropic("claude-3-5-haiku-20241022"), + model: anthropic(ANTHROPIC_HAIKU), maxTokens: 8192, tools: tools, messages: [ @@ -228,6 +229,7 @@ async function getToolCallsFromClaude(question: string): Promise { } ], maxSteps: 1, // Limit to one step to get tool calls only + abortSignal: AIPanelAbortController.getInstance().signal }); if (toolCalls && toolCalls.length > 0) { @@ -242,7 +244,7 @@ async function getToolCallsFromClaude(question: string): Promise { async function getFinalResponseFromClaude(systemMessage: string, question: string): Promise { const { text } = await generateText({ - model: anthropic("claude-3-5-haiku-20241022"), + model: anthropic(ANTHROPIC_HAIKU), maxTokens: 8192, system: systemMessage, messages: [ @@ -250,7 +252,8 @@ async function getFinalResponseFromClaude(systemMessage: string, question: strin role: "user", content: question } - ] + ], + abortSignal: AIPanelAbortController.getInstance().signal }); return text; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index a362e420550..ab6c296d158 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -1,5 +1,5 @@ import { CoreMessage, generateText, streamText } from "ai"; -import { anthropic } from "../connection"; +import { anthropic, ANTHROPIC_SONNET_4 } from "../connection"; import { GenerationType, getRelevantLibrariesAndFunctions } from "../libs/libs"; import { getReadmeQuery, populateHistory, transformProjectSource, getErrorMessage } from "../utils"; import { getMaximizedSelectedLibs, selectRequiredFunctions, toMaximizedLibrariesFromLibJson } from "./../libs/funcs"; @@ -21,6 +21,7 @@ import { } from "@wso2/ballerina-core"; import { getProjectSource, postProcess } from "../../../../rpc-managers/ai-panel/rpc-manager"; import { CopilotEventHandler, createWebviewEventHandler } from "../event"; +import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; // Core code generation function that emits events export async function generateCodeCore(params: GenerateCodeRequest, eventHandler: CopilotEventHandler): Promise { @@ -57,10 +58,11 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler ]; const { fullStream } = streamText({ - model: anthropic("claude-3-5-sonnet-20241022"), - maxTokens: 4096, + model: anthropic(ANTHROPIC_SONNET_4), + maxTokens: 4096*4, temperature: 0, messages: allMessages, + abortSignal: AIPanelAbortController.getInstance().signal, }); eventHandler({ type: "start" }); @@ -263,27 +265,25 @@ ${fileInstructions} } export async function triggerGeneratedCodeRepair(params: RepairParams): Promise { - console.log("Triggering code repair with params: ", params); const eventHandler = createWebviewEventHandler(); - return await repairCodeCore(params, eventHandler); -} - -// Core repair function that emits events -export async function repairCodeCore(params: RepairParams, eventHandler: CopilotEventHandler): Promise { try { - eventHandler({ type: "start" }); - const resp = await repairCode(params); - eventHandler({ type: "content_replace", content: resp.repairResponse }); - eventHandler({ type: "diagnostics", diagnostics: resp.diagnostics }); - eventHandler({ type: "stop" }); - return resp; + return await repairCodeCore(params, eventHandler); } catch (error) { console.error("Error during code repair:", error); eventHandler({ type: "error", content: getErrorMessage(error) }); - throw error; } } +// Core repair function that emits events +export async function repairCodeCore(params: RepairParams, eventHandler: CopilotEventHandler): Promise { + eventHandler({ type: "start" }); + const resp = await repairCode(params); + eventHandler({ type: "content_replace", content: resp.repairResponse }); + eventHandler({ type: "diagnostics", diagnostics: resp.diagnostics }); + eventHandler({ type: "stop" }); + return resp; +} + export async function repairCode(params: RepairParams): Promise { const allMessages: CoreMessage[] = [ ...params.previousMessages, @@ -300,10 +300,12 @@ export async function repairCode(params: RepairParams): Promise ]; const { text } = await generateText({ - model: anthropic("claude-3-5-sonnet-20241022"), - maxTokens: 4096, + model: anthropic(ANTHROPIC_SONNET_4), + maxTokens: 4096 * 4, temperature: 0, messages: allMessages, + abortSignal: AIPanelAbortController.getInstance().signal + }); // replace original response with new code blocks diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts index 8640867d9f1..d39f8498631 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts @@ -1,10 +1,12 @@ import { createAnthropic } from "@ai-sdk/anthropic"; export const anthropic = createAnthropic({ - baseURL: "http://localhost:9090/intel/claude/v2", + baseURL: "https://e95488c8-8511-4882-967f-ec3ae2a0f86f-prod.e1-us-east-azure.choreoapis.dev/ballerina-copilot/intelligence-api/v1.0/claude", apiKey: "xx", //TODO: Gives error without this. see if we can remove, }); +export const ANTHROPIC_HAIKU = "claude-3-5-haiku-20241022"; +export const ANTHROPIC_SONNET_4 = "claude-sonnet-4-20250514"; //Components //TODO: Move libs into lang server API. - done diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts index 9262cb93cb7..ef1c90ce52e 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts @@ -33,7 +33,8 @@ */ import { generateText, CoreMessage } from "ai"; -import { anthropic } from "../connection"; +import { anthropic, ANTHROPIC_SONNET_4 } from "../connection"; +import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; // Types export type FileData = { @@ -442,10 +443,11 @@ async function extractionUsingClaude({ pdfData, processType }: { pdfData: string ]; const { text } = await generateText({ - model: anthropic("claude-3-5-sonnet-20241022"), + model: anthropic(ANTHROPIC_SONNET_4), maxTokens: 8192, temperature: 0, - messages: messages + messages: messages, + abortSignal: AIPanelAbortController.getInstance().signal }); return text; @@ -483,10 +485,11 @@ async function imageExtractionUsingClaude({ ]; const { text } = await generateText({ - model: anthropic("claude-3-5-sonnet-20241022"), + model: anthropic(ANTHROPIC_SONNET_4), maxTokens: 8192, temperature: 0, - messages: messages + messages: messages, + abortSignal: AIPanelAbortController.getInstance().signal }); return text; @@ -509,10 +512,11 @@ async function textExtractionUsingClaude({ ]; const { text } = await generateText({ - model: anthropic("claude-3-5-sonnet-20241022"), + model: anthropic(ANTHROPIC_SONNET_4), maxTokens: 8192, temperature: 0, - messages: messages + messages: messages, + abortSignal: AIPanelAbortController.getInstance().signal }); return text; 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 index 3efeb650f4c..72489210b45 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts @@ -45,7 +45,7 @@ import { generateText, CoreMessage, generateObject } from "ai"; import { getDataMappingPrompt } from "./prompt"; -import { anthropic } from "../connection"; +import { anthropic, ANTHROPIC_SONNET_4 } from "../connection"; import { Payload, DatamapperResponse, @@ -65,6 +65,7 @@ import { ChatResponse, } from "./types"; import { DataMappingSchema } from "./schema"; +import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; // ============================================================================= // OPERATION TYPE CONSTANTS @@ -321,11 +322,12 @@ async function getAutoMappings( try { const { object } = await generateObject({ - model: anthropic("claude-3-5-sonnet-20241022"), + model: anthropic(ANTHROPIC_SONNET_4), maxTokens: 4096, temperature: 0, messages: messages, - schema: DataMappingSchema + schema: DataMappingSchema, + abortSignal: AIPanelAbortController.getInstance().signal, }); const generatedMappings = object as AIDataMappings; 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 index b65a48bc367..99da296c906 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts @@ -1,93 +1,125 @@ import { CoreMessage, generateObject, generateText, streamText } from "ai"; -import { anthropic } from "../connection"; +import { anthropic, ANTHROPIC_HAIKU, ANTHROPIC_SONNET_4 } from "../connection"; import { GenerationType, getRelevantLibrariesAndFunctions } from "../libs/libs"; import { getReadmeQuery, populateHistory, transformProjectSource, getErrorMessage } from "../utils"; -import { getMaximizedSelectedLibs, libraryContains, selectRequiredFunctions, toMaximizedLibrariesFromLibJson } from "../libs/funcs"; +import { + getMaximizedSelectedLibs, + libraryContains, + selectRequiredFunctions, + toMaximizedLibrariesFromLibJson, +} from "../libs/funcs"; import { GetFunctionResponse, GetFunctionsRequest, getFunctionsResponseSchema } from "../libs/funcs_inter_types"; import { LANGLIBS } from "../libs/langlibs"; -import { GetTypeResponse, GetTypesRequest, GetTypesResponse, getTypesResponseSchema, Library, MiniType, TypeDefinition } from "../libs/libs_types"; -import { ChatNotify, DiagnosticEntry, FileAttatchment, GenerateCodeRequest, onChatNotify, PostProcessResponse, ProjectDiagnostics, ProjectSource, RepairParams, RepairResponse, SourceFiles } from "@wso2/ballerina-core"; +import { + GetTypeResponse, + GetTypesRequest, + GetTypesResponse, + getTypesResponseSchema, + Library, + MiniType, + TypeDefinition, +} from "../libs/libs_types"; +import { + ChatNotify, + DiagnosticEntry, + FileAttatchment, + GenerateCodeRequest, + onChatNotify, + PostProcessResponse, + ProjectDiagnostics, + ProjectSource, + RepairParams, + RepairResponse, + SourceFiles, +} from "@wso2/ballerina-core"; import { getProjectSource, postProcess } from "../../../../rpc-managers/ai-panel/rpc-manager"; import { CopilotEventHandler, createWebviewEventHandler } from "../event"; +import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; // Core healthcare code generation function that emits events -export async function generateHealthcareCodeCore(params: GenerateCodeRequest, eventHandler: CopilotEventHandler): Promise { +export async function generateHealthcareCodeCore( + params: GenerateCodeRequest, + eventHandler: CopilotEventHandler +): Promise { const project: ProjectSource = await getProjectSource("CODE_GENERATION"); const sourceFiles: SourceFiles[] = transformProjectSource(project); const prompt = getReadmeQuery(params, sourceFiles); - const relevantTrimmedFuncs: Library[] = (await getRelevantLibrariesAndFunctions({query:prompt}, GenerationType.HEALTHCARE_GENERATION)).libraries; + const relevantTrimmedFuncs: Library[] = ( + await getRelevantLibrariesAndFunctions({ query: prompt }, GenerationType.HEALTHCARE_GENERATION) + ).libraries; const historyMessages = populateHistory(params.chatHistory); const allMessages: CoreMessage[] = [ - { - role: "system", - content: getSystemPromptPrefix(relevantTrimmedFuncs), + { + role: "system", + content: getSystemPromptPrefix(relevantTrimmedFuncs), + }, + { + role: "system", + content: getSystemPromptSuffix(LANGLIBS, [], sourceFiles, params.fileAttachmentContents, prompt), + providerOptions: { + anthropic: { cacheControl: { type: "ephemeral" } }, }, - { - role: "system", - content: getSystemPromptSuffix(LANGLIBS, [], sourceFiles, params.fileAttachmentContents, prompt), - providerOptions: { - anthropic: { cacheControl: { type: "ephemeral" } }, - }, - }, - ...historyMessages, - { - role: "user", - content: prompt, - providerOptions: { - anthropic: { cacheControl: { type: "ephemeral" } }, - }, + }, + ...historyMessages, + { + role: "user", + content: prompt, + providerOptions: { + anthropic: { cacheControl: { type: "ephemeral" } }, }, + }, ]; - try { - const { fullStream } = streamText({ - model: anthropic("claude-3-5-sonnet-20241022"), - maxTokens: 4096, - temperature: 0, - messages: allMessages, - }); - - eventHandler({ type: 'start' }); - let assistantResponse: string = ""; - for await (const part of fullStream) { - switch (part.type) { - case "text-delta": { - const textPart = part.textDelta; - 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; - const postProcessedResp: PostProcessResponse = await postProcess({ - assistant_response: assistantResponse - }); - assistantResponse = postProcessedResp.assistant_response; - - eventHandler({ type: 'content_replace', content: assistantResponse }); - eventHandler({ type: 'stop' }); - break; - } + const { fullStream } = streamText({ + model: anthropic(ANTHROPIC_SONNET_4), + maxTokens: 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.textDelta; + 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; + const postProcessedResp: PostProcessResponse = await postProcess({ + assistant_response: assistantResponse, + }); + assistantResponse = postProcessedResp.assistant_response; + + eventHandler({ type: "content_replace", content: assistantResponse }); + eventHandler({ type: "stop" }); + break; } } - } catch (error) { - console.error("Error during Healthcare code generation:", error); - eventHandler({ type: 'error', content: getErrorMessage(error) }); } } // Main public function that uses the default event handler export async function generateHealthcareCode(params: GenerateCodeRequest): Promise { const eventHandler = createWebviewEventHandler(); - await generateHealthcareCodeCore(params, eventHandler); + try { + await generateHealthcareCodeCore(params, eventHandler); + } catch (error) { + console.error("Error during healthcare generation:", error); + eventHandler({ type: "error", content: getErrorMessage(error) }); + } } function getSystemPromptPrefix(apidocs: Library[]) { @@ -100,7 +132,13 @@ ${JSON.stringify(apidocs)} `; } -function getSystemPromptSuffix(langlibs: Library[], types: string[], existingCode: SourceFiles[], fileUploadContents: FileAttatchment[], usecase: string): string { +function getSystemPromptSuffix( + langlibs: Library[], + types: string[], + existingCode: SourceFiles[], + fileUploadContents: FileAttatchment[], + usecase: string +): string { return `Then, learn and understand the core Ballerina language libraries, the types and the functions they offer: ${JSON.stringify(langlibs)} @@ -252,17 +290,21 @@ Think step-by-step and start writing code. Adhere to the outcomes of the plannin `; } -export async function getRequiredTypesFromLibJson(libraries: string[], prompt: string, librariesJson: Library[]): Promise { +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 => ({ + .filter((lib) => libraryContains(lib.name, libraries)) + .map((lib) => ({ name: lib.name, description: lib.description, - types: filteredTypes(lib.typeDefs) + types: filteredTypes(lib.typeDefs), })); if (typeDefs.length === 0) { @@ -308,15 +350,16 @@ Think step-by-step to choose the required types in order to solve the given ques const messages: CoreMessage[] = [ { role: "system", content: getLibSystemPrompt }, - { role: "user", content: getLibUserPrompt } + { role: "user", content: getLibUserPrompt }, ]; try { const { object } = await generateObject({ - model: anthropic("claude-3-5-haiku-20241022"), + model: anthropic(ANTHROPIC_HAIKU), maxTokens: 8192, temperature: 0, messages: messages, - schema: getTypesResponseSchema + schema: getTypesResponseSchema, + abortSignal: AIPanelAbortController.getInstance().signal, }); const libList = object as GetTypesResponse; @@ -327,8 +370,8 @@ Think step-by-step to choose the required types in order to solve the given ques } function filteredTypes(typeDefinitions: TypeDefinition[]): MiniType[] { - return typeDefinitions.map(typeDef => ({ + return typeDefinitions.map((typeDef) => ({ name: typeDef.name, - description: typeDef.description + description: typeDef.description, })); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts index 0637104d02a..7b5d953b3c9 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts @@ -3,11 +3,12 @@ import { generateObject, CoreMessage, generateText } from "ai"; import { BACKEND_URL } from "../../utils"; import { GetFunctionResponse, GetFunctionsRequest, GetFunctionsResponse, getFunctionsResponseSchema, MinifiedClient, MinifiedRemoteFunction, MinifiedResourceFunction } from "./funcs_inter_types"; import { Client, GetTypeResponse, Library, RemoteFunction, ResourceFunction } from "./libs_types"; -import { anthropic } from "../connection"; +import { anthropic, ANTHROPIC_HAIKU } from "../connection"; import { GenerationType } from "./libs"; import { getRequiredTypesFromLibJson } from "../healthcare/healthcare"; import { langClient } from "../../activator"; import { getGenerationMode } from "../utils"; +import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; export async function selectRequiredFunctions(prompt: string, selectedLibNames: string[], generationType: GenerationType): Promise { @@ -161,11 +162,12 @@ Now, based on the provided libraries, clients, and functions, and the user query ]; try { const { object } = await generateObject({ - model: anthropic("claude-3-5-haiku-20241022"), + model: anthropic(ANTHROPIC_HAIKU), maxTokens: 8192, temperature: 0, messages: messages, - schema: getFunctionsResponseSchema + schema: getFunctionsResponseSchema, + abortSignal: AIPanelAbortController.getInstance().signal }); const libList = object as GetFunctionsResponse; 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 index 16f44d1bb3b..b627cce01fe 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts @@ -4,9 +4,10 @@ import { MinifiedLibrary, RelevantLibrariesAndFunctionsRequest, RelevantLibrarie import { BACKEND_URL } from "../../utils"; import { Library } from "./libs_types"; import { selectRequiredFunctions } from "./funcs"; -import { anthropic } from "../connection"; +import { anthropic, ANTHROPIC_HAIKU } from "../connection"; import { langClient } from "../../activator"; import { getGenerationMode } from "../utils"; +import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; interface LibraryListResponse { libraries: string[]; @@ -46,11 +47,12 @@ export async function getSelectedLibraries(prompt: string, generationType: Gener ]; //TODO: Add thinking and test with claude haiku const { object } = await generateObject({ - model: anthropic("claude-3-5-haiku-20241022"), + model: anthropic(ANTHROPIC_HAIKU), maxTokens: 4096, temperature: 0, messages: messages, - schema: LibraryListSchema + schema: LibraryListSchema, + abortSignal: AIPanelAbortController.getInstance().signal }); console.log("Selected libraries:", object.libraries); diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts index 28c9b6371b0..c3cf83cde21 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts @@ -4,69 +4,72 @@ import { BACKEND_URL } from "../../utils"; import { RPCLayer } from "../../../../../src/RPCLayer"; import { AiPanelWebview } from "../../../../views/ai-panel/webview"; import { CoreMessage, generateText, streamText } from "ai"; -import { anthropic } from "../connection"; +import { anthropic, ANTHROPIC_HAIKU } from "../connection"; import { getErrorMessage, populateHistory } from "../utils"; import { CopilotEventHandler, createWebviewEventHandler } from "../event"; +import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; // Core OpenAPI generation function that emits events -export async function generateOpenAPISpecCore(params: GenerateOpenAPIRequest, eventHandler: CopilotEventHandler): Promise { +export async function generateOpenAPISpecCore( + params: GenerateOpenAPIRequest, + eventHandler: CopilotEventHandler +): Promise { // Populate chat history and add user message const historyMessages = populateHistory(params.chatHistory); - - try { - const { fullStream } = streamText({ - model: anthropic("claude-3-5-haiku-20241022"), - maxTokens: 8192, - temperature: 0, - messages: [ - { - role: "system", - content: getSystemPrompt(), - providerOptions: { - anthropic: { cacheControl: { type: "ephemeral" } }, - }, - }, - ...historyMessages, - { - role: "user", - content: getUserPrompt(params.query), + const { fullStream } = streamText({ + model: anthropic(ANTHROPIC_HAIKU), + maxTokens: 8192, + temperature: 0, + messages: [ + { + role: "system", + content: getSystemPrompt(), + providerOptions: { + anthropic: { cacheControl: { type: "ephemeral" } }, }, - ], - }); + }, + ...historyMessages, + { + role: "user", + content: getUserPrompt(params.query), + }, + ], + abortSignal: AIPanelAbortController.getInstance().signal, + }); - eventHandler({ type: 'start' }); + eventHandler({ type: "start" }); - for await (const part of fullStream) { - switch (part.type) { - case "text-delta": { - const textPart = part.textDelta; - eventHandler({ type: 'content_block', content: textPart }); - break; - } - case "error": { - const error = part.error; - console.error("Error during OpenAPI generation:", error); - eventHandler({ type: 'error', content:getErrorMessage(error) }); - break; - } - case "finish": { - const finishReason = part.finishReason; - eventHandler({ type: 'stop'}); - break; - } + for await (const part of fullStream) { + switch (part.type) { + case "text-delta": { + const textPart = part.textDelta; + eventHandler({ type: "content_block", content: textPart }); + break; + } + case "error": { + const error = part.error; + console.error("Error during OpenAPI generation:", error); + eventHandler({ type: "error", content: getErrorMessage(error) }); + break; + } + case "finish": { + const finishReason = part.finishReason; + eventHandler({ type: "stop" }); + break; } } - } catch (error) { - console.log("Error during OpenAPI generation:", error); - eventHandler({ type: 'error', content: getErrorMessage(error) }); } } - // Main public function that uses the default event handler export async function generateOpenAPISpec(params: GenerateOpenAPIRequest): Promise { const eventHandler = createWebviewEventHandler(); - await generateOpenAPISpecCore(params, eventHandler); + try { + await generateOpenAPISpecCore(params, eventHandler); + } catch (error) { + console.error("Error during openapi generation:", error); + eventHandler({ type: "error", content: getErrorMessage(error) }); + } } function getSystemPrompt() { @@ -98,5 +101,3 @@ function getUserPrompt(query: string): string { return `User Scenario: ${query}`; } - - 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 index 4d59282715a..9632f59023e 100644 --- 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 @@ -4,81 +4,102 @@ import { generateTest, getDiagnostics } from "../../testGenerator"; import { BACKEND_URL } from "../../utils"; import { getBallerinaProjectRoot } from "../../../../rpc-managers/ai-panel/rpc-manager"; import { URI } from "vscode-uri"; -import * as fs from 'fs'; +import * as fs from "fs"; import { CopilotEventHandler, createWebviewEventHandler } from "../event"; - // Core function test generation that emits events -export async function generateFunctionTestsCore(params: TestGeneratorIntermediaryState, eventHandler: CopilotEventHandler): Promise { +export async function generateFunctionTestsCore( + params: TestGeneratorIntermediaryState, + eventHandler: CopilotEventHandler +): Promise { const testPath = "tests/test.bal"; const functionIdentifier = params.resourceFunction; - try { - 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.` }); - - const projectRoot = await getBallerinaProjectRoot(); - const response = await generateTest(projectRoot, { - backendUri: BACKEND_URL, - targetType: TestGenerationTarget.Function, - targetIdentifier: functionIdentifier, - testPlan: params.testPlan - }); + 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.`, + }); - eventHandler({ type: 'content_block', content: `\nAnalyzing generated tests for potential issues.` }); + const projectRoot = await getBallerinaProjectRoot(); + const response = await generateTest(projectRoot, { + backendUri: BACKEND_URL, + targetType: TestGenerationTarget.Function, + targetIdentifier: functionIdentifier, + testPlan: params.testPlan, + }); - 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; + eventHandler({ + type: "content_block", + content: `\nAnalyzing generated tests for potential issues.`, + }); - const diagnostics = await getDiagnostics(projectRoot, { - testSource: generatedFullSource, - }); + 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; - console.log(diagnostics); + const diagnostics = await getDiagnostics(projectRoot, { + testSource: generatedFullSource, + }); - let testCode = response.testSource; - const testConfig = response.testConfig; + console.log(diagnostics); - if (diagnostics.diagnostics.length > 0) { - eventHandler({ type: 'content_block', content: `\nRefining tests based on feedback to ensure accuracy and reliability.` }); + let testCode = response.testSource; + const testConfig = response.testConfig; - const fixedCode = await generateTest(projectRoot, { - backendUri: BACKEND_URL, - targetType: TestGenerationTarget.Function, - targetIdentifier: functionIdentifier, - testPlan: params.testPlan, - diagnostics: diagnostics, - existingTests: generatedFullSource, - }); - testCode = fixedCode.testSource; - } + if (diagnostics.diagnostics.length > 0) { + eventHandler({ + type: "content_block", + content: `\nRefining tests based on feedback to ensure accuracy and reliability.`, + }); - 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` }); - } + const fixedCode = await generateTest(projectRoot, { + backendUri: BACKEND_URL, + targetType: TestGenerationTarget.Function, + targetIdentifier: functionIdentifier, + testPlan: params.testPlan, + diagnostics: diagnostics, + existingTests: generatedFullSource, + }); + testCode = fixedCode.testSource; + } - eventHandler({ type: 'stop' }); - } catch (error) { - console.error("Error during function test generation:", error); - eventHandler({ type: 'error', content: getErrorMessage(error) }); + 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" }); } // Main public function that uses the default event handler export async function generateFunctionTests(params: TestGeneratorIntermediaryState): Promise { const eventHandler = createWebviewEventHandler(); - await generateFunctionTestsCore(params, eventHandler); + 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/test.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts index 2c367874de5..0b6261391d9 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts @@ -13,6 +13,7 @@ import { } 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 { @@ -88,8 +89,10 @@ async function getStreamedTestResponse(request: TestGenerationRequest1): Promise const { text } = await generateText({ model: anthropic("claude-sonnet-4-20250514"), maxTokens: 16384, + temperature: 0, system: systemPrompt, - messages: messages + messages: messages, + abortSignal: AIPanelAbortController.getInstance().signal }); return text; 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 index 5dec6afa5e1..bb094459a3a 100644 --- 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 @@ -1,11 +1,12 @@ import { CoreMessage, streamText } from "ai"; -import { anthropic } from "../connection"; +import { anthropic, ANTHROPIC_SONNET_4 } from "../connection"; import { getErrorMessage } from "../utils"; import { TestGenerationTarget, TestPlanGenerationRequest } from "@wso2/ballerina-core"; import { generateTest, getDiagnostics } from "../../testGenerator"; import { getBallerinaProjectRoot } from "../../../../rpc-managers/ai-panel/rpc-manager"; import { BACKEND_URL } from "../../utils"; import { CopilotEventHandler, createWebviewEventHandler } from "../event"; +import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; export interface TestPlanResponse { testPlan: string; @@ -29,31 +30,31 @@ class TestPlanBuffer { 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; @@ -61,13 +62,13 @@ class TestPlanBuffer { 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 */ @@ -79,7 +80,10 @@ class TestPlanBuffer { } // Core test plan generation function that emits events -export async function generateTestPlanCore(params: TestPlanGenerationRequest, eventHandler: CopilotEventHandler): Promise { +export async function generateTestPlanCore( + params: TestPlanGenerationRequest, + eventHandler: CopilotEventHandler +): Promise { const { targetType, targetSource, target } = params; let systemPrompt: string; let userPrompt: string; @@ -102,99 +106,126 @@ export async function generateTestPlanCore(params: TestPlanGenerationRequest, ev content: userPrompt, }, ]; - - try { - const { fullStream } = streamText({ - model: anthropic("claude-3-5-sonnet-20241022"), - maxTokens: 4096, - temperature: 0, - messages: allMessages, - }); - - 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.textDelta; - 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; + const { fullStream } = streamText({ + model: anthropic(ANTHROPIC_SONNET_4), + maxTokens: 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.textDelta; + 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 }); } - case "error": { - const error = part.error; - console.error("Error during test plan generation:", error); - eventHandler({ type: 'error', content: getErrorMessage(error) }); - break; + 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 }); } - 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.` }); - const projectRoot = await getBallerinaProjectRoot(); - const testResp = await generateTest(projectRoot, { + 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.`, + }); + const projectRoot = await getBallerinaProjectRoot(); + const testResp = await generateTest(projectRoot, { + backendUri: BACKEND_URL, + targetType: TestGenerationTarget.Service, + targetIdentifier: target, + testPlan: assistantResponse, + }); + eventHandler({ + type: "content_block", + content: `\nAnalyzing generated tests for potential issues.`, + }); + const diagnostics = await getDiagnostics(projectRoot, 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(projectRoot, { backendUri: BACKEND_URL, targetType: TestGenerationTarget.Service, targetIdentifier: target, - testPlan: assistantResponse + testPlan: assistantResponse, + diagnostics: diagnostics, + existingTests: testResp.testSource, }); - eventHandler({ type: 'content_block', content: `\nAnalyzing generated tests for potential issues.` }); - const diagnostics = await getDiagnostics(projectRoot, 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(projectRoot, { - backendUri: BACKEND_URL, - 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' }); - } else { - eventHandler({ type: 'content_block', content: `\n\n` }); - eventHandler({ type: 'intermediary_state', state: { + 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" }); + } else { + eventHandler({ + type: "content_block", + content: `\n\n`, + }); + eventHandler({ + type: "intermediary_state", + state: { resourceFunction: target, testPlan: assistantResponse, - }}); - } - break; + }, + }); } + break; } } - } catch (error) { - console.error("Error during test plan generation:", error); - eventHandler({ type: 'error', content: getErrorMessage(error) }); } } // Main public function that uses the default event handler export async function generateTestPlan(params: TestPlanGenerationRequest): Promise { const eventHandler = createWebviewEventHandler(); - await generateTestPlanCore(params, eventHandler); + try { + await generateTestPlanCore(params, eventHandler); + } catch (error) { + console.error("Error during test plan generation:", error); + eventHandler({ type: "error", content: getErrorMessage(error) }); + } } function getServiceSystemPrompt(): string { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts index eb2178db7fa..fc91323f407 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts @@ -164,6 +164,9 @@ export function getErrorMessage(error: unknown): string { if (error.name === "AI_RetryError") { return "An error occured connecting with the AI service. Please try again later."; } + if (error.name === "AbortError") { + return "Generation stopped by the user."; + } return error.message; } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts index 06eb1ec0759..63f8db8d6ab 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts @@ -29,7 +29,7 @@ export const AUTH_CLIENT_ID : string = config.get('authClientID') || process.env export const AUTH_REDIRECT_URL : string = config.get('authRedirectURL') || process.env.BALLERINA_AUTH_REDIRECT_URL; // Add new config exports for other services -export const LIBS_URL : string = "https://e95488c8-8511-4882-967f-ec3ae2a0f86f-dev.e1-us-east-azure.choreoapis.dev/ballerina-copilot/libs-api/v1.0"; +export const LIBS_URL : string = "https://e95488c8-8511-4882-967f-ec3ae2a0f86f-prod.e1-us-east-azure.choreoapis.dev/ballerina-copilot/ballerina-learn-docs-api/v1.0"; export async function closeAllBallerinaFiles(dirPath: string): Promise { // Check if the directory exists 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 4c9c1b4e12c..3fe044251e9 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 @@ -14,8 +14,11 @@ * 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 { + abortAIGeneration, abortTestGeneration, addChatSummary, addToProject, @@ -155,4 +158,5 @@ export function registerAiPanelRpcHandlers(messenger: Messenger) { 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()); } 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 a62fae16cc2..4cbafab9c3b 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 @@ -61,7 +61,7 @@ import { TestGenerationRequest, TestGenerationResponse, TestGeneratorIntermediaryState, - TestPlanGenerationRequest + TestPlanGenerationRequest, } from "@wso2/ballerina-core"; import { STKindChecker, STNode } from "@wso2/syntax-tree"; import * as crypto from 'crypto'; @@ -79,6 +79,7 @@ import { extension } from "../../BalExtensionContext"; import { NOT_SUPPORTED } from "../../core"; import { generateDataMapping, generateTypeCreation } from "../../features/ai/dataMapping"; import { generateCode, triggerGeneratedCodeRepair } from "../../features/ai/service/code/code"; +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"; @@ -100,15 +101,14 @@ import { REQ_KEY, TEST_DIR_NAME } from "./constants"; import { attemptRepairProject, checkProjectDiagnostics } from "./repair-utils"; -import { cleanDiagnosticMessages, handleStop, isErrorCode, requirementsSpecification, searchDocumentation } from "./utils"; +import { AIPanelAbortController, cleanDiagnosticMessages, handleStop, isErrorCode, requirementsSpecification, searchDocumentation } from "./utils"; import { fetchData } from "./utils/fetch-data-utils"; -import { generateHealthcareCode } from "../../features/ai/service/healthcare/healthcare"; export let hasStopped: boolean = false; export class AiPanelRpcManager implements AIPanelAPI { - private testGenAbortController: AbortController | null = null; + private abortController: AbortController; // ================================== // General Functions @@ -415,11 +415,11 @@ export class AiPanelRpcManager implements AIPanelAPI { try { const projectRoot = await getBallerinaProjectRoot(); - if (this.testGenAbortController) { - this.testGenAbortController.abort(); - } - this.testGenAbortController = new AbortController(); - const generatedTests = await generateTest(projectRoot, params, this.testGenAbortController); + // if (this.abortController) { + // this.abortController.abort(); + // } + // this.abortController = new AbortController(); + const generatedTests = await generateTest(projectRoot, params, this.abortController); resolve(generatedTests); } catch (error) { reject(error); @@ -492,10 +492,10 @@ export class AiPanelRpcManager implements AIPanelAPI { } async abortTestGeneration(): Promise { - if (this.testGenAbortController) { - this.testGenAbortController.abort(); - this.testGenAbortController = null; - } + // if (this.abortController) { + this.abortController.abort(); + // this.abortController = null; + // } } async getMappingsFromRecord(params: GenerateMappingsFromRecordRequest): Promise { @@ -789,6 +789,10 @@ export class AiPanelRpcManager implements AIPanelAPI { async generateHealthcareCode(params: GenerateCodeRequest): Promise { await generateHealthcareCode(params); } + + async abortAIGeneration(): Promise { + AIPanelAbortController.getInstance().abort(); + } } function getModifiedAssistantResponse(originalAssistantResponse: string, tempDir: string, project: ProjectSource): string { 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 962a1e35754..ea1020f1565 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 @@ -58,6 +58,32 @@ const REQUEST_TIMEOUT = 2000000; let abortController = new AbortController(); const primitiveTypes = ["string", "int", "float", "decimal", "boolean"]; +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(); + } +} + export function handleStop() { abortController.abort(); } 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 cedf0abce22..e62bd7f007e 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 @@ -14,6 +14,8 @@ * 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, @@ -51,6 +53,7 @@ import { TestGenerationResponse, TestGeneratorIntermediaryState, TestPlanGenerationRequest, + abortAIGeneration, abortTestGeneration, addChatSummary, addToProject, @@ -336,4 +339,8 @@ export class AiPanelRpcClient implements AIPanelAPI { generateHealthcareCode(params: GenerateCodeRequest): void { return this._messenger.sendNotification(generateHealthcareCode, HOST_EXTENSION, params); } + + abortAIGeneration(): void { + return this._messenger.sendNotification(abortAIGeneration, HOST_EXTENSION); + } } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx index 4a5ab4e280a..c4a77018c23 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx @@ -313,7 +313,7 @@ const AIChat: React.FC = () => { addChatEntry("assistant", messages[messages.length - 1].content); } else if (type === "error") { console.log("Received error signal"); - const errorTemplate = `\n${response.content}`; + const errorTemplate = `\n\n${response.content}`; setMessages((prevMessages) => { const newMessages = [...prevMessages]; newMessages[newMessages.length - 1].content += errorTemplate; @@ -1425,9 +1425,9 @@ const AIChat: React.FC = () => { async function handleStop() { // Abort any ongoing requests - abortFetchWithAuth(); + // abortFetchWithAuth(); // Abort test generation if running - rpcClient.getAiPanelRpcClient().abortTestGeneration(); + rpcClient.getAiPanelRpcClient().abortAIGeneration(); setIsLoading(false); setIsCodeLoading(false); diff --git a/workspaces/common-libs/rpc-generator/package-lock.json b/workspaces/common-libs/rpc-generator/package-lock.json index 45fc7abad81..1bac782e9cd 100644 --- a/workspaces/common-libs/rpc-generator/package-lock.json +++ b/workspaces/common-libs/rpc-generator/package-lock.json @@ -9,17 +9,39 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@ts-morph/common": "^0.21.0", - "ts-morph": "^20.0.0" + "@ts-morph/common": "^0.27.0", + "ts-morph": "^26.0.0" }, "devDependencies": { - "@types/node": "^20.8.10" + "@types/node": "^22.15.24" + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" } }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -32,6 +54,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", "engines": { "node": ">= 8" } @@ -40,6 +63,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -49,81 +73,74 @@ } }, "node_modules/@ts-morph/common": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.21.0.tgz", - "integrity": "sha512-ES110Mmne5Vi4ypUKrtVQfXFDtCsDXiUiGxF6ILVlE90dDD4fdpC1LSjydl/ml7xJWKSDZwUYD2zkOePMSrPBA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.27.0.tgz", + "integrity": "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==", + "license": "MIT", "dependencies": { - "fast-glob": "^3.2.12", - "minimatch": "^7.4.3", - "mkdirp": "^2.1.6", + "fast-glob": "^3.3.3", + "minimatch": "^10.0.1", "path-browserify": "^1.0.1" } }, "node_modules/@types/node": { - "version": "20.8.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", - "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "version": "22.16.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.3.tgz", + "integrity": "sha512-sr4Xz74KOUeYadexo1r8imhRtlVXcs+j3XK3TcoiYk7B1t3YRVJgtaD3cwX73NYb71pmVuMLNRhJ9XKdoDB74g==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" + "undici-types": "~6.21.0" } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, "node_modules/code-block-writer": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-12.0.0.tgz", - "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", + "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -135,6 +152,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -146,6 +164,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -154,6 +173,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -165,6 +185,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -173,16 +194,18 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -190,28 +213,15 @@ } }, "node_modules/minimatch": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mkdirp": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", - "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -226,6 +236,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -250,12 +261,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -279,6 +292,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -287,6 +301,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -295,22 +310,37 @@ } }, "node_modules/ts-morph": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-20.0.0.tgz", - "integrity": "sha512-JVmEJy2Wow5n/84I3igthL9sudQ8qzjh/6i4tmYCm6IqYyKFlNbJZi7oBdjyqcWSWYRu3CtL0xbT6fS03ESZIg==", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-26.0.0.tgz", + "integrity": "sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==", + "license": "MIT", "dependencies": { - "@ts-morph/common": "~0.21.0", - "code-block-writer": "^12.0.0" + "@ts-morph/common": "~0.27.0", + "code-block-writer": "^13.0.3" } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" } }, "dependencies": { + "@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==" + }, + "@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "requires": { + "@isaacs/balanced-match": "^4.0.1" + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -335,75 +365,61 @@ } }, "@ts-morph/common": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.21.0.tgz", - "integrity": "sha512-ES110Mmne5Vi4ypUKrtVQfXFDtCsDXiUiGxF6ILVlE90dDD4fdpC1LSjydl/ml7xJWKSDZwUYD2zkOePMSrPBA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.27.0.tgz", + "integrity": "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==", "requires": { - "fast-glob": "^3.2.12", - "minimatch": "^7.4.3", - "mkdirp": "^2.1.6", + "fast-glob": "^3.3.3", + "minimatch": "^10.0.1", "path-browserify": "^1.0.1" } }, "@types/node": { - "version": "20.8.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", - "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "version": "22.16.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.3.tgz", + "integrity": "sha512-sr4Xz74KOUeYadexo1r8imhRtlVXcs+j3XK3TcoiYk7B1t3YRVJgtaD3cwX73NYb71pmVuMLNRhJ9XKdoDB74g==", "dev": true, "requires": { - "undici-types": "~5.26.4" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" + "undici-types": "~6.21.0" } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "code-block-writer": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-12.0.0.tgz", - "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz", + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==" }, "fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" } }, "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "requires": { "reusify": "^1.0.4" } }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "requires": { "to-regex-range": "^5.0.1" } @@ -440,27 +456,22 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "minimatch": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", "requires": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" } }, - "mkdirp": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", - "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==" - }, "path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", @@ -477,9 +488,9 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==" }, "run-parallel": { "version": "1.2.0", @@ -498,18 +509,18 @@ } }, "ts-morph": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-20.0.0.tgz", - "integrity": "sha512-JVmEJy2Wow5n/84I3igthL9sudQ8qzjh/6i4tmYCm6IqYyKFlNbJZi7oBdjyqcWSWYRu3CtL0xbT6fS03ESZIg==", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-26.0.0.tgz", + "integrity": "sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==", "requires": { - "@ts-morph/common": "~0.21.0", - "code-block-writer": "^12.0.0" + "@ts-morph/common": "~0.27.0", + "code-block-writer": "^13.0.3" } }, "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "dev": true } } From 8e820d0b3e54712640c95c88a5eac54894794447 Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Tue, 15 Jul 2025 17:06:46 +0530 Subject: [PATCH 022/349] Add custom oauth fetch for anthropic provider --- .../src/features/ai/service/connection.ts | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts index d39f8498631..fce83361118 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts @@ -1,10 +1,54 @@ import { createAnthropic } from "@ai-sdk/anthropic"; +import { getAccessToken, getRefreshedAccessToken } from "../../../utils/ai/auth"; +import { AIStateMachine } from "../../../views/ai-panel/aiMachine"; +import { AIMachineEventType } from "@wso2/ballerina-core"; + +/** + * Reusable fetch function that handles authentication with token refresh + * @param input - The URL, Request object, or string to fetch + * @param options - Fetch options + * @returns Promise + */ +export async function fetchWithAuth(input: string | URL | Request, options: RequestInit = {}): Promise { + const accessToken = await getAccessToken(); + + // Ensure headers object exists + options.headers = { + ...options.headers, + 'Authorization': `Bearer ${accessToken}`, + 'User-Agent': 'Ballerina-VSCode-Plugin', + }; + + let response = await fetch(input, options); + console.log("Response status: ", response.status); + + // Handle token expiration + if (response.status === 401) { + console.log("Token expired. Refreshing token..."); + const newToken = await getRefreshedAccessToken(); + if (newToken) { + options.headers = { + ...options.headers, + 'Authorization': `Bearer ${newToken}`, + }; + response = await fetch(input, options); + } else { + AIStateMachine.service().send(AIMachineEventType.LOGOUT); + throw new Error('Authentication failed: Unable to refresh token'); + } + } + + return response; +} export const anthropic = createAnthropic({ baseURL: "https://e95488c8-8511-4882-967f-ec3ae2a0f86f-prod.e1-us-east-azure.choreoapis.dev/ballerina-copilot/intelligence-api/v1.0/claude", apiKey: "xx", //TODO: Gives error without this. see if we can remove, + fetch: fetchWithAuth, }); + + export const ANTHROPIC_HAIKU = "claude-3-5-haiku-20241022"; export const ANTHROPIC_SONNET_4 = "claude-sonnet-4-20250514"; From d2c6ce2bfd22f3f3c73d2cf807bb263aa28b5c8c Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Wed, 16 Jul 2025 13:15:20 +0530 Subject: [PATCH 023/349] Remove unwated network utils --- .../src/rpc-types/ai-panel/interfaces.ts | 6 +- .../src/features/ai/service/ask/ask.ts | 6 +- .../src/features/ai/service/connection.ts | 5 +- .../src/features/ai/service/libs/funcs.ts | 3 +- .../src/features/ai/service/libs/libs.ts | 1 - .../features/ai/service/openapi/openapi.ts | 8 +- .../ai/service/test/function_tests.ts | 3 - .../src/features/ai/service/test/test_plan.ts | 3 - .../src/features/ai/testGenerator.ts | 46 ---------- .../src/features/natural-programming/utils.ts | 26 +----- .../src/rpc-managers/ai-panel/rpc-manager.ts | 20 +---- .../src/rpc-managers/ai-panel/utils.ts | 83 +------------------ .../rpc-managers/bi-diagram/rpc-manager.ts | 23 +---- .../views/AIPanel/components/AIChat/index.tsx | 3 +- 14 files changed, 24 insertions(+), 212 deletions(-) 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 6d9349898e0..ad79f9321b6 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 @@ -139,7 +139,6 @@ export enum TestGenerationTarget { } export interface TestGenerationRequest { - backendUri: string; targetType: TestGenerationTarget; targetIdentifier: string; testPlan?: string; @@ -308,14 +307,15 @@ export interface FileAttatchment { fileName: string; content: string; } + +export type OperationType = "CODE_GENERATION" | "CODE_FOR_USER_REQUIREMENT" | "TESTS_FOR_USER_REQUIREMENT"; export interface GenerateCodeRequest { usecase: string; chatHistory: ChatEntry[]; - operationType: string; + operationType: OperationType; fileAttachmentContents: FileAttatchment[]; } - export interface SourceFiles { filePath: string; content: string; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts index 046880e9478..d4452fd897c 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts @@ -19,7 +19,7 @@ import { LIBS_URL } from "../../utils"; import { selectRequiredFunctions } from "../libs/funcs"; import { GenerationType, getSelectedLibraries } from "../libs/libs"; import { Library, LibraryWithUrl } from "../libs/libs_types"; -import { anthropic, ANTHROPIC_HAIKU } from "../connection"; +import { anthropic, ANTHROPIC_HAIKU, fetchWithAuth } from "../connection"; import { z } from 'zod'; import { tool } from 'ai'; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; @@ -94,7 +94,7 @@ async function extractLearnPages(query: string): Promise { async function fetchDocumentationFromVectorStore(query: string): Promise { try { - const response = await fetch(`${LIBS_URL}/topK`, { + const response = await fetchWithAuth(`${LIBS_URL}/topK`, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -102,7 +102,7 @@ async function fetchDocumentationFromVectorStore(query: string): PromiseRefining tests based on feedback to ensure accuracy and reliability.`, }); const fixedCode = await generateTest(projectRoot, { - backendUri: BACKEND_URL, targetType: TestGenerationTarget.Service, targetIdentifier: target, testPlan: assistantResponse, diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/testGenerator.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/testGenerator.ts index 9905ee9a08f..829cf863489 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/testGenerator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/testGenerator.ts @@ -43,8 +43,6 @@ export async function generateTest( throw new Error("The current project is not recognized as a valid Ballerina project. Please ensure you have opened a Ballerina project."); } - const backendUri = testGenRequest.backendUri; - 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."); @@ -402,15 +400,6 @@ async function sendTestGeneRequest(request: TestGenerationRequest, projectSource ...(request.existingTests && { existingTests: request.existingTests }), }; - // const response = await fetchWithTimeout(request.backendUri + "/tests", { - // method: "POST", - // headers: { - // 'Accept': 'application/json', - // 'Content-Type': 'application/json', - // 'User-Agent': 'Ballerina-VSCode-Plugin' - // }, - // body: JSON.stringify(body) - // }, abortController, TEST_GEN_REQUEST_TIMEOUT); const resp: TestGenerationResponse = await generateTestFromLLM(body); return resp; } @@ -487,41 +476,6 @@ async function findBallerinaProjectRoot(dirPath: string): Promise return null; } -const fetchWithTimeout = async ( - url: string, - options: RequestInit, - abortController: AbortController, - timeout = 300000 -): Promise => { - const id = setTimeout(() => abortController?.abort(), timeout); - - try { - options = { - ...options, - signal: abortController.signal, - }; - - const response = await fetchData(url, options); - return response; - } catch (error: any) { - if (error.name === 'AbortError') { - return { - code: -1, - message: "Request aborted" - }; - } - if (error instanceof Error) { - return { - code: -2, - message: error.message - }; - } - return UNKNOWN_ERROR; - } finally { - clearTimeout(id); - } -}; - function isErrorCode(error: any): boolean { return error.hasOwnProperty("code") && error.hasOwnProperty("message"); } 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 a5c4730e74f..f38c91b7268 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts @@ -44,6 +44,7 @@ import { getCurrentBallerinaProjectFromContext } from '../config-generator/confi import { BallerinaExtension } from 'src/core'; import { getRefreshedAccessToken } from '../../../src/utils/ai/auth'; import { AIStateMachine } from '../../../src/views/ai-panel/aiMachine'; +import { fetchWithAuth } from '../ai/service/connection'; let controller = new AbortController(); @@ -76,7 +77,7 @@ async function getLLMResponses(sources: BallerinaSource[], token: string, backen const nonDefaultModulesWithReadmeFiles: string[] = sources.map(source => source.moduleName).filter(name => name != DEFAULT_MODULE); - const commentResponsePromise = fetchWithToken( + const commentResponsePromise = fetchWithAuth( backendurl + API_DOCS_DRIFT_CHECK_ENDPOINT, { method: "POST", @@ -97,7 +98,7 @@ async function getLLMResponses(sources: BallerinaSource[], token: string, backen body.push(nonDefaultModulesWithReadmeFiles.join(", ")); } - const documentationSourceResponsePromise = fetchWithToken( + const documentationSourceResponsePromise = fetchWithAuth( backendurl + PROJECT_DOCUMENTATION_DRIFT_CHECK_ENDPOINT, { method: "POST", @@ -491,27 +492,6 @@ function getSourcesOfNonDefaultModulesWithReadme(modulesDir: string): BallerinaS return sources; } -export async function fetchWithToken(url: string, options: RequestInit) { - try { - let response = await fetch(url, options); - console.log("Response status: ", response.status); - if (response.status === 401) { - console.log("Token expired. Refreshing token..."); - const newToken = await getRefreshedAccessToken(); - if (newToken) { - options.headers = { - ...options.headers, - 'Authorization': `Bearer ${newToken}`, - }; - response = await fetch(url, options); - } - } - return response; - } catch (error) { - return Error("Error occured while sending the request"); - } -} - export function getPluginConfig(): BallerinaPluginConfig { return vscode.workspace.getConfiguration('ballerina'); } 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 4cbafab9c3b..dcac1054fc7 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 @@ -103,13 +103,10 @@ import { import { attemptRepairProject, checkProjectDiagnostics } from "./repair-utils"; import { AIPanelAbortController, cleanDiagnosticMessages, handleStop, isErrorCode, requirementsSpecification, searchDocumentation } from "./utils"; import { fetchData } from "./utils/fetch-data-utils"; - -export let hasStopped: boolean = false; +import { fetchWithAuth } from "../../../src/features/ai/service/connection"; export class AiPanelRpcManager implements AIPanelAPI { - private abortController: AbortController; - // ================================== // General Functions // ================================== @@ -278,7 +275,6 @@ export class AiPanelRpcManager implements AIPanelAPI { let { filePath, position } = params; const fileUri = Uri.file(filePath).toString(); - hasStopped = false; const fnSTByRange = await StateMachine.langClient().getSTByRange( { @@ -354,7 +350,6 @@ export class AiPanelRpcManager implements AIPanelAPI { } async stopAIMappings(): Promise { - hasStopped = true; handleStop(); return { userAborted: true }; } @@ -415,11 +410,7 @@ export class AiPanelRpcManager implements AIPanelAPI { try { const projectRoot = await getBallerinaProjectRoot(); - // if (this.abortController) { - // this.abortController.abort(); - // } - // this.abortController = new AbortController(); - const generatedTests = await generateTest(projectRoot, params, this.abortController); + const generatedTests = await generateTest(projectRoot, params, AIPanelAbortController.getInstance()); resolve(generatedTests); } catch (error) { reject(error); @@ -492,10 +483,7 @@ export class AiPanelRpcManager implements AIPanelAPI { } async abortTestGeneration(): Promise { - // if (this.abortController) { - this.abortController.abort(); - // this.abortController = null; - // } + AIPanelAbortController.getInstance().abort(); } async getMappingsFromRecord(params: GenerateMappingsFromRecordRequest): Promise { @@ -737,7 +725,7 @@ export class AiPanelRpcManager implements AIPanelAPI { diagnostics: cleanDiagnosticMessages(content.diagnostics) }; - const response = await fetchData(`${BACKEND_URL}/feedback`, { + const response = await fetchWithAuth(`${BACKEND_URL}/feedback`, { method: 'POST', headers: { 'Content-Type': 'application/json' 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 ea1020f1565..66903577579 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 @@ -34,11 +34,9 @@ import { TOO_MANY_REQUESTS, INVALID_RECORD_UNION_TYPE } from "../../views/ai-panel/errorCodes"; -import { hasStopped } from "./rpc-manager"; // import { StateMachineAI } from "../../views/ai-panel/aiMachine"; import path from "path"; import * as fs from 'fs'; -import { BACKEND_URL } from "../../features/ai/utils"; import { getAccessToken, getRefreshedAccessToken } from "../../../src/utils/ai/auth"; import { AIStateMachine } from "../../../src/views/ai-panel/aiMachine"; import { AIChatError } from "./utils/errors"; @@ -47,15 +45,6 @@ import { DatamapperResponse, Payload } from "../../../src/features/ai/service/da import { DataMapperRequest, DataMapperResponse, FileData, processDataMapperInput } from "../../../src/features/ai/service/datamapper/context_api"; import { getAskResponse } from "../../../src/features/ai/service/ask/ask"; -const BACKEND_BASE_URL = BACKEND_URL.replace(/\/v2\.0$/, ""); -//TODO: Temp workaround as custom domain seem to block file uploads -const CONTEXT_UPLOAD_URL_V1 = "https://e95488c8-8511-4882-967f-ec3ae2a0f86f-prod.e1-us-east-azure.choreoapis.dev/ballerina-copilot/context-upload-api/v1.0"; -// const CONTEXT_UPLOAD_URL_V1 = BACKEND_BASE_URL + "/context-api/v1.0"; -const ASK_API_URL_V1 = BACKEND_BASE_URL + "/ask-api/v1.0"; - -const REQUEST_TIMEOUT = 2000000; - -let abortController = new AbortController(); const primitiveTypes = ["string", "int", "float", "decimal", "boolean"]; export class AIPanelAbortController { @@ -85,7 +74,7 @@ export class AIPanelAbortController { } export function handleStop() { - abortController.abort(); + AIPanelAbortController.getInstance().abort(); } export async function getParamDefinitions( @@ -1494,25 +1483,6 @@ function determineMimeType(fileName: string): string { } } -async function fetchWithTimeout(url, options, timeout = 100000): Promise { - abortController = new AbortController(); - const id = setTimeout(() => abortController.abort(), timeout); - try { - const response = await fetch(url, { ...options, signal: abortController.signal }); - clearTimeout(id); - return response; - } catch (error: any) { - if (error.name === 'AbortError' && !hasStopped) { - return TIMEOUT; - } else if (error.name === 'AbortError' && hasStopped) { - return USER_ABORTED; - } else { - console.error(error); - return SERVER_ERROR; - } - } -} - export function isErrorCode(error: any): boolean { return error.hasOwnProperty("code") && error.hasOwnProperty("message"); } @@ -2027,31 +1997,6 @@ async function processCombinedKey( return { isinputRecordArrayNullable, isinputRecordArrayOptional, isinputArrayNullable, isinputArrayOptional, isinputNullableArray }; } -async function sendRequirementFileUploadRequest(file: Blob): Promise { - const formData = new FormData(); - formData.append("file", file); - const response = await fetchWithToken(CONTEXT_UPLOAD_URL_V1 + "/file_upload/extract_requirements", { - method: "POST", - body: formData - }); - return response; -} - -export async function getTextFromRequirements(file: Blob): Promise { - try { - let response = await sendRequirementFileUploadRequest(file); - if (isErrorCode(response)) { - return response as ErrorCode; - } - response = response as Response; - let requirements = await filterMappingResponse(response) as string; - return requirements; - } catch (error) { - console.error(error); - return UNKNOWN_ERROR; - } -} - export async function requirementsSpecification(filepath: string): Promise { if (!filepath) { throw new Error("File is undefined"); @@ -2072,32 +2017,6 @@ function getBase64FromFile(filePath) { return fileBuffer.toString('base64'); } -export async function fetchWithToken(url: string, options: RequestInit) { - const accessToken = await getAccessToken(); - options.headers = { - ...options.headers, - 'Authorization': `Bearer ${accessToken}`, - 'User-Agent': 'Ballerina-VSCode-Plugin', - }; - let response = await fetch(url, options); - console.log("Response status: ", response.status); - if (response.status === 401) { - console.log("Token expired. Refreshing token..."); - const newToken = await getRefreshedAccessToken(); - if (newToken) { - options.headers = { - ...options.headers, - 'Authorization': `Bearer ${newToken}`, - }; - response = await fetch(url, options); - } else { - AIStateMachine.service().send(AIMachineEventType.LOGOUT); - return; - } - } - return response; -} - export function cleanDiagnosticMessages(entries: DiagnosticEntry[]): DiagnosticEntry[] { return entries.map(entry => ({ code: entry.code || "", 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 0080b21e004..e163771284b 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 @@ -163,6 +163,7 @@ import { cleanAndValidateProject, getCurrentBIProject } from "../../features/con import { updateSourceCode } from "../../utils/source-utils"; import { getRefreshedAccessToken } from "../../../src/utils/ai/auth"; import { applyBallerinaTomlEdit } from "./utils"; +import { fetchWithAuth } from "../../../src/features/ai/service/connection"; export class BiDiagramRpcManager implements BIDiagramAPI { OpenConfigTomlRequest: (params: OpenConfigTomlRequest) => Promise; @@ -435,7 +436,7 @@ export class BiDiagramRpcManager implements BIDiagramAPI { }; console.log(">>> request ai suggestion", { request: requestBody }); // generate new nodes - const response = await fetchWithToken(BACKEND_URL + "/inline/generation", requestOptions); + const response = await fetchWithAuth(BACKEND_URL + "/inline/generation", requestOptions); if (!response.ok) { console.log(">>> ai completion api call failed ", response); return new Promise((resolve) => { @@ -1258,7 +1259,7 @@ export class BiDiagramRpcManager implements BIDiagramAPI { }; console.log(">>> request ai suggestion", { request: requestBody }); // generate new nodes - const response = await fetchWithToken(BACKEND_URL + "/completion", requestOptions); + const response = await fetchWithAuth(BACKEND_URL + "/completion", requestOptions); if (!response.ok) { console.log(">>> ai completion api call failed ", response); return new Promise((resolve) => { @@ -1720,24 +1721,6 @@ export function getRepoRoot(projectRoot: string): string | undefined { return getRepoRoot(path.join(projectRoot, "..")); } -export async function fetchWithToken(url: string, options: RequestInit) { - let response = await fetch(url, options); - console.log("Response status: ", response.status); - if (response.status === 401) { - console.log("Token expired. Refreshing token..."); - const newToken = await getRefreshedAccessToken(); - console.log("refreshed token : " + newToken); - if (newToken) { - options.headers = { - ...options.headers, - 'Authorization': `Bearer ${newToken}`, - }; - response = await fetch(url, options); - } - } - return response; -} - export async function getBallerinaFiles(dir: string): Promise { let files: string[] = []; const entries = fs.readdirSync(dir, { withFileTypes: true }); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx index c4a77018c23..a40f8e1f8d9 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx @@ -38,6 +38,7 @@ import { TestGeneratorIntermediaryState, SourceFiles, ChatEntry, + OperationType, } from "@wso2/ballerina-core"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; @@ -676,7 +677,7 @@ const AIChat: React.FC = () => { setIsSyntaxError(false); } - async function processCodeGeneration(content: [string, Attachment[], string], message: string) { + async function processCodeGeneration(content: [string, Attachment[], OperationType], message: string) { const [useCase, attachments, operationType] = content; const fileAttatchments = attachments.map((file) => ({ fileName: file.name, From 8d542d5af6238ecccd8ce1314d71810d3ea7e3fa Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Wed, 16 Jul 2025 13:30:06 +0530 Subject: [PATCH 024/349] Add operation type to core --- .../src/rpc-types/ai-panel/index.ts | 1 - .../src/rpc-types/ai-panel/rpc-type.ts | 1 - .../src/features/ai/service/code/code.ts | 2 +- .../ai/service/healthcare/healthcare.ts | 2 +- .../src/rpc-managers/ai-panel/rpc-handler.ts | 2 - .../src/rpc-managers/ai-panel/rpc-manager.ts | 70 +++++++++---------- .../src/rpc-clients/ai-panel/rpc-client.ts | 5 -- 7 files changed, 35 insertions(+), 48 deletions(-) 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 bea3195c99c..14a0e3d1ca6 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 @@ -36,7 +36,6 @@ export interface AIPanelAPI { generateMappings: (params: GenerateMappingsRequest) => Promise; notifyAIMappings: (params: NotifyAIMappingsRequest) => Promise; stopAIMappings: () => Promise; - getProjectSource: (params: string) => Promise; getShadowDiagnostics: (params: ProjectSource) => Promise; checkSyntaxError: (params: ProjectSource) => Promise; clearInitialPrompt: () => void; 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 59e622cd811..fbf8fec0e20 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 @@ -35,7 +35,6 @@ export const deleteFromProject: NotificationType = { m export const generateMappings: RequestType = { method: `${_preFix}/generateMappings` }; export const notifyAIMappings: RequestType = { method: `${_preFix}/notifyAIMappings` }; export const stopAIMappings: RequestType = { method: `${_preFix}/stopAIMappings` }; -export const getProjectSource: RequestType = { method: `${_preFix}/getProjectSource` }; export const getShadowDiagnostics: RequestType = { method: `${_preFix}/getShadowDiagnostics` }; export const checkSyntaxError: RequestType = { method: `${_preFix}/checkSyntaxError` }; export const clearInitialPrompt: NotificationType = { method: `${_preFix}/clearInitialPrompt` }; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index ab6c296d158..45ceda7d8c7 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -25,7 +25,7 @@ import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel // Core code generation function that emits events export async function generateCodeCore(params: GenerateCodeRequest, eventHandler: CopilotEventHandler): Promise { - const project: ProjectSource = await getProjectSource("CODE_GENERATION"); + const project: ProjectSource = await getProjectSource(params.operationType); const packageName = project.projectName; const sourceFiles: SourceFiles[] = transformProjectSource(project); const prompt = getReadmeQuery(params, sourceFiles); 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 index 99da296c906..5f724f7c5f2 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts @@ -41,7 +41,7 @@ export async function generateHealthcareCodeCore( params: GenerateCodeRequest, eventHandler: CopilotEventHandler ): Promise { - const project: ProjectSource = await getProjectSource("CODE_GENERATION"); + const project: ProjectSource = await getProjectSource(params.operationType); const sourceFiles: SourceFiles[] = transformProjectSource(project); const prompt = getReadmeQuery(params, sourceFiles); const relevantTrimmedFuncs: Library[] = ( 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 3fe044251e9..e1718413855 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 @@ -59,7 +59,6 @@ import { getMappingsFromRecord, getModuleDirectory, GetModuleDirParams, - getProjectSource, getProjectUuid, getRefreshedAccessToken, getRelevantLibrariesAndFunctions, @@ -117,7 +116,6 @@ export function registerAiPanelRpcHandlers(messenger: Messenger) { messenger.onRequest(generateMappings, (args: GenerateMappingsRequest) => rpcManger.generateMappings(args)); messenger.onRequest(notifyAIMappings, (args: NotifyAIMappingsRequest) => rpcManger.notifyAIMappings(args)); messenger.onRequest(stopAIMappings, () => rpcManger.stopAIMappings()); - messenger.onRequest(getProjectSource, (args: string) => rpcManger.getProjectSource(args)); messenger.onRequest(getShadowDiagnostics, (args: ProjectSource) => rpcManger.getShadowDiagnostics(args)); messenger.onRequest(checkSyntaxError, (args: ProjectSource) => rpcManger.checkSyntaxError(args)); messenger.onNotification(clearInitialPrompt, () => rpcManger.clearInitialPrompt()); 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 dcac1054fc7..2b68afaaaa0 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 @@ -44,6 +44,7 @@ import { GetModuleDirParams, LLMDiagnostics, NotifyAIMappingsRequest, + OperationType, PostProcessRequest, PostProcessResponse, ProjectDiagnostics, @@ -73,6 +74,7 @@ import { Uri, commands, window, workspace } from 'vscode'; import { isNumber } from "lodash"; import { URI } from "vscode-uri"; +import { fetchWithAuth } from "../../../src/features/ai/service/connection"; import { generateOpenAPISpec } from "../../../src/features/ai/service/openapi/openapi"; import { AIStateMachine } from "../../../src/views/ai-panel/aiMachine"; import { extension } from "../../BalExtensionContext"; @@ -103,7 +105,6 @@ import { import { attemptRepairProject, checkProjectDiagnostics } from "./repair-utils"; import { AIPanelAbortController, cleanDiagnosticMessages, handleStop, isErrorCode, requirementsSpecification, searchDocumentation } from "./utils"; import { fetchData } from "./utils/fetch-data-utils"; -import { fetchWithAuth } from "../../../src/features/ai/service/connection"; export class AiPanelRpcManager implements AIPanelAPI { @@ -354,10 +355,6 @@ export class AiPanelRpcManager implements AIPanelAPI { return { userAborted: true }; } - async getProjectSource(requestType: string): Promise { - return getProjectSource(requestType); - } - async getShadowDiagnostics(project: ProjectSource): Promise { const environment = await setupProjectEnvironment(project); if (!environment) { @@ -902,7 +899,7 @@ enum CodeGenerationType { CODE_GENERATION = "CODE_GENERATION" } -async function getCurrentProjectSource(requestType: string): Promise { +async function getCurrentProjectSource(requestType: OperationType): Promise { const projectRoot = await getBallerinaProjectRoot(); if (!projectRoot) { @@ -938,7 +935,7 @@ async function getCurrentProjectSource(requestType: string): Promise { + // Fetch the Ballerina project source + const project: BallerinaProject = await getCurrentProjectSource(requestType); - export async function getProjectSource(requestType: string): Promise { - // Fetch the Ballerina project source - const project: BallerinaProject = await getCurrentProjectSource(requestType); - - // Initialize the ProjectSource object - const projectSource: ProjectSource = { - sourceFiles: [], - projectModules: [], - projectName: project.projectName, - }; + // Initialize the ProjectSource object + const projectSource: ProjectSource = { + sourceFiles: [], + projectModules: [], + projectName: project.projectName, + }; - // Iterate through root-level sources - for (const [filePath, content] of Object.entries(project.sources)) { - projectSource.sourceFiles.push({ filePath, content }); - } + // 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)) { - // const filePath = `modules/${module.moduleName}/${fileName}`; - // projectSource.sourceFiles.push({ filePath, content }); - projectModule.sourceFiles.push({ filePath: fileName, content }); - } - projectSource.projectModules.push(projectModule); + // 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)) { + // const filePath = `modules/${module.moduleName}/${fileName}`; + // projectSource.sourceFiles.push({ filePath, content }); + projectModule.sourceFiles.push({ filePath: fileName, content }); } + projectSource.projectModules.push(projectModule); } - - return projectSource; } + + return projectSource; +} 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 e62bd7f007e..61d2476802e 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 @@ -82,7 +82,6 @@ import { getGeneratedTests, getMappingsFromRecord, getModuleDirectory, - getProjectSource, getProjectUuid, getRefreshedAccessToken, getRelevantLibrariesAndFunctions, @@ -176,10 +175,6 @@ export class AiPanelRpcClient implements AIPanelAPI { return this._messenger.sendRequest(stopAIMappings, HOST_EXTENSION); } - getProjectSource(params: string): Promise { - return this._messenger.sendRequest(getProjectSource, HOST_EXTENSION, params); - } - getShadowDiagnostics(params: ProjectSource): Promise { return this._messenger.sendRequest(getShadowDiagnostics, HOST_EXTENSION, params); } From 1dc1839a400b5e683ae747cb5cc9280a6f2ad5ec Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Thu, 17 Jul 2025 14:42:00 +0530 Subject: [PATCH 025/349] Fix NP and code gen issues --- .../src/rpc-types/ai-panel/interfaces.ts | 3 + .../src/features/ai/service/code/code.ts | 42 +- .../features/ai/service/code/np_prompts.ts | 343 ++++++++++++++ .../src/features/ai/service/connection.ts | 8 +- .../ai/service/healthcare/healthcare.ts | 4 +- .../src/features/ai/service/libs/funcs.ts | 422 +++++++++++++++--- .../src/features/ai/service/libs/libs.ts | 48 +- .../src/features/ai/service/utils.ts | 28 +- .../views/AIPanel/components/AIChat/index.tsx | 8 +- .../views/AIPanel/components/CodeSection.tsx | 4 +- 10 files changed, 810 insertions(+), 100 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/code/np_prompts.ts 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 ad79f9321b6..b1f697b6b24 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 @@ -353,3 +353,6 @@ export interface CopilotFilterLibrariesRequest { export interface CopilotFilterLibrariesResponse { libraries: any[]; } + +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"; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 45ceda7d8c7..d017b171c23 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -1,7 +1,7 @@ import { CoreMessage, generateText, streamText } from "ai"; import { anthropic, ANTHROPIC_SONNET_4 } from "../connection"; import { GenerationType, getRelevantLibrariesAndFunctions } from "../libs/libs"; -import { getReadmeQuery, populateHistory, transformProjectSource, getErrorMessage } from "../utils"; +import { getRewrittenPrompt, populateHistory, transformProjectSource, getErrorMessage, extractResourceDocumentContent } from "../utils"; import { getMaximizedSelectedLibs, selectRequiredFunctions, toMaximizedLibrariesFromLibJson } from "./../libs/funcs"; import { GetFunctionResponse } from "./../libs/funcs_inter_types"; import { LANGLIBS } from "./../libs/langlibs"; @@ -12,6 +12,7 @@ import { FileAttatchment, GenerateCodeRequest, onChatNotify, + OperationType, PostProcessResponse, ProjectDiagnostics, ProjectSource, @@ -22,23 +23,24 @@ import { import { getProjectSource, postProcess } from "../../../../rpc-managers/ai-panel/rpc-manager"; import { CopilotEventHandler, createWebviewEventHandler } from "../event"; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; +import { getRequirementAnalysisCodeGenPrefix, getRequirementAnalysisTestGenPrefix } from "./np_prompts"; // Core code generation function that emits events export async function generateCodeCore(params: GenerateCodeRequest, eventHandler: CopilotEventHandler): Promise { const project: ProjectSource = await getProjectSource(params.operationType); const packageName = project.projectName; const sourceFiles: SourceFiles[] = transformProjectSource(project); - const prompt = getReadmeQuery(params, sourceFiles); + const prompt = getRewrittenPrompt(params, sourceFiles); const relevantTrimmedFuncs: Library[] = ( await getRelevantLibrariesAndFunctions({ query: prompt }, GenerationType.CODE_GENERATION) ).libraries; const historyMessages = populateHistory(params.chatHistory); - + //TODO: Remove Readme.md from NP Path const allMessages: CoreMessage[] = [ { role: "system", - content: getSystemPromptPrefix(relevantTrimmedFuncs), + content: getSystemPromptPrefix(relevantTrimmedFuncs, sourceFiles, params.operationType), }, { role: "system", @@ -50,7 +52,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler ...historyMessages, { role: "user", - content: getUserPrompt(prompt, sourceFiles, params.fileAttachmentContents, packageName), + content: getUserPrompt(prompt, sourceFiles, params.fileAttachmentContents, packageName, params.operationType), providerOptions: { anthropic: { cacheControl: { type: "ephemeral" } }, }, @@ -83,6 +85,11 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler } case "finish": { const finishReason = part.finishReason; + console.log("Finish reason: ", finishReason); + if (finishReason === "error") { + // Already handled in error case. + break; + } const postProcessedResp: PostProcessResponse = await postProcess({ assistant_response: assistantResponse, }); @@ -100,19 +107,18 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler console.log("Repair iteration: ", repair_attempt); console.log("Diagnotsics trynna fix: ", diagnostics); - const repairedResponse: RepairResponse = await repairCodeCore( + const repairedResponse: RepairResponse = await repairCode( { previousMessages: allMessages, assistantResponse: diagnosticFixResp, diagnostics: diagnostics, - }, - eventHandler + } ); diagnosticFixResp = repairedResponse.repairResponse; diagnostics = repairedResponse.diagnostics; repair_attempt++; } - + console.log("Final Diagnostics ", diagnostics); eventHandler({ type: "content_replace", content: diagnosticFixResp }); eventHandler({ type: "diagnostics", diagnostics: diagnostics }); eventHandler({ type: "messages", messages: allMessages }); @@ -134,7 +140,13 @@ export async function generateCode(params: GenerateCodeRequest): Promise { } } -function getSystemPromptPrefix(apidocs: Library[]) { +function getSystemPromptPrefix(apidocs: Library[], sourceFiles: SourceFiles[], op: OperationType): string { + + if (op === "CODE_FOR_USER_REQUIREMENT") { + return getRequirementAnalysisCodeGenPrefix(apidocs, extractResourceDocumentContent(sourceFiles)); + } else if (op === "TESTS_FOR_USER_REQUIREMENT") { + return getRequirementAnalysisTestGenPrefix(apidocs, extractResourceDocumentContent(sourceFiles)); + } return `You are an expert assistant who specializes in writing Ballerina code. 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: @@ -233,7 +245,8 @@ function getUserPrompt( usecase: string, existingCode: SourceFiles[], fileUploadContents: FileAttatchment[], - packageName: string + packageName: string, + op: OperationType ): string { let fileInstructions = ""; if (fileUploadContents.length > 0) { @@ -254,7 +267,7 @@ ${usecase} Existing Code: Users existing code. -${stringifyExistingCode(existingCode)} +${stringifyExistingCode(existingCode, op)} Current Package name: ${packageName} @@ -279,6 +292,7 @@ export async function repairCodeCore(params: RepairParams, eventHandler: Copilot eventHandler({ type: "start" }); const resp = await repairCode(params); eventHandler({ type: "content_replace", content: resp.repairResponse }); + console.log("Manual Repair Diagnostics left: ", resp.diagnostics); eventHandler({ type: "diagnostics", diagnostics: resp.diagnostics }); eventHandler({ type: "stop" }); return resp; @@ -319,11 +333,11 @@ export async function repairCode(params: RepairParams): Promise return { repairResponse: diagnosticFixResp, diagnostics: postProcessResp.diagnostics.diagnostics }; } -function stringifyExistingCode(existingCode: SourceFiles[], isBallerinaSourcesOnly: boolean = false): string { +function stringifyExistingCode(existingCode: SourceFiles[], op: OperationType): string { let existingCodeStr = ""; for (const file of existingCode) { const filePath = file.filePath; - if (isBallerinaSourcesOnly && !filePath.endsWith(".bal")) { + if (op !== "CODE_GENERATION" && !filePath.endsWith(".bal")) { continue; } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/np_prompts.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/np_prompts.ts new file mode 100644 index 00000000000..7b20acaced1 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/np_prompts.ts @@ -0,0 +1,343 @@ +import { Library } from "../libs/libs_types"; + +export const REQUIREMENTS_DOCUMENT_KEY: string = "user_requirements_file"; + +export function getRequirementAnalysisCodeGenPrefix(apidocs: Library[], requirementAnalysisDocument: string) { + return `You are an expert assistant specializing in the Ballerina programming language. Your goal is to provide accurate and functional Ballerina code in response to queries while adhering to the constraints outlined in the given API documentation. + +You are tasked with generating Ballerina code based on a requirement analysis document for a system. The document contains an overview of the system and its use cases. Your objective is to create a Ballerina implementation that reflects the requirements described in the document. + +First, carefully read and analyze the following requirement analysis document and provide an accurate Ballerina program based on this document: + + +${requirementAnalysisDocument} + + +You will be provided with the following inputs: + +1. **API_DOCS**: A JSON string containing the API documentation for various Ballerina libraries, including their functions, types, and clients. + +${JSON.stringify(apidocs)} + + +### **Instructions for Handling Missing or Empty Requirement Specification:** +1. If the requirement specification is **missing** (i.e., the \`\` tag is not present in the input) or its content is **empty** (i.e., the content inside the tag is blank), respond with the following message: + \`"No requirement specification file found in the natural-programming directory. First, place your requirement specification file there to generate code based on the requirements."\` + Do not proceed with code generation in this case. + +2. If the requirement specification is present and contains valid content, proceed to analyze the document and generate Ballerina code based on the requirements described in it. Use the provided \`API_DOCS\` to ensure the generated code adheres to the correct API usage. + +Please add the proper API documentation for each function, service, resource, varaible declarations, type definitions and classes in the generated Ballerina code. + +### **Output Format:** +- 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 + + + + +{ + "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. + + + +{ + "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(apidocs: Library[], 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. + +**Inputs**: +1. **Requirement Document**: ${requirementAnalysisDocument} +3. **API_DOCS**: A JSON string that includes API documentation for different Ballerina libraries, covering their functions, types, and clients. +\`\`\`json +${JSON.stringify(apidocs)} +\`\`\` + +**Output Requirements**: +1. **Executable Test Suite** (Ballerina test code) +2. **Test Plan Summary** (Brief summary of the test plan for reference in the console) + +**Processing Steps**: + +[PHASE 1: TEST PLAN Generation] +1. Analyze requirement specifications to identify: + - Core functional requirements + - Business rules and constraints + - Success criteria + - Error conditions + - Performance expectations + - Non-functional requirements + - Data requirements + - Security requirements + - Integration points + +2. Examine Ballerina source code to extract interfaces such as: + - Service/resource endpoints + - Public functions + - Public class methods + - Input parameters and types + - Return types and response structures + - Documented error types + - Configurable variables +3. Write test plan that containing: + - Test objectives mapping to functional requirements + - Test objectives mapping to non functional requirements + - For each and every interface extracted in step 2, generate: + - Happy path scenarios + - Negative test scenarios + - Boundary/edge cases + - Data requirements + - Success metrics + - error handling scenarios + +[PHASE 2: TEST IMPLEMENTATION] +1. Identify the imports required for the test module. + +2. Create Ballerina test module with: + - Network client configurations (if required, e.g., HTTP, GraphQL, WebSocket, etc.) + - Test data factories + - Reusable validation functions + +3. Implement test cases that: + - Verify functional requirement compliance + - Verify non-functional requirement compliance + - Validate interface contracts implemented in the source code + - Assert business rules and constraints according to the requirement document + - Assert error scenarios according to the requirement document + - Check error handling according to the requirement document + +**Strict Rules**: +1. Tests MUST NOT depend on implementation details of the Ballerina code. +2. All test cases MUST trace to the requirement document. +3. Interface analysis MUST BE LIMITED to: + - Function signatures + - Class method signatures + - Resource/method signatures + - Remote function signatures + - Type definitions + - Configurable variable declarations + - Error type definitions + +**Output Format**: +\`\`\`markdown +# Test Plan Summary (For Console) +[Starting foreach identified interface] + - **Service Name**: [Service Name] + - **Key Features**: [Brief description of key features] + - **Test Scenarios**: [Number of scenarios] + - [Scenario 1]: [Brief description] + - [Scenario 2]: [Brief description] + - [Scenario 3]: [Brief description] + - **Risk Areas**: [Key risk 1], [Key risk 2] + +# Test Implementation Files +\`\`\`toml +[Required configuration entries] +\`\`\` +\`\`\`ballerina +import ballerina/test; +import ballerina/http; + +// Test client setup (if required) +final http:Client clientEp = check new ("http://localhost:9090"); + +// Test cases for each identified scenario +@test:Config {} +function testCreateResource() returns error? { + // Implementation +} +\`\`\` +\`\`\` + +**Implementation Guidelines**: +1. Test Code MUST: + - Validate functions and resources according to the requirement document. + - Validate input and output types according to the requirement document. + - Validate error handling according to the requirement document. + - Validate response schemas according to the requirement document. + - Check status codes according to the requirement document. + - Verify error payload structures according to the requirement document. + - Maintain test data isolation according to the requirement document. + +2. For HTTP methods (if used inside the tests): + - GET: Validate response structure and status. + - POST: Verify resource creation, location headers, validate response structure and status. + - PUT: Check idempotency, update verification, validate response structure and status. + - DELETE: Confirm resource removal, validate response structure and status. + +3. Assertion Requirements: + - Use \`test:assertEquals\` for exact matches. + - Verify error codes match the requirement document. + - 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 +# tsts/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**: + +1. Verify **100% test coverage for all functional and non-functional requirements in requirements document**. +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. +`; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts index ad00da4e9b4..d1fd0972c2c 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts @@ -17,6 +17,8 @@ export async function fetchWithAuth(input: string | URL | Request, options: Requ ...options.headers, 'Authorization': `Bearer ${accessToken}`, 'User-Agent': 'Ballerina-VSCode-Plugin', + 'Connection': 'keep-alive', + // 'Keep-Alive': 'timeout=60, max=100' }; let response = await fetch(input, options); @@ -41,8 +43,10 @@ export async function fetchWithAuth(input: string | URL | Request, options: Requ return response; } +let url = "https://e95488c8-8511-4882-967f-ec3ae2a0f86f-prod.e1-us-east-azure.choreoapis.dev/ballerina-copilot/intelligence-api/v1.0/claude"; +// let url = "http://localhost:9090/intel/claude" export const anthropic = createAnthropic({ - baseURL: "https://e95488c8-8511-4882-967f-ec3ae2a0f86f-prod.e1-us-east-azure.choreoapis.dev/ballerina-copilot/intelligence-api/v1.0/claude", + baseURL: url, apiKey: "xx", //TODO: Gives error without this. see if we can remove, fetch: fetchWithAuth, }); @@ -63,7 +67,7 @@ export const ANTHROPIC_SONNET_4 = "claude-sonnet-4-20250514"; //TODO: use apiKey if BYOK //Migrations -//TODO: Migrate healthcare n Natural programmming +//TODO: Migrate healthcare //TODO: Evals? // Why? 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 index 5f724f7c5f2..08ce53f6008 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts @@ -1,7 +1,7 @@ import { CoreMessage, generateObject, generateText, streamText } from "ai"; import { anthropic, ANTHROPIC_HAIKU, ANTHROPIC_SONNET_4 } from "../connection"; import { GenerationType, getRelevantLibrariesAndFunctions } from "../libs/libs"; -import { getReadmeQuery, populateHistory, transformProjectSource, getErrorMessage } from "../utils"; +import { getRewrittenPrompt, populateHistory, transformProjectSource, getErrorMessage } from "../utils"; import { getMaximizedSelectedLibs, libraryContains, @@ -43,7 +43,7 @@ export async function generateHealthcareCodeCore( ): Promise { const project: ProjectSource = await getProjectSource(params.operationType); const sourceFiles: SourceFiles[] = transformProjectSource(project); - const prompt = getReadmeQuery(params, sourceFiles); + const prompt = getRewrittenPrompt(params, sourceFiles); const relevantTrimmedFuncs: Library[] = ( await getRelevantLibrariesAndFunctions({ query: prompt }, GenerationType.HEALTHCARE_GENERATION) ).libraries; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts index f9873d14cd0..7a5c2300a31 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts @@ -2,6 +2,7 @@ import { generateObject, CoreMessage } from "ai"; import { GetFunctionResponse, GetFunctionsRequest, GetFunctionsResponse, getFunctionsResponseSchema, MinifiedClient, MinifiedRemoteFunction, MinifiedResourceFunction } from "./funcs_inter_types"; import { Client, GetTypeResponse, Library, RemoteFunction, ResourceFunction } from "./libs_types"; +import { TypeDefinition, AbstractFunction, Type, RecordTypeDefinition } from "./libs_types"; import { anthropic, ANTHROPIC_HAIKU } from "../connection"; import { GenerationType } from "./libs"; import { getRequiredTypesFromLibJson } from "../healthcare/healthcare"; @@ -105,24 +106,27 @@ async function getRequiredFunctions(libraries: string[], prompt: string, librari const largeLibs = libraryList.filter(lib => getClientFunctionCount(lib.clients) >= 100); const smallLibs = libraryList.filter(lib => !largeLibs.includes(lib)); - const suggestedFunctions: Promise[] = []; - - // Process large libraries individually - for (const funcItem of largeLibs) { - suggestedFunctions.push(getSuggestedFunctions(prompt, [funcItem])[0]); - } - - let collectiveResp: GetFunctionResponse[] = []; - - // Process small libraries in bulk - if (smallLibs.length !== 0) { - collectiveResp = await getSuggestedFunctions(prompt, smallLibs); - } - - // Wait for all individual large library processing - const individualResults = await Promise.all(suggestedFunctions); - collectiveResp.push(...individualResults); - + // Create promises for large libraries (each processed individually) + const largeLiberiesPromises: Promise[] = largeLibs.map(funcItem => + getSuggestedFunctions(prompt, [funcItem]) + ); + + // Create promise for small libraries (processed in bulk) + const smallLibrariesPromise = smallLibs.length !== 0 + ? getSuggestedFunctions(prompt, smallLibs) + : Promise.resolve([]); + + // Wait for all promises to complete + const [smallLibResults, ...largeLibResults] = await Promise.all([ + smallLibrariesPromise, + ...largeLiberiesPromises + ]); + + // Flatten the results + const collectiveResp: GetFunctionResponse[] = [ + ...smallLibResults, + ...largeLibResults.flat() + ]; const endTime = Date.now(); console.log(`Time taken to get the functions: ${(endTime - startTime) / 1000} seconds`); @@ -241,7 +245,7 @@ export async function getMaximizedSelectedLibs(libNames:string[], generationType } export function toMaximizedLibrariesFromLibJson(functionResponses: GetFunctionResponse[], originalLibraries: Library[]): Library[] { - const maximizedLibraries: Library[] = []; + const minifiedLibrariesWithoutRecords: Library[] = []; for (const funcResponse of functionResponses) { // Find the original library to get complete information @@ -250,61 +254,27 @@ export function toMaximizedLibrariesFromLibJson(functionResponses: GetFunctionRe continue; } + const filteredClients = selectClients(originalLib.clients, funcResponse); + const filteredFunctions = selectFunctions(originalLib.functions, funcResponse); + const maximizedLib: Library = { name: funcResponse.name, description: originalLib.description, - typeDefs: originalLib.typeDefs, // Include all type definitions - clients: [], - functions: [], + clients: filteredClients, + functions: filteredFunctions, + // Get only the type definitions that are actually used by the selected functions and clients + typeDefs: getOwnTypeDefsForLib(filteredClients, filteredFunctions, originalLib.typeDefs), services: originalLib.services }; - // Convert minified clients back to full clients - if (funcResponse.clients) { - for (const minClient of funcResponse.clients) { - const originalClient = originalLib.clients.find(c => c.name === minClient.name); - if (originalClient) { - const maximizedClient: Client = { - name: minClient.name, - description: originalClient.description, - functions: [] - }; - - // Convert minified functions back to full functions - for (const minFunc of minClient.functions) { - const originalFunc = originalClient.functions.find(f => { - if ('accessor' in minFunc && 'accessor' in f) { - return f.accessor === minFunc.accessor; - } else if ('name' in minFunc && 'name' in f) { - return f.name === minFunc.name; - } - return false; - }); - - if (originalFunc) { - maximizedClient.functions.push(originalFunc); - } - } - - maximizedLib.clients.push(maximizedClient); - } - } - } - - // Convert minified standalone functions back to full functions - if (funcResponse.functions && originalLib.functions) { - for (const minFunc of funcResponse.functions) { - const originalFunc = originalLib.functions.find(f => f.name === minFunc.name); - if (originalFunc) { - maximizedLib.functions!.push(originalFunc); - } - } - } - - maximizedLibraries.push(maximizedLib); + minifiedLibrariesWithoutRecords.push(maximizedLib); } - return maximizedLibraries; + // Handle external type references + const externalRecordsRefs = getExternalTypeDefsRefs(minifiedLibrariesWithoutRecords); + getExternalRecords(minifiedLibrariesWithoutRecords, externalRecordsRefs, originalLibraries); + + return minifiedLibrariesWithoutRecords; } function mergeLibrariesWithoutDuplicates(maximizedLibraries: Library[], typeLibraries: Library[]): Library[] { @@ -325,3 +295,323 @@ function mergeLibrariesWithoutDuplicates(maximizedLibraries: Library[], typeLibr function findLibraryByName(name: string, libraries: Library[]): Library | null { return libraries.find(lib => lib.name === name) || null; } + +// Helper functions for type definition handling + +function selectClients(originalClients: Client[], funcResponse: GetFunctionResponse): Client[] { + if (!funcResponse.clients) { + return []; + } + + const newClients: Client[] = []; + + for (const minClient of funcResponse.clients) { + const originalClient = originalClients.find(c => c.name === minClient.name); + if (!originalClient) { + continue; + } + + const completeClient: Client = { + name: originalClient.name, + description: originalClient.description, + functions: [] + }; + + const output: (RemoteFunction | ResourceFunction)[] = []; + + // Add constructor if there are functions to add + if (minClient.functions.length > 0) { + const constructor = getConstructor(originalClient.functions); + if (constructor) { + output.push(constructor); + } + } + + // Add selected functions + for (const minFunc of minClient.functions) { + const completeFunc = getCompleteFuncForMiniFunc(minFunc, originalClient.functions); + if (completeFunc) { + output.push(completeFunc); + } + } + + completeClient.functions = output; + newClients.push(completeClient); + } + + return newClients; +} + +function selectFunctions(originalFunctions: RemoteFunction[] | undefined, funcResponse: GetFunctionResponse): RemoteFunction[] | undefined { + if (!funcResponse.functions || !originalFunctions) { + return undefined; + } + + const output: RemoteFunction[] = []; + + for (const minFunc of funcResponse.functions) { + const originalFunc = originalFunctions.find(f => f.name === minFunc.name); + if (originalFunc) { + output.push(originalFunc); + } + } + + return output.length > 0 ? output : undefined; +} + +function getConstructor(functions: (RemoteFunction | ResourceFunction)[]): RemoteFunction | null { + for (const func of functions) { + if ('type' in func && func.type === "Constructor") { + return func as RemoteFunction; + } + } + return null; +} + +function getCompleteFuncForMiniFunc( + minFunc: MinifiedRemoteFunction | MinifiedResourceFunction, + fullFunctions: (RemoteFunction | ResourceFunction)[] +): (RemoteFunction | ResourceFunction) | null { + if ('name' in minFunc) { + // MinifiedRemoteFunction + return fullFunctions.find(f => 'name' in f && f.name === minFunc.name) || null; + } else { + // MinifiedResourceFunction + return fullFunctions.find(f => + 'accessor' in f && + f.accessor === minFunc.accessor && + JSON.stringify(f.paths) === JSON.stringify(minFunc.paths) + ) || null; + } +} + +function getOwnTypeDefsForLib( + clients: Client[], + functions: RemoteFunction[] | undefined, + allTypeDefs: TypeDefinition[] +): TypeDefinition[] { + const allFunctions: AbstractFunction[] = []; + + // Collect all functions from clients + for (const client of clients) { + allFunctions.push(...client.functions); + } + + // Add standalone functions + if (functions) { + allFunctions.push(...functions); + } + + return getOwnRecordRefs(allFunctions, allTypeDefs); +} + +function getOwnRecordRefs(functions: AbstractFunction[], allTypeDefs: TypeDefinition[]): TypeDefinition[] { + const ownRecords = new Map(); + + // Process all functions to find type references + for (const func of functions) { + // Check parameter types + for (const param of func.parameters) { + addInternalRecord(param.type, ownRecords, allTypeDefs); + } + + // Check return type + addInternalRecord(func.return.type, ownRecords, allTypeDefs); + } + + // Recursively process found type definitions to include dependent types + const processedTypes = new Set(); + const typesToProcess = Array.from(ownRecords.values()); + + while (typesToProcess.length > 0) { + const typeDef = typesToProcess.shift()!; + + if (processedTypes.has(typeDef.name)) { + continue; + } + + processedTypes.add(typeDef.name); + + if (typeDef.type === 'record') { + const recordDef = typeDef as RecordTypeDefinition; + for (const field of recordDef.fields) { + const foundTypes = addInternalRecord(field.type, ownRecords, allTypeDefs); + typesToProcess.push(...foundTypes); + } + } + // TODO: Handle EnumTypeDefinition and UnionTypeDefinition + } + + return Array.from(ownRecords.values()); +} + +function addInternalRecord( + paramType: Type, + ownRecords: Map, + allTypeDefs: TypeDefinition[] +): TypeDefinition[] { + const foundTypes: TypeDefinition[] = []; + + if (!paramType.links) { + return foundTypes; + } + + for (const link of paramType.links) { + if (link.category === "internal") { + if (isIgnoredRecordName(link.recordName)) { + continue; + } + + const typeDefResult = getTypeDefByName(link.recordName, allTypeDefs); + if (typeDefResult) { + ownRecords.set(link.recordName, typeDefResult); + foundTypes.push(typeDefResult); + } else { + console.warn(`Type ${link.recordName} definition not found.`); + } + } + } + + return foundTypes; +} + +function isIgnoredRecordName(recordName: string): boolean { + const ignoredRecords = [ + "CodeScanningAnalysisToolGuid", + "AlertDismissedAt", + "AlertFixedAt", + "AlertAutoDismissedAt", + "NullableAlertUpdatedAt", + "ActionsCanApprovePullRequestReviews", + "CodeScanningAlertDismissedComment", + "ActionsEnabled", + "PreventSelfReview", + "SecretScanningAlertResolutionComment", + "Conference_enum_update_status", + "Message_enum_schedule_type", + "Message_enum_update_status", + "Siprec_enum_update_status", + "Stream_enum_update_status" + ]; + return ignoredRecords.includes(recordName); +} + +function getTypeDefByName(name: string, typeDefs: TypeDefinition[]): TypeDefinition | null { + return typeDefs.find(def => def.name === name) || null; +} + +function getExternalTypeDefsRefs(libraries: Library[]): Map { + const externalRecords = new Map(); + + for (const lib of libraries) { + const allFunctions: AbstractFunction[] = []; + + // Collect all functions from clients + for (const client of lib.clients) { + allFunctions.push(...client.functions); + } + + // Add standalone functions + if (lib.functions) { + allFunctions.push(...lib.functions); + } + + getExternalTypeDefRefs(externalRecords, allFunctions, lib.typeDefs); + } + + return externalRecords; +} + +function getExternalTypeDefRefs( + externalRecords: Map, + functions: AbstractFunction[], + allTypeDefs: TypeDefinition[] +): void { + // Check function parameters and return types + for (const func of functions) { + for (const param of func.parameters) { + addExternalRecord(param.type, externalRecords); + } + addExternalRecord(func.return.type, externalRecords); + } + + // Check type definition fields + for (const typeDef of allTypeDefs) { + if (typeDef.type === 'record') { + const recordDef = typeDef as RecordTypeDefinition; + for (const field of recordDef.fields) { + addExternalRecord(field.type, externalRecords); + } + } + // TODO: Handle EnumTypeDefinition and UnionTypeDefinition + } +} + +function addExternalRecord(paramType: Type, externalRecords: Map): void { + if (!paramType.links) { + return; + } + + for (const link of paramType.links) { + if (link.category === "external" && link.libraryName) { + addLibraryRecords(externalRecords, link.libraryName, link.recordName); + } + } +} + +function addLibraryRecords(externalRecords: Map, libraryName: string, recordName: string): void { + if (externalRecords.has(libraryName)) { + const records = externalRecords.get(libraryName)!; + if (!records.includes(recordName)) { + records.push(recordName); + } + } else { + externalRecords.set(libraryName, [recordName]); + } +} + +function getExternalRecords( + newLibraries: Library[], + libRefs: Map, + originalLibraries: Library[] +): void { + for (const [libName, recordNames] of libRefs.entries()) { + if (libName.startsWith("ballerina/lang.int")) { + // TODO: find a proper solution + continue; + } + + const library = originalLibraries.find(lib => lib.name === libName); + if (!library) { + console.warn(`Library ${libName} is not found in the context. Skipping the library.`); + continue; + } + + for (const recordName of recordNames) { + const typeDef = getTypeDefByName(recordName, library.typeDefs); + if (!typeDef) { + console.warn(`Record ${recordName} is not found in the context. Skipping the record.`); + continue; + } + + let newLibrary = newLibraries.find(lib => lib.name === libName); + if (!newLibrary) { + newLibrary = { + name: libName, + description: library.description, + clients: [], + functions: undefined, + typeDefs: [typeDef], + services: library.services + }; + newLibraries.push(newLibrary); + } else { + // Check if type definition already exists + const existingTypeDef = newLibrary.typeDefs.find(def => def.name === recordName); + if (!existingTypeDef) { + newLibrary.typeDefs.push(typeDef); + } + } + } + } +} 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 index e8da118d53f..2695c956b3c 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts @@ -1,6 +1,10 @@ import { generateObject, CoreMessage } from "ai"; import { z } from "zod"; -import { MinifiedLibrary, RelevantLibrariesAndFunctionsRequest, RelevantLibrariesAndFunctionsResponse } from "@wso2/ballerina-core"; +import { + MinifiedLibrary, + RelevantLibrariesAndFunctionsRequest, + RelevantLibrariesAndFunctionsResponse, +} from "@wso2/ballerina-core"; import { Library } from "./libs_types"; import { selectRequiredFunctions } from "./funcs"; import { anthropic, ANTHROPIC_HAIKU } from "../connection"; @@ -13,7 +17,7 @@ interface LibraryListResponse { } const LibraryListSchema = z.object({ - libraries: z.array(z.string()) + libraries: z.array(z.string()), }); // export async function getRelevantLibs(params: GenerateCodeParams): Promise { @@ -27,31 +31,47 @@ export enum GenerationType { HEALTHCARE_GENERATION = "HEALTHCARE_GENERATION", } -export async function getRelevantLibrariesAndFunctions(params: RelevantLibrariesAndFunctionsRequest, generationType: GenerationType): Promise { +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 + libraries: relevantTrimmedFuncs, }; } export async function getSelectedLibraries(prompt: string, generationType: GenerationType): Promise { const allLibraries = await getAllLibraries(generationType); if (allLibraries.length === 0) { - return []; + return []; } const messages: CoreMessage[] = [ - { role: "system", content: getSystemPrompt() }, - { role: "user", content: getUserPrompt(prompt, allLibraries, generationType) }, + { + role: "system", + content: getSystemPrompt(), + providerOptions: { + anthropic: { cacheControl: { type: "ephemeral" } }, + }, + }, + { + role: "user", + content: getUserPrompt(prompt, allLibraries, generationType), + providerOptions: { + anthropic: { cacheControl: { type: "ephemeral" } }, + }, + }, ]; //TODO: Add thinking and test with claude haiku + //TODO: Check if we need to restrcuture prompt to optimize catching. const { object } = await generateObject({ model: anthropic(ANTHROPIC_HAIKU), maxTokens: 4096, temperature: 0, messages: messages, schema: LibraryListSchema, - abortSignal: AIPanelAbortController.getInstance().signal + abortSignal: AIPanelAbortController.getInstance().signal, }); console.log("Selected libraries:", object.libraries); @@ -97,12 +117,16 @@ 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.r4.international401`, `ballerinax/health.hl7v2commons` and `ballerinax/health.hl7v2` libraries in the selection in addition to what you selected."}`; +${ + generationType === GenerationType.CODE_GENERATION + ? "" + : " ALWAYS include `ballerinax/health.base`, `ballerinax/health.fhir.r4`, `ballerinax/health.fhir.r4.parser`, `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[] }; + 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/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts index fc91323f407..04a941849fd 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts @@ -4,6 +4,8 @@ import { ChatNotify, ChatStart, DiagnosticEntry, + GENERATE_CODE_AGAINST_THE_REQUIREMENT, + GENERATE_TEST_AGAINST_THE_REQUIREMENT, GenerateCodeRequest, IntermidaryState, onChatNotify, @@ -16,6 +18,7 @@ import { MessageRole } from "./types"; import { RPCLayer } from "../../../../src/RPCLayer"; import { AiPanelWebview } from "../../../views/ai-panel/webview"; import { GenerationType } from "./libs/libs"; +import { REQUIREMENTS_DOCUMENT_KEY } from "./code/np_prompts"; export function populateHistory(chatHistory: ChatEntry[]): CoreMessage[] { if (!chatHistory || chatHistory.length === 0) { @@ -63,9 +66,32 @@ export function transformProjectSource(project: ProjectSource): SourceFiles[] { return sourceFiles; } +export function extractResourceDocumentContent(sourceFiles: readonly SourceFiles[]): string { + const requirementFiles = sourceFiles + .filter(sourceFile => sourceFile.filePath.toLowerCase().endsWith(REQUIREMENTS_DOCUMENT_KEY)) + .slice(0, 1) + .map(sourceFile => sourceFile.content); + + if (requirementFiles.length === 0) { + return ""; + } + return requirementFiles[0]; +} + //TODO: This should be a query rewriter ideally. -export function getReadmeQuery(params: GenerateCodeRequest, sourceFiles: SourceFiles[]) { +export function getRewrittenPrompt(params: GenerateCodeRequest, sourceFiles: SourceFiles[]) { const prompt = params.usecase; + if (prompt.trim() === GENERATE_CODE_AGAINST_THE_REQUIREMENT) { + const resourceContent = extractResourceDocumentContent(sourceFiles); + return `${GENERATE_CODE_AGAINST_THE_REQUIREMENT}: +${resourceContent}`; + } + if (prompt.trim() === GENERATE_TEST_AGAINST_THE_REQUIREMENT) { + const resourceContent = extractResourceDocumentContent(sourceFiles); + return `${GENERATE_TEST_AGAINST_THE_REQUIREMENT}: +${resourceContent}`; + } + if (!prompt.toLowerCase().includes("readme")) { return prompt; } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx index a40f8e1f8d9..157caa246da 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx @@ -39,6 +39,8 @@ import { SourceFiles, ChatEntry, OperationType, + GENERATE_TEST_AGAINST_THE_REQUIREMENT, + GENERATE_CODE_AGAINST_THE_REQUIREMENT, } from "@wso2/ballerina-core"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; @@ -133,8 +135,6 @@ const DRIFT_CHECK_ERROR = "Failed to check drift between the code and the docume const RATE_LIMIT_ERROR = ` Cause: Your usage limit has been exceeded. This should reset in the beggining of the next month.`; const UPDATE_CHAT_SUMMARY_FAILED = `Failed to update the chat summary.`; -const GENERATE_TEST_AGAINST_THE_REQUIREMENT = "Generate tests against the requirements"; -const GENERATE_CODE_AGAINST_THE_REQUIREMENT = "Generate code based on the requirements"; const CHECK_DRIFT_BETWEEN_CODE_AND_DOCUMENTATION = "Check drift between code and documentation"; const GENERATE_CODE_AGAINST_THE_PROVIDED_REQUIREMENTS = "Generate code based on the following requirements: "; const GENERATE_CODE_AGAINST_THE_PROVIDED_REQUIREMENTS_TRIMMED = GENERATE_CODE_AGAINST_THE_PROVIDED_REQUIREMENTS.trim(); @@ -165,6 +165,7 @@ const AIChat: React.FC = () => { const aiChatInputRef = useRef(null); const messagesRef = useRef([]); + const isErrorChunkReceivedRef = useRef(false); const messagesEndRef = React.createRef(); @@ -322,6 +323,7 @@ const AIChat: React.FC = () => { }); setIsCodeLoading(false); setIsLoading(false); + isErrorChunkReceivedRef.current = true; } }); @@ -443,6 +445,7 @@ const AIChat: React.FC = () => { setMessages((prevMessages) => prevMessages.filter((message, index) => message.type !== "label")); setMessages((prevMessages) => prevMessages.filter((message, index) => message.type !== "question")); setIsLoading(true); + isErrorChunkReceivedRef.current = false; setMessages((prevMessages) => prevMessages.filter((message, index) => index <= lastQuestionIndex || message.type !== "question") ); @@ -1708,6 +1711,7 @@ const AIChat: React.FC = () => { isPromptExecutedInCurrentWindow={ isPromptExecutedInCurrentWindow } + isErrorChunkReceived={isErrorChunkReceivedRef.current} /> ); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/CodeSection.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/CodeSection.tsx index cd2c1a4fb92..649fbb03a20 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/CodeSection.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/CodeSection.tsx @@ -45,6 +45,7 @@ interface CodeSectionProps { diagnostics: any[]; onRetryRepair: () => void; isPromptExecutedInCurrentWindow: boolean; + isErrorChunkReceived: boolean; } const EntryContainer = styled.div<{ hasErrors: boolean; isOpen: boolean; isHovered: boolean }>( @@ -80,6 +81,7 @@ export const CodeSection: React.FC = ({ diagnostics = [], onRetryRepair = () => {}, isPromptExecutedInCurrentWindow, + isErrorChunkReceived }) => { const [isOpen, setIsOpen] = useState(false); const [isCodeAdded, setIsCodeAdded] = useState(false); @@ -153,7 +155,7 @@ export const CodeSection: React.FC = ({ ? "Code was generated for different session, please regenerate again" : "" } - disabled={!buttonsActive || isSyntaxError || !isPromptExecutedInCurrentWindow} + disabled={!buttonsActive || isSyntaxError || !isPromptExecutedInCurrentWindow || isErrorChunkReceived} >   Add to Integration From baf0ddf531880221ba99d2692837cb9781746fe5 Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Thu, 17 Jul 2025 16:50:01 +0530 Subject: [PATCH 026/349] Update code gen prompt based on latest changes --- .../src/features/ai/service/code/code.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index d017b171c23..4697aa39752 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -36,7 +36,6 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler ).libraries; const historyMessages = populateHistory(params.chatHistory); - //TODO: Remove Readme.md from NP Path const allMessages: CoreMessage[] = [ { role: "system", @@ -176,7 +175,7 @@ If the query requires code, Follow these steps to generate the Ballerina code: - 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.error, lang.float, lang.decimal, lang.int, lang.map langlibs as they are already imported by default). + - 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. @@ -216,21 +215,21 @@ Important reminders: - 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 you are accessing fields of a record, always assign it into new variables. +- 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. - Always use named arguments when providing values to any parameter. (eg: .get(key="value")) -_ Do not use var keyword (variable declarations, for loops ...). Use explicit types insteads. +- 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. - For GraphQL service related queries, If the user haven't specified their own GraphQL Scehma, Write the proposed GraphQL schema for the user query right after explanation before generating the ballerina code. Use same names as the GraphQL Schema when defining record types. -Begin your response with an explanation, then end the response with the codeblock segments(if any). +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. Do not provide any explanation after codeblocks. - -If the user hasn't provided the information, request the missing information concisely. +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 segment: From b29c7c4f27b81d21783f8c22102476479a3641cd Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Thu, 17 Jul 2025 16:52:37 +0530 Subject: [PATCH 027/349] Improve deleting MCP tool values --- .../ballerina-core/src/interfaces/bi.ts | 1 + .../src/rpc-types/ai-agent/index.ts | 3 +- .../src/rpc-types/ai-agent/interfaces.ts | 6 + .../src/rpc-types/ai-agent/rpc-type.ts | 7 +- .../src/rpc-managers/ai-agent/rpc-handler.ts | 11 +- .../src/rpc-managers/ai-agent/rpc-manager.ts | 131 +++++++++++++++++- .../src/rpc-clients/ai-agent/rpc-client.ts | 20 ++- 7 files changed, 160 insertions(+), 19 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts index 864ed51839c..58e108496bd 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts @@ -155,6 +155,7 @@ export type CodeData = { node?: NodeKind; org?: string; module?: string; + packageName?: string; object?: string; symbol?: string; lineRange?: ELineRange; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts index d48b8e7bfc3..a8539778103 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts @@ -17,7 +17,7 @@ */ import { AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest, McpToolsRequest, McpToolsResponse } from "../../interfaces/extended-lang-client"; -import { AIAgentRequest, AIAgentResponse, AIAgentToolsUpdateRequest } from "./interfaces"; +import { AIAgentRequest, AIAgentResponse, AIAgentToolsUpdateRequest, McpToolUpdateRequest } from "./interfaces"; export interface AIAgentAPI { getAllAgents: (params: AINodesRequest) => Promise; @@ -29,4 +29,5 @@ export interface AIAgentAPI { genTool: (params: AIGentToolsRequest) => Promise; createAIAgent: (params: AIAgentRequest) => Promise; updateAIAgentTools: (params: AIAgentToolsUpdateRequest) => Promise; + updateMCPToolKit: (params: McpToolUpdateRequest) => Promise; } 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 4ac529bea5d..f9f665f01c5 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 @@ -66,3 +66,9 @@ export interface AIAgentResponse { position: NodePosition; } +export interface McpToolUpdateRequest { + agentFlowNode: FlowNode; + serviceUrl: string; + serverName: string; + selectedTools: string[]; +} diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts index 3f926ad0e9f..992199e03c7 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts @@ -14,10 +14,12 @@ * 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 { AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest, McpToolsRequest, McpToolsResponse } from "../../interfaces/extended-lang-client"; -import { AIAgentRequest, AIAgentResponse, AIAgentToolsUpdateRequest } from "./interfaces"; -import { RequestType } from "vscode-messenger-common"; +import { AIAgentRequest, AIAgentResponse, AIAgentToolsUpdateRequest, McpToolUpdateRequest } from "./interfaces"; +import { RequestType, NotificationType } from "vscode-messenger-common"; const _preFix = "ai-agent"; export const getAllAgents: RequestType = { method: `${_preFix}/getAllAgents` }; @@ -29,3 +31,4 @@ export const getMcpTools: RequestType = { met export const genTool: RequestType = { method: `${_preFix}/genTool` }; export const createAIAgent: RequestType = { method: `${_preFix}/createAIAgent` }; export const updateAIAgentTools: RequestType = { method: `${_preFix}/updateAIAgentTools` }; +export const updateMCPToolKit: NotificationType = { method: `${_preFix}/updateMCPToolKit` }; diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts index 86cb04d635f..d42f55824a3 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts @@ -14,6 +14,8 @@ * 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 { AIAgentRequest, @@ -22,17 +24,19 @@ import { AIModelsRequest, AINodesRequest, AIToolsRequest, - MemoryManagersRequest, createAIAgent, genTool, getAllAgents, getAllMemoryManagers, getAllModels, + getMcpTools, getModels, getTools, - getMcpTools, + McpToolsRequest, + McpToolUpdateRequest, + MemoryManagersRequest, updateAIAgentTools, - McpToolsRequest + updateMCPToolKit } from "@wso2/ballerina-core"; import { Messenger } from "vscode-messenger"; import { AiAgentRpcManager } from "./rpc-manager"; @@ -48,4 +52,5 @@ export function registerAiAgentRpcHandlers(messenger: Messenger) { messenger.onRequest(genTool, (args: AIGentToolsRequest) => rpcManger.genTool(args)); messenger.onRequest(createAIAgent, (args: AIAgentRequest) => rpcManger.createAIAgent(args)); messenger.onRequest(updateAIAgentTools, (args: AIAgentToolsUpdateRequest) => rpcManger.updateAIAgentTools(args)); + messenger.onNotification(updateMCPToolKit, (args: McpToolUpdateRequest) => rpcManger.updateMCPToolKit(args)); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts index dcc0f888807..e4771636508 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts @@ -31,17 +31,13 @@ import { AgentTool, AgentToolRequest, FlowNode, + McpToolUpdateRequest, McpToolsRequest, McpToolsResponse, MemoryManagersRequest, MemoryManagersResponse, - NodePosition, - STModification, - SyntaxTree, - TextEdit + NodePosition } from "@wso2/ballerina-core"; -import { writeFileSync } from "fs"; -import { Uri } from "vscode"; import { URI, Utils } from "vscode-uri"; import { StateMachine } from "../../stateMachine"; import { updateSourceCode } from "../../utils/source-utils"; @@ -393,5 +389,126 @@ export class AiAgentRpcManager implements AIAgentAPI { console.error(`Failed to create tool: ${error}`); } } -} + async updateMCPToolKit(params: McpToolUpdateRequest): Promise { + const projectUri = StateMachine.context().projectUri; + const filePath = Utils.joinPath(URI.file(projectUri), "agents.bal").fsPath; + + // Generate the variable name from the server name + const variableName = this.toCamelCase(params.serverName); + + // 1. Create the MCP ToolKit variable declaration + const nodeTemplate = await StateMachine.langClient().getNodeTemplate({ + position: params.agentFlowNode.codedata.lineRange.endLine, + filePath: filePath, + id: { + node: "CLASS_INIT", + org: "ballerinax", + module: "ai", + packageName: "ai", + version: "1.2.1", + symbol: "init", + object: "McpToolKit" + } + }); + + nodeTemplate.flowNode.properties["serverUrl"].value = params.serviceUrl; + nodeTemplate.flowNode.properties["info"].value = + '{' + + 'name: "' + params.serverName.replace(/"/g, '\\"') + '",' + + 'version: "1.0.0"' + + '}'; + if (Array.isArray(params.selectedTools) && params.selectedTools.length === 0) { + nodeTemplate.flowNode.properties["permittedTools"].value = "()"; + } else { + nodeTemplate.flowNode.properties["permittedTools"].value = + "[" + params.selectedTools.map((s: string) => `"${s}"`).join(", ") + "]"; + } + nodeTemplate.flowNode.codedata.lineRange = { + fileName: filePath, + startLine: params.agentFlowNode.codedata.lineRange.startLine, + endLine: params.agentFlowNode.codedata.lineRange.endLine + }; + nodeTemplate.flowNode.properties["variable"].value = variableName; + + const mcpToolKitEdits = await StateMachine.langClient().getSourceCode({ + filePath: filePath, + flowNode: nodeTemplate.flowNode, + }); + + // 2. Update the agent's tools array to include the variable name (following updateAIAgentTools pattern) + const agentFlowNode = params.agentFlowNode; + let toolsValue = agentFlowNode.properties["tools"].value; + + // Parse existing tools and add the variable name + if (typeof toolsValue === "string") { + const toolsArray = this.parseToolsString(toolsValue); + if (toolsArray.length > 0) { + // Add the variable name if not exists + if (!toolsArray.includes(variableName)) { + toolsArray.push(variableName); + } + // Update the tools value + toolsValue = toolsArray.length === 1 ? `[${toolsArray[0]}]` : `[${toolsArray.join(", ")}]`; + } else { + toolsValue = `[${variableName}]`; + } + } + + // Set the updated tools value + agentFlowNode.properties["tools"].value = toolsValue; + + // Generate source code for the updated agent + const agentEdits = await StateMachine.langClient().getSourceCode({ + filePath: filePath, + flowNode: agentFlowNode + }); + + // 3. Filter and combine both edits + const mcpEdits: { [filePath: string]: any[] } = {}; + for (const key in mcpToolKitEdits.textEdits) { + const filtered = mcpToolKitEdits.textEdits[key] + .filter(edit => !edit.newText.includes("import")) + .map(edit => ({ + ...edit + })); + + if (filtered.length > 0) { + mcpEdits[key] = filtered; + } + } + + // Apply both edits + await updateSourceCode({ textEdits: mcpEdits }); + await updateSourceCode({ textEdits: agentEdits.textEdits }); + } + + private parseToolsString(toolsStr: string): string[] { + // Remove brackets and split by comma + const trimmed = toolsStr.trim(); + if (!trimmed.startsWith("[") || !trimmed.endsWith("]")) { + return []; + } + const inner = trimmed.substring(1, trimmed.length - 1); + // Handle empty array case + if (!inner.trim()) { + return []; + } + // Split by comma and trim each element + return inner.split(",").map((tool) => tool.trim()); + } + + private toCamelCase(str: string): string { + const words = str + .replace(/[^a-zA-Z0-9]+/g, ' ') + .trim() + .split(/\s+/); + return words + .map((word, index) => + index === 0 + ? word.toLowerCase() + : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() + ) + .join(''); + } +} diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts index 9904f5a7407..7e4a697e651 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts @@ -14,6 +14,8 @@ * 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 { AIAgentAPI, @@ -28,19 +30,21 @@ import { AINodesResponse, AIToolsRequest, AIToolsResponse, - McpToolsRequest, - McpToolsResponse, - MemoryManagersRequest, - MemoryManagersResponse, createAIAgent, genTool, getAllAgents, getAllMemoryManagers, getAllModels, + getMcpTools, getModels, getTools, - getMcpTools, - updateAIAgentTools + McpToolsRequest, + McpToolsResponse, + McpToolUpdateRequest, + MemoryManagersRequest, + MemoryManagersResponse, + updateAIAgentTools, + updateMCPToolKit } from "@wso2/ballerina-core"; import { HOST_EXTENSION } from "vscode-messenger-common"; import { Messenger } from "vscode-messenger-webview"; @@ -87,4 +91,8 @@ export class AiAgentRpcClient implements AIAgentAPI { updateAIAgentTools(params: AIAgentToolsUpdateRequest): Promise { return this._messenger.sendRequest(updateAIAgentTools, HOST_EXTENSION, params); } + + updateMCPToolKit(params: McpToolUpdateRequest): Promise { + return this._messenger.sendRequest(updateMCPToolKit, HOST_EXTENSION, params); + } } From 5e8271e398fef9f1243942268f973024a96ec8f0 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Thu, 17 Jul 2025 17:24:01 +0530 Subject: [PATCH 028/349] Apply review suggestions --- .../src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx b/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx index cdc9b23256d..625182715ff 100644 --- a/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx @@ -365,7 +365,7 @@ export function AgentCallNodeWidget(props: AgentCallNodeWidgetProps) { const onToolClick = (tool: ToolData) => { console.log(">>> on Tool Click", tool); const toolType = tool.type ?? ""; - if (toolType.includes("MCP Server")) { + if (toolType === "MCP Server") { agentNode?.onSelectMcpToolkit && agentNode.onSelectMcpToolkit(tool, model.node); setAnchorEl(null); } else { From 2c94f98391377d5a9d342b5d41e823448afe5766 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Thu, 17 Jul 2025 17:24:31 +0530 Subject: [PATCH 029/349] Fix handling auto completions in mcp name field --- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index af6a2c763f0..56661389d88 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -232,7 +232,8 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { const [configs, setConfigs] = useState({}); const [toolSelection, setToolSelection] = useState("All"); const [name, setName] = useState(props.name || ""); - + const [hasUserTyped, setHasUserTyped] = useState(false); + // New state for MCP server tools const [mcpTools, setMcpTools] = useState([]); const [selectedMcpTools, setSelectedMcpTools] = useState>(new Set()); @@ -459,6 +460,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { const handleNameChange = (e: React.ChangeEvent) => { const newName = e.target.value; setName(newName); + setHasUserTyped(true); const errorMessage = validateName(newName); if (errorMessage == '') { setErrorInputs(false); @@ -698,18 +700,6 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { /> - - setConfigs(e.target.value)} - placeholder="Enter server configurations (optional)" - value={""} - /> - - 1 ? `MCP Server 0${mcpToolkitCount}` : "MCP Server"} + value={hasUserTyped ? name : (mcpToolkitCount > 1 ? `MCP Server 0${mcpToolkitCount}` : "MCP Server")} /> From 9035924e7289969e3dc99985f95eea3b09f2ee88 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Wed, 16 Jul 2025 13:06:08 +0530 Subject: [PATCH 030/349] Add AI Agent organization request and response interfaces, and implement related RPC methods --- .../src/interfaces/extended-lang-client.ts | 11 ++++++++ .../src/rpc-types/ai-agent/index.ts | 3 ++- .../src/rpc-types/ai-agent/rpc-type.ts | 5 +++- .../src/core/extended-language-client.ts | 7 +++++ .../src/rpc-managers/ai-agent/rpc-handler.ts | 7 ++++- .../src/rpc-managers/ai-agent/rpc-manager.ts | 26 +++++++++++++------ .../src/utils/project-artifacts.ts | 6 ++++- .../src/rpc-clients/ai-agent/rpc-client.ts | 13 ++++++++-- 8 files changed, 64 insertions(+), 14 deletions(-) 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 b256f75286f..e19b55a6a9f 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -1412,8 +1412,17 @@ export interface FunctionNodeResponse { // <-------- AI Agent Related -------> +export interface AIAgentOrgRequest { + projectPath: string; +} + +export interface AIAgentOrgResponse { + orgName: string; +} + export interface AINodesRequest { filePath: string; + orgName: string; } export interface AINodesResponse { agents?: CodeData[]; @@ -1421,6 +1430,7 @@ export interface AINodesResponse { } export interface MemoryManagersRequest { filePath: string; + orgName: string; } export interface MemoryManagersResponse { memoryManagers?: CodeData[]; @@ -1433,6 +1443,7 @@ export interface AIModelsResponse { export interface AIModelsRequest { agent: any; filePath?: string; + orgName: string; } export interface AIToolsRequest { diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts index bb09f5317b5..128c39719a1 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts @@ -16,10 +16,11 @@ * under the License. */ -import { AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest } from "../../interfaces/extended-lang-client"; +import { AIAgentOrgRequest, AIAgentOrgResponse, AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest } from "../../interfaces/extended-lang-client"; import { AIAgentRequest, AIAgentResponse, AIAgentToolsUpdateRequest } from "./interfaces"; export interface AIAgentAPI { + getAgentOrg: (params: AIAgentOrgRequest) => Promise; getAllAgents: (params: AINodesRequest) => Promise; getAllModels: (params: AIModelsRequest) => Promise; getAllMemoryManagers: (params: MemoryManagersRequest) => Promise; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts index 23ff01bc74d..7433c2aeb5a 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts @@ -14,12 +14,15 @@ * 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 { AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest } from "../../interfaces/extended-lang-client"; +import { AIAgentOrgRequest, AIAgentOrgResponse, AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest } from "../../interfaces/extended-lang-client"; import { AIAgentRequest, AIAgentResponse, AIAgentToolsUpdateRequest } from "./interfaces"; import { RequestType } from "vscode-messenger-common"; const _preFix = "ai-agent"; +export const getAgentOrg: RequestType = { method: `${_preFix}/getAgentOrg` }; export const getAllAgents: RequestType = { method: `${_preFix}/getAllAgents` }; export const getAllModels: RequestType = { method: `${_preFix}/getAllModels` }; export const getAllMemoryManagers: RequestType = { method: `${_preFix}/getAllMemoryManagers` }; 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 bf8e7b29408..67dfe0277a9 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts @@ -182,6 +182,8 @@ import { FunctionModelRequest, FunctionModelResponse, TypeDataWithReferences, + AIAgentOrgRequest, + AIAgentOrgResponse, AINodesResponse, AIModelsRequest, AIToolsRequest, @@ -362,6 +364,7 @@ enum EXTENDED_APIS { BI_ADD_TEST_FUNCTION = 'testManagerService/addTestFunction', BI_UPDATE_TEST_FUNCTION = 'testManagerService/updateTestFunction', BI_EDIT_FUNCTION_NODE = 'flowDesignService/functionDefinition', + BI_AI_AGENT_ORG = 'agentManager/getAgentOrg', BI_AI_ALL_AGENTS = 'agentManager/getAllAgents', BI_AI_ALL_MODELS = 'agentManager/getAllModels', BI_AI_ALL_MEMORY_MANAGERS = 'agentManager/getAllMemoryManagers', @@ -1095,6 +1098,10 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest(EXTENDED_APIS.BI_ADD_FUNCTION, params); } + async getAgentOrg(params: AIAgentOrgRequest) : Promise { + return this.sendRequest(EXTENDED_APIS.BI_AI_AGENT_ORG, params); + } + async getAllAgents(params: AINodesRequest): Promise { return this.sendRequest(EXTENDED_APIS.BI_AI_ALL_AGENTS, params); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts index 2642cadf1e6..28e18f155f9 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts @@ -14,22 +14,26 @@ * 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 { + AIAgentOrgRequest, AIAgentRequest, AIAgentToolsUpdateRequest, AIGentToolsRequest, AIModelsRequest, AINodesRequest, AIToolsRequest, - MemoryManagersRequest, createAIAgent, genTool, + getAgentOrg, getAllAgents, getAllMemoryManagers, getAllModels, getModels, getTools, + MemoryManagersRequest, updateAIAgentTools } from "@wso2/ballerina-core"; import { Messenger } from "vscode-messenger"; @@ -37,6 +41,7 @@ import { AiAgentRpcManager } from "./rpc-manager"; export function registerAiAgentRpcHandlers(messenger: Messenger) { const rpcManger = new AiAgentRpcManager(); + messenger.onRequest(getAgentOrg, (args: AIAgentOrgRequest) => rpcManger.getAgentOrg(args)); messenger.onRequest(getAllAgents, (args: AINodesRequest) => rpcManger.getAllAgents(args)); messenger.onRequest(getAllModels, (args: AIModelsRequest) => rpcManger.getAllModels(args)); messenger.onRequest(getAllMemoryManagers, (args: MemoryManagersRequest) => rpcManger.getAllMemoryManagers(args)); diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts index 56778700e80..e29fbb749d1 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts @@ -17,6 +17,8 @@ */ import { AIAgentAPI, + AIAgentOrgRequest, + AIAgentOrgResponse, AIAgentRequest, AIAgentResponse, AIAgentToolsUpdateRequest, @@ -33,13 +35,8 @@ import { FlowNode, MemoryManagersRequest, MemoryManagersResponse, - NodePosition, - STModification, - SyntaxTree, - TextEdit + NodePosition } from "@wso2/ballerina-core"; -import { writeFileSync } from "fs"; -import { Uri } from "vscode"; import { URI, Utils } from "vscode-uri"; import { StateMachine } from "../../stateMachine"; import { updateSourceCode } from "../../utils/source-utils"; @@ -145,13 +142,14 @@ export class AiAgentRpcManager implements AIAgentAPI { } // Create the model Second - const allAgents = (await StateMachine.langClient().getAllAgents({ filePath })); + const agentOrg = await StateMachine.langClient().getAgentOrg({ projectPath: projectUri }); + const allAgents = (await StateMachine.langClient().getAllAgents({ filePath, orgName: agentOrg.orgName})); console.log("All Agents: ", allAgents); const fixedAgentCodeData = allAgents.agents.at(0); if (params.modelState === 1) { - const allModels = await StateMachine.langClient().getAllModels({ agent: fixedAgentCodeData.object, filePath }); + const allModels = await StateMachine.langClient().getAllModels({ agent: fixedAgentCodeData.object, filePath, orgName: agentOrg.orgName }); const modelCodeData = allModels.models.find(val => val.object === params.selectedModel); const modelFlowNode = (await StateMachine.langClient().getNodeTemplate({ filePath, id: modelCodeData, position: { line: 0, offset: 0 } })).flowNode; @@ -379,5 +377,17 @@ export class AiAgentRpcManager implements AIAgentAPI { console.error(`Failed to create tool: ${error}`); } } + + async getAgentOrg(params: AIAgentOrgRequest): Promise { + return new Promise(async (resolve) => { + const context = StateMachine.context(); + try { + const res: AIAgentOrgResponse = await context.langClient.getAgentOrg(params); + resolve(res); + } catch (error) { + console.log(error); + } + }); + } } diff --git a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts index c071b22887a..7a24e6cb3bf 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts @@ -23,6 +23,7 @@ import * as fs from 'fs'; import * as path from 'path'; import { ExtendedLangClient } from "../core/extended-language-client"; import { ServiceDesignerRpcManager } from "../rpc-managers/service-designer/rpc-manager"; +import { AiAgentRpcManager } from "../rpc-managers/ai-agent/rpc-manager"; import { injectAgent, injectAgentCode, injectImportIfMissing } from "./source-utils"; import { tmpdir } from "os"; import { ArtifactsUpdated, ArtifactNotificationHandler } from "./project-artifacts-handler"; @@ -181,8 +182,11 @@ async function getEntryValue(artifact: BaseArtifact, icon: string, moduleName?: // This is a hack to inject the AI agent code into the chat service function // This has to be replaced once we have a proper design for AI Agent Chat Service async function injectAIAgent(serviceArtifact: BaseArtifact) { + // Fetch the organization name for importing the AI package + const agentOrg = await new AiAgentRpcManager().getAgentOrg({ projectPath: StateMachine.context().projectUri }); + // Inject the import if missing - const importStatement = `import ballerinax/ai`; + const importStatement = `import ${agentOrg.orgName}/ai`; await injectImportIfMissing(importStatement, path.join(StateMachine.context().projectUri, `agents.bal`)); //get AgentName diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts index eade77e35ae..598bf62c097 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts @@ -14,9 +14,13 @@ * 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 { AIAgentAPI, + AIAgentOrgRequest, + AIAgentOrgResponse, AIAgentRequest, AIAgentResponse, AIAgentToolsUpdateRequest, @@ -28,15 +32,16 @@ import { AINodesResponse, AIToolsRequest, AIToolsResponse, - MemoryManagersRequest, - MemoryManagersResponse, createAIAgent, genTool, + getAgentOrg, getAllAgents, getAllMemoryManagers, getAllModels, getModels, getTools, + MemoryManagersRequest, + MemoryManagersResponse, updateAIAgentTools } from "@wso2/ballerina-core"; import { HOST_EXTENSION } from "vscode-messenger-common"; @@ -49,6 +54,10 @@ export class AiAgentRpcClient implements AIAgentAPI { this._messenger = messenger; } + getAgentOrg(params: AIAgentOrgRequest): Promise { + return this._messenger.sendRequest(getAgentOrg, HOST_EXTENSION, params); + } + getAllAgents(params: AINodesRequest): Promise { return this._messenger.sendRequest(getAllAgents, HOST_EXTENSION, params); } From 01a7134cf0d5db957a7533ee84fd5fc3704c894b Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Wed, 16 Jul 2025 15:27:22 +0530 Subject: [PATCH 031/349] Add agent organization retrieval functionality and update agent calls in NewAgent.tsx --- .../src/views/BI/AIChatAgent/NewAgent.tsx | 17 +++++++++++++---- .../src/views/BI/AIChatAgent/utils.ts | 9 +++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx index ca3d98a6c91..3f81ec90ecf 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx @@ -26,6 +26,7 @@ import { URI, Utils } from "vscode-uri"; import ConfigForm from "./ConfigForm"; import { cloneDeep } from "lodash"; import { RelativeLoader } from "../../../components/RelativeLoader"; +import { getAgentOrg } from "./utils"; const Container = styled.div` padding: 16px; @@ -59,6 +60,7 @@ export function NewAgent(props: NewAgentProps): JSX.Element { const [savingForm, setSavingForm] = useState(false); const agentFilePath = useRef(""); + const agentOrg = useRef(""); const agentCallEndOfFile = useRef(null); const agentEndOfFile = useRef(null); @@ -71,6 +73,8 @@ export function NewAgent(props: NewAgentProps): JSX.Element { // get agent file path const filePath = await rpcClient.getVisualizerLocation(); agentFilePath.current = Utils.joinPath(URI.file(filePath.projectUri), "agents.bal").fsPath; + // get agent org + agentOrg.current = await getAgentOrg(rpcClient); // fetch agent node await fetchAgentNode(); // get end of files @@ -95,7 +99,7 @@ export function NewAgent(props: NewAgentProps): JSX.Element { const fetchAgentNode = async () => { // get the agent node - const allAgents = await rpcClient.getAIAgentRpcClient().getAllAgents({ filePath: agentFilePath.current }); + const allAgents = await rpcClient.getAIAgentRpcClient().getAllAgents({ filePath: agentFilePath.current, orgName: agentOrg.current }); console.log(">>> allAgents", allAgents); if (!allAgents.agents.length) { console.log(">>> no agents found"); @@ -109,10 +113,10 @@ export function NewAgent(props: NewAgentProps): JSX.Element { // get all llm models const allModels = await rpcClient .getAIAgentRpcClient() - .getAllModels({ agent: agentCodeData.object, filePath: agentFilePath.current }); + .getAllModels({ agent: agentCodeData.object, filePath: agentFilePath.current, orgName: agentOrg.current }); console.log(">>> allModels", allModels); // get openai model - const defaultModel = allModels.models.find((model) => model.object === "OpenAiProvider"); + const defaultModel = allModels.models.find((model) => model.object === "OpenAiProvider" || (model.org === "ballerina" && model.module === "ai")); if (!defaultModel) { console.log(">>> no default model found"); return; @@ -128,6 +132,9 @@ export function NewAgent(props: NewAgentProps): JSX.Element { if (!(agentNode && agentCallNode)) { return; } + // overwrite the agent call node properties + agentCallNode.codedata.org = agentOrg.current; + const agentCallFormFields = convertConfig(agentCallNode.properties); const systemPromptProperty = agentNode.properties.systemPrompt; if (systemPromptProperty) { @@ -241,7 +248,9 @@ export function NewAgent(props: NewAgentProps): JSX.Element { updatedAgentNode.properties.tools.value = []; updatedAgentNode.properties.verbose.value = rawData["verbose"]; updatedAgentNode.properties.maxIter.value = rawData["maxIter"]; - updatedAgentNode.properties.agentType.value = rawData["agentType"]; + if ("agentType" in rawData) { + updatedAgentNode.properties.agentType.value = rawData["agentType"]; + } const agentResponse = await rpcClient .getBIDiagramRpcClient() diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts index 1b4b5de7f42..fe67ed00373 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts @@ -21,6 +21,15 @@ import { BallerinaRpcClient } from "@wso2/ballerina-rpc-client"; import { cloneDeep } from "lodash"; import { URI, Utils } from "vscode-uri"; +export const getAgentOrg = async (rpcClient: BallerinaRpcClient) => { + const filePath = await rpcClient.getVisualizerLocation(); + const agentOrgResponse = await rpcClient + .getAIAgentRpcClient() + .getAgentOrg({ projectPath: filePath.projectUri }); + console.log(">>> agent org", agentOrgResponse.orgName); + return agentOrgResponse.orgName; +} + export const getAgentFilePath = async (rpcClient: BallerinaRpcClient) => { // Get the agent file path and update the node const filePath = await rpcClient.getVisualizerLocation(); From a5b6a3528da4439a5cb0f79d1ecfe4505f66488c Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Wed, 16 Jul 2025 17:30:37 +0530 Subject: [PATCH 032/349] Enhance AIChatAgentWizard to retrieve agent organization and update listener model fetching --- .../BI/AIChatAgent/AIChatAgentWizard.tsx | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx index 187496c71f4..7fd768c5208 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx @@ -16,7 +16,7 @@ * under the License. */ -import { useEffect, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { EVENT_TYPE, ListenerModel } from '@wso2/ballerina-core'; import { View, ViewContent, TextField, Button, Typography } from '@wso2/ui-toolkit'; import styled from '@emotion/styled'; @@ -26,6 +26,7 @@ import { TitleBar } from '../../../components/TitleBar'; import { TopNavigationBar } from '../../../components/TopNavigationBar'; import { RelativeLoader } from '../../../components/RelativeLoader'; import { FormHeader } from '../../../components/FormHeader'; +import { getAgentOrg } from './utils'; const FORM_WIDTH = 600; @@ -78,9 +79,19 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { { label: "Completing", description: "Finalizing the agent setup" } ]; + const agentOrg = useRef(""); + const initWizard = async () => { + agentOrg.current = await getAgentOrg(rpcClient); + } + useEffect(() => { - rpcClient.getServiceDesignerRpcClient().getListenerModel({ moduleName: type }).then(res => { - setListenerModel(res.listener); + initWizard().then(() => { + rpcClient.getServiceDesignerRpcClient().getListenerModel({ moduleName: type, orgName: agentOrg.current }).then(res => { + setListenerModel(res.listener); + }); + }).catch(error => { + console.error("Error initializing AI Chat Agent Wizard:", error); + setNameError("Failed to initialize the wizard. Please try again."); }); }, []); @@ -128,7 +139,8 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { await rpcClient.getServiceDesignerRpcClient().getServiceModel({ filePath: "", moduleName: type, - listenerName: listenerName + listenerName: listenerName, + orgName: agentOrg.current, }).then(res => { const serviceModel = res.service; console.log("Service Model: ", serviceModel); From ea6159922c1ec529257aa6847cf22643f6eea295 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Fri, 18 Jul 2025 06:27:20 +0530 Subject: [PATCH 033/349] Improve generating unique value for the name field in MCP toolkit --- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index 56661389d88..0e998a73086 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -597,6 +597,26 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { } }; + const existingMcpToolkits = extractMcpToolkitNames(toolsStringList); + + const generateUniqueValue = () => { + if (hasUserTyped || editMode) { + return name; + } + + let counter = mcpToolkitCount; + let candidateValue = counter > 1 ? `MCP Server 0${counter}` : "MCP Server"; + while (existingMcpToolkits.some(existingName => + existingName.toLowerCase() === candidateValue.trim().toLowerCase() + )) { + counter++; + candidateValue = `MCP Server 0${counter}`; + } + + return candidateValue; + }; + const computedValue = generateUniqueValue(); + const hasExistingTools = existingTools.length > 0; const isToolSelected = selectedTool !== null; const canSave = serviceUrl.trim() && (toolSelection !== "Selected" || selectedMcpTools.size > 0); @@ -709,7 +729,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { errorMsg={nameError} onChange={handleNameChange} placeholder="Enter name for the MCP Tool Kit" - value={hasUserTyped ? name : (mcpToolkitCount > 1 ? `MCP Server 0${mcpToolkitCount}` : "MCP Server")} + value={computedValue} /> From ab8de4918cf9711efe65490384ea619aa2a417df Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Fri, 18 Jul 2025 10:15:10 +0530 Subject: [PATCH 034/349] Downgrade healthcare model --- .../src/features/ai/service/connection.ts | 27 ++----------------- .../ai/service/healthcare/healthcare.ts | 4 +-- 2 files changed, 4 insertions(+), 27 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts index d1fd0972c2c..5f92b374ca9 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts @@ -18,7 +18,6 @@ export async function fetchWithAuth(input: string | URL | Request, options: Requ 'Authorization': `Bearer ${accessToken}`, 'User-Agent': 'Ballerina-VSCode-Plugin', 'Connection': 'keep-alive', - // 'Keep-Alive': 'timeout=60, max=100' }; let response = await fetch(input, options); @@ -44,35 +43,13 @@ export async function fetchWithAuth(input: string | URL | Request, options: Requ } let url = "https://e95488c8-8511-4882-967f-ec3ae2a0f86f-prod.e1-us-east-azure.choreoapis.dev/ballerina-copilot/intelligence-api/v1.0/claude"; -// let url = "http://localhost:9090/intel/claude" + export const anthropic = createAnthropic({ baseURL: url, apiKey: "xx", //TODO: Gives error without this. see if we can remove, fetch: fetchWithAuth, }); - - export const ANTHROPIC_HAIKU = "claude-3-5-haiku-20241022"; export const ANTHROPIC_SONNET_4 = "claude-sonnet-4-20250514"; - -//Components -//TODO: Move libs into lang server API. - done -//TODO: Host claude api with Auth - done -//TODO: OpenAI Compatible API? -//TODO: Token based throttling? - -//Auth -//TODO: send oauth header / api-key -//TODO: use apiKey if BYOK - -//Migrations -//TODO: Migrate healthcare -//TODO: Evals? - -// Why? -// As our 80% our customer base dont wanna use wso2 managed platform, we need to provide either self hosting capabilities or BYOK. BYOK is way easier for these customers. -// Earlier, we had opininated API for the backend, but when features evolving, maintaining that API is hard while keeping backward compatibility. ex - changing llm response format without breaking frontend. -// Agent mode, Local mcp tools needs the tools to be executed in local machine, either we'll have to go with websockets or to go with complex imlp -// As all logic is contained in ballerina-extension module, can reduce the code complexity by reducing RPC calls by more than 70%. Easier to test the full flow without relying on other variables, state management. - +export const ANTHROPIC_SONNET_3_5 = "claude-3-5-sonnet-20241022"; 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 index 08ce53f6008..2332e4333e0 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts @@ -1,5 +1,5 @@ import { CoreMessage, generateObject, generateText, streamText } from "ai"; -import { anthropic, ANTHROPIC_HAIKU, ANTHROPIC_SONNET_4 } from "../connection"; +import { anthropic, ANTHROPIC_HAIKU, ANTHROPIC_SONNET_3_5, ANTHROPIC_SONNET_4 } from "../connection"; import { GenerationType, getRelevantLibrariesAndFunctions } from "../libs/libs"; import { getRewrittenPrompt, populateHistory, transformProjectSource, getErrorMessage } from "../utils"; import { @@ -73,7 +73,7 @@ export async function generateHealthcareCodeCore( ]; const { fullStream } = streamText({ - model: anthropic(ANTHROPIC_SONNET_4), + model: anthropic(ANTHROPIC_SONNET_3_5), maxTokens: 4096*2, temperature: 0, messages: allMessages, From 37836bdc10023a52837be63b41b6faa663f226be Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Fri, 18 Jul 2025 11:33:40 +0530 Subject: [PATCH 035/349] Refactor AIChatAgentWizard to generate agent and model code --- .../BI/AIChatAgent/AIChatAgentWizard.tsx | 106 +++++++++++++++++- 1 file changed, 104 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx index 7fd768c5208..fbd3e6ba78f 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx @@ -17,16 +17,18 @@ */ import { useEffect, useRef, useState } from 'react'; -import { EVENT_TYPE, ListenerModel } from '@wso2/ballerina-core'; +import { CodeData, EVENT_TYPE, FlowNode, LinePosition, ListenerModel } from '@wso2/ballerina-core'; import { View, ViewContent, TextField, Button, Typography } from '@wso2/ui-toolkit'; import styled from '@emotion/styled'; import { useRpcContext } from '@wso2/ballerina-rpc-client'; +import { URI, Utils } from "vscode-uri"; import { LoadingContainer } from '../../styles'; import { TitleBar } from '../../../components/TitleBar'; import { TopNavigationBar } from '../../../components/TopNavigationBar'; import { RelativeLoader } from '../../../components/RelativeLoader'; import { FormHeader } from '../../../components/FormHeader'; import { getAgentOrg } from './utils'; +import { cloneDeep } from 'lodash'; const FORM_WIDTH = 600; @@ -70,6 +72,8 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { const [listenerModel, setListenerModel] = useState(undefined); const [isCreating, setIsCreating] = useState(false); const [currentStep, setCurrentStep] = useState(0); + const [agentNode, setAgentNode] = useState(null); + const [defaultModelNode, setDefaultModelNode] = useState(null); const steps = [ { label: "Creating Agent", description: "Creating the AI chat agent" }, { label: "Initializing", description: "Setting up the agent configuration" }, @@ -79,9 +83,32 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { { label: "Completing", description: "Finalizing the agent setup" } ]; + const agentFilePath = useRef(""); const agentOrg = useRef(""); + const agentCallEndOfFile = useRef(null); + const agentEndOfFile = useRef(null); + const mainFilePath = useRef(""); + const initWizard = async () => { + // get agent file path + const filePath = await rpcClient.getVisualizerLocation(); + agentFilePath.current = Utils.joinPath(URI.file(filePath.projectUri), "agents.bal").fsPath; + // get agent org agentOrg.current = await getAgentOrg(rpcClient); + // fetch agent node + await fetchAgentNode(); + // get end of files + // main.bal last line + mainFilePath.current = Utils.joinPath(URI.file(filePath.projectUri), "main.bal").fsPath; + const endOfFile = await rpcClient.getBIDiagramRpcClient().getEndOfFile({ filePath: mainFilePath.current }); + console.log(">>> endOfFile", endOfFile); + agentCallEndOfFile.current = endOfFile; + // agent.bal file last line + const endOfAgentFile = await rpcClient + .getBIDiagramRpcClient() + .getEndOfFile({ filePath: agentFilePath.current }); + console.log(">>> endOfAgentFile", endOfAgentFile); + agentEndOfFile.current = endOfAgentFile; } useEffect(() => { @@ -95,6 +122,49 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { }); }, []); + const getNodeTemplate = async ( + codeData: CodeData, + filePath: string, + position: LinePosition = { line: 0, offset: 0 } + ) => { + const response = await rpcClient.getBIDiagramRpcClient().getNodeTemplate({ + position: position, + filePath: filePath, + id: codeData, + }); + console.log(">>> get node template response", response); + return response?.flowNode; + }; + + const fetchAgentNode = async () => { + // get the agent node + const allAgents = await rpcClient.getAIAgentRpcClient().getAllAgents({ filePath: agentFilePath.current, orgName: agentOrg.current }); + console.log(">>> allAgents", allAgents); + if (!allAgents.agents.length) { + console.log(">>> no agents found"); + return; + } + const agentCodeData = allAgents.agents.at(0); + // get agent node template + const agentNodeTemplate = await getNodeTemplate(agentCodeData, agentFilePath.current); + setAgentNode(agentNodeTemplate); + + // get all llm models + const allModels = await rpcClient + .getAIAgentRpcClient() + .getAllModels({ agent: agentCodeData.object, filePath: agentFilePath.current, orgName: agentOrg.current }); + console.log(">>> allModels", allModels); + // get openai model + const defaultModel = allModels.models.find((model) => model.object === "OpenAiProvider" || (model.org === "ballerina" && model.module === "ai")); + if (!defaultModel) { + console.log(">>> no default model found"); + return; + } + // get model node template + const modelNodeTemplate = await getNodeTemplate(defaultModel, agentFilePath.current); + setDefaultModelNode(modelNodeTemplate); + }; + const validateName = (name: string): boolean => { if (!name) { setNameError("Name is required"); @@ -151,9 +221,41 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { rpcClient.getServiceDesignerRpcClient().addServiceSourceCode({ filePath: "", service: res.service - }).then((sourceCode) => { + }).then(async (sourceCode) => { setCurrentStep(4); const newArtifact = sourceCode.artifacts.find(res => res.isNew); + console.log(">>> agent service sourceCode", sourceCode); + console.log(">>> newArtifact", newArtifact); + // save model node + const modelResponse = await rpcClient + .getBIDiagramRpcClient() + .getSourceCode({ filePath: agentFilePath.current, flowNode: defaultModelNode }); + console.log(">>> modelResponse getSourceCode", { modelResponse }); + const modelVarName = defaultModelNode.properties.variable.value as string; + + // wait 2 seconds (wait until LS is updated) + console.log(">>> wait 2 seconds"); + await new Promise((resolve) => setTimeout(resolve, 2000)); + + // save the agent node + const updatedAgentNode = cloneDeep(agentNode); + const systemPromptValue = `{role: "", instructions: string \`\`}`; + const agentVarName = `_${agentName}Agent`; + updatedAgentNode.properties.systemPrompt.value = systemPromptValue; + updatedAgentNode.properties.model.value = modelVarName; + updatedAgentNode.properties.tools.value = []; + updatedAgentNode.properties.verbose.value = "false"; + updatedAgentNode.properties.maxIter.value = "0"; + updatedAgentNode.properties.variable.value = agentVarName; + + const agentResponse = await rpcClient + .getBIDiagramRpcClient() + .getSourceCode({ filePath: agentFilePath.current, flowNode: updatedAgentNode }); + console.log(">>> agentResponse getSourceCode", { agentResponse }); + + // wait 2 seconds (wait until LS is updated) + console.log(">>> wait 2 seconds"); + await new Promise((resolve) => setTimeout(resolve, 2000)); if (newArtifact) { setCurrentStep(5); rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: { documentUri: newArtifact.path, position: newArtifact.position } }); From 37464a6387bc6944e958023035350d8456859de0 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Fri, 18 Jul 2025 11:45:58 +0530 Subject: [PATCH 036/349] Remove agent and model code injection and update agent call code injection for new ai package --- .../src/utils/project-artifacts.ts | 10 ++---- .../src/utils/source-utils.ts | 36 +++++-------------- 2 files changed, 11 insertions(+), 35 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts index 7a24e6cb3bf..92f55bf4895 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts @@ -24,7 +24,7 @@ import * as path from 'path'; import { ExtendedLangClient } from "../core/extended-language-client"; import { ServiceDesignerRpcManager } from "../rpc-managers/service-designer/rpc-manager"; import { AiAgentRpcManager } from "../rpc-managers/ai-agent/rpc-manager"; -import { injectAgent, injectAgentCode, injectImportIfMissing } from "./source-utils"; +import { injectAgentCode, injectImportIfMissing } from "./source-utils"; import { tmpdir } from "os"; import { ArtifactsUpdated, ArtifactNotificationHandler } from "./project-artifacts-handler"; @@ -185,15 +185,9 @@ async function injectAIAgent(serviceArtifact: BaseArtifact) { // Fetch the organization name for importing the AI package const agentOrg = await new AiAgentRpcManager().getAgentOrg({ projectPath: StateMachine.context().projectUri }); - // Inject the import if missing - const importStatement = `import ${agentOrg.orgName}/ai`; - await injectImportIfMissing(importStatement, path.join(StateMachine.context().projectUri, `agents.bal`)); - //get AgentName const agentName = serviceArtifact.name.split('-')[1].trim().replace(/\//g, ''); - // Inject the agent code - await injectAgent(agentName, StateMachine.context().projectUri); // Retrieve the service model const targetFile = Utils.joinPath(URI.parse(StateMachine.context().projectUri), serviceArtifact.location.fileName).fsPath; const updatedService = await new ServiceDesignerRpcManager().getServiceModelFromCode({ @@ -212,7 +206,7 @@ async function injectAIAgent(serviceArtifact: BaseArtifact) { const injectionPosition = updatedService.service.functions[0].codedata.lineRange.endLine; const serviceFile = path.join(StateMachine.context().projectUri, `main.bal`); ensureFileExists(serviceFile); - await injectAgentCode(agentName, serviceFile, injectionPosition); + await injectAgentCode(agentName, serviceFile, injectionPosition, agentOrg.orgName); const functionPosition: NodePosition = { startLine: updatedService.service.functions[0].codedata.lineRange.startLine.line, startColumn: updatedService.service.functions[0].codedata.lineRange.startLine.offset, diff --git a/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts b/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts index f9c3ae010e7..2a32ee106e7 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts @@ -175,35 +175,17 @@ export async function injectImportIfMissing(importStatement: string, filePath: s } } -export async function injectAgent(name: string, projectUri: string) { - const agentCode = ` -final ai:OpenAiProvider _${name}Model = check new ("", ai:GPT_4O); -final ai:Agent _${name}Agent = check new (systemPrompt = {role: "", instructions: string \`\`}, - model = _${name}Model, - tools = [] -);`; - // Update the service function code - const agentsFile = path.join(projectUri, `agents.bal`); - const agentEdit = new vscode.WorkspaceEdit(); - - // Read the file content to determine its length - let fileContent = ''; - try { - fileContent = fs.readFileSync(agentsFile, 'utf8'); - } catch (error) { - // File doesn't exist, that's fine - we'll create it - } - - // Insert at the end of the file - agentEdit.insert(Uri.file(agentsFile), new Position(fileContent.split('\n').length, 0), agentCode); - await workspace.applyEdit(agentEdit); -} - - -export async function injectAgentCode(name: string, serviceFile: string, injectionPosition: LinePosition) { +export async function injectAgentCode(name: string, serviceFile: string, injectionPosition: LinePosition, orgName: string) { // Update the service function code const serviceEdit = new vscode.WorkspaceEdit(); - const serviceSourceCode = ` + // Choose agent invocation code based on orgName + const serviceSourceCode = + orgName === "ballerina" + ? + ` string stringResult = check _${name}Agent.run(request.message, request.sessionId); + return {message: stringResult}; +` + : ` string stringResult = check _${name}Agent->run(request.message, request.sessionId); return {message: stringResult}; `; From ccad139f81c5c04f312f8aff26305b57a09810d0 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Fri, 18 Jul 2025 13:39:09 +0530 Subject: [PATCH 037/349] Add agent organization retrieval to MemoryManagerConfig --- .../src/views/BI/AIChatAgent/MemoryManagerConfig.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/MemoryManagerConfig.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/MemoryManagerConfig.tsx index 24cc57c8e4e..9f84bcbab47 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/MemoryManagerConfig.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/MemoryManagerConfig.tsx @@ -26,7 +26,7 @@ import ConfigForm from "./ConfigForm"; import { Dropdown } from "@wso2/ui-toolkit"; import { cloneDeep } from "lodash"; import { RelativeLoader } from "../../../components/RelativeLoader"; -import { getAgentFilePath } from "./utils"; +import { getAgentFilePath, getAgentOrg } from "./utils"; const Container = styled.div` padding: 16px; @@ -68,6 +68,7 @@ export function MemoryManagerConfig(props: MemoryManagerConfigProps): JSX.Elemen const [savingForm, setSavingForm] = useState(false); const agentFilePath = useRef(""); + const agentOrg = useRef(""); const agentNodeRef = useRef(); const moduleConnectionNodes = useRef([]); const selectedMemoryManagerFlowNode = useRef(); @@ -85,6 +86,7 @@ export function MemoryManagerConfig(props: MemoryManagerConfigProps): JSX.Elemen const initPanel = async () => { setLoading(true); agentFilePath.current = await getAgentFilePath(rpcClient); + agentOrg.current = await getAgentOrg(rpcClient); // fetch all memory managers const memoryManagers = await fetchMemoryManagers(); // fetch selected agent memory manager @@ -102,7 +104,7 @@ export function MemoryManagerConfig(props: MemoryManagerConfigProps): JSX.Elemen try { const memoryManagers = await rpcClient .getAIAgentRpcClient() - .getAllMemoryManagers({ filePath: agentFilePath.current }); + .getAllMemoryManagers({ filePath: agentFilePath.current, orgName: agentOrg.current }); console.log(">>> all memory managers", memoryManagers); if (memoryManagers.memoryManagers) { setMemoryManagersCodeData(memoryManagers.memoryManagers); From e2026969cc4d5fd3a64f913e33b08e32a5e17784 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Fri, 18 Jul 2025 13:39:59 +0530 Subject: [PATCH 038/349] Add check for agentType in AgentConfig handleOnSave to prevent errors --- .../src/views/BI/AIChatAgent/AgentConfig.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AgentConfig.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AgentConfig.tsx index f751b430979..bd2167ea100 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AgentConfig.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AgentConfig.tsx @@ -184,7 +184,9 @@ export function AgentConfig(props: AgentConfigProps): JSX.Element { updatedAgentNode.properties.systemPrompt.value = systemPromptValue; updatedAgentNode.properties.verbose.value = rawData["verbose"]; updatedAgentNode.properties.maxIter.value = rawData["maxIter"]; - updatedAgentNode.properties.agentType.value = rawData["agentType"]; + if ("agentType" in rawData) { + updatedAgentNode.properties.agentType.value = rawData["agentType"]; + } const agentResponse = await rpcClient .getBIDiagramRpcClient() From 9c0d7a01c03435b629c0165e660735c4e5db67a8 Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Fri, 18 Jul 2025 11:49:04 +0530 Subject: [PATCH 039/349] Add licence headers --- rush.json | 10 ++-- .../src/features/ai/service/code/code.ts | 16 +++++ .../features/ai/service/code/np_prompts.ts | 16 +++++ .../src/features/ai/service/connection.ts | 16 +++++ .../ai/service/datamapper/context_api.ts | 48 +++++---------- .../ai/service/datamapper/datamapper.ts | 59 +++++-------------- .../features/ai/service/datamapper/prompt.ts | 18 +++++- .../features/ai/service/datamapper/schema.ts | 16 +++++ .../features/ai/service/datamapper/types.ts | 16 +++++ .../src/features/ai/service/event.ts | 16 +++++ .../ai/service/healthcare/healthcare.ts | 16 +++++ .../src/features/ai/service/libs/funcs.ts | 16 +++++ .../ai/service/libs/funcs_inter_types.ts | 16 +++++ .../src/features/ai/service/libs/langlibs.ts | 16 +++++ .../src/features/ai/service/libs/libs.ts | 16 +++++ .../features/ai/service/libs/libs_types.ts | 16 ++++- .../features/ai/service/openapi/openapi.ts | 16 +++++ .../ai/service/test/function_tests.ts | 16 +++++ .../src/features/ai/service/test/prompts.ts | 16 +++++ .../src/features/ai/service/test/test.ts | 16 +++++ .../src/features/ai/service/test/test_plan.ts | 16 +++++ .../src/features/ai/service/test/utils.ts | 16 +++++ .../src/features/ai/service/types.ts | 16 +++++ .../src/features/ai/service/utils.ts | 16 +++++ .../test/ai/evals/code/code.test.ts | 23 +++++--- 25 files changed, 384 insertions(+), 94 deletions(-) diff --git a/rush.json b/rush.json index 5599eccfe76..f600b8dc962 100644 --- a/rush.json +++ b/rush.json @@ -425,11 +425,11 @@ "projectFolder": "workspaces/wso2-platform/wso2-platform-extension", "versionPolicyName": "wso2-platform-extension" }, - // { - // "packageName": "@wso2/wso2-platform-vscode-webviews", - // "projectFolder": "workspaces/wso2-platform/wso2-platform-webviews", - // "versionPolicyName": "wso2-platform-extension" - // }, + { + "packageName": "@wso2/wso2-platform-vscode-webviews", + "projectFolder": "workspaces/wso2-platform/wso2-platform-webviews", + "versionPolicyName": "wso2-platform-extension" + }, { "packageName": "@wso2/choreo-core", "projectFolder": "workspaces/choreo/choreo-core", diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 4697aa39752..e29a5aae746 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -1,3 +1,19 @@ +// 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, generateText, streamText } from "ai"; import { anthropic, ANTHROPIC_SONNET_4 } from "../connection"; import { GenerationType, getRelevantLibrariesAndFunctions } from "../libs/libs"; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/np_prompts.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/np_prompts.ts index 7b20acaced1..edd5c9a7bbe 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/np_prompts.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/np_prompts.ts @@ -1,3 +1,19 @@ +// 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/libs_types"; export const REQUIREMENTS_DOCUMENT_KEY: string = "user_requirements_file"; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts index 5f92b374ca9..ef4df70cec7 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts @@ -1,3 +1,19 @@ +// 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 { createAnthropic } from "@ai-sdk/anthropic"; import { getAccessToken, getRefreshedAccessToken } from "../../../utils/ai/auth"; import { AIStateMachine } from "../../../views/ai-panel/aiMachine"; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts index ef1c90ce52e..764516f5546 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts @@ -1,36 +1,18 @@ -/** - * Data Mapper Context API - * - * This module provides TypeScript functions for processing files and text content - * to generate Ballerina mapping instructions, record types, and requirement analysis. - * - * Migrated from Python FastAPI service with the following changes: - * - HTTP endpoints replaced with function-based API - * - File writing removed (content returned directly) - * - DOCX support removed (not needed) - * - File representation using {fileName, content} records - * - Prompts defined as functions instead of files - * - Uses existing Claude endpoint for LLM calls - * - File type detection based on extension only (no content-type needed) - * - * Usage: - * ```typescript - * // Generate mapping instructions from text - * const result = await generateMappingInstruction({ - * text: "source data structure..." - * }); - * - * // Generate Ballerina records from image - * const result = await generateRecord({ - * file: { fileName: "schema.png", content: "base64ImageData..." } - * }); - * - * // Extract requirements from PDF - * const result = await extractRequirements({ - * file: { fileName: "requirements.pdf", content: "base64PdfData..." } - * }); - * ``` - */ +// 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 { generateText, CoreMessage } from "ai"; import { anthropic, ANTHROPIC_SONNET_4 } from "../connection"; 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 index 72489210b45..8cc63533652 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts @@ -1,47 +1,18 @@ -/** - * AI-Powered Data Mapping Generator for Ballerina - * - * This module provides intelligent data transformation mapping capabilities using AI. - * It analyzes input and output schemas to generate appropriate mapping operations. - * - * Key Features: - * - AI-powered mapping generation using Claude AI - * - Support for multiple operation types (DIRECT, LENGTH, SPLIT, etc.) - * - Comprehensive validation and error handling - * - Retry logic for robust operation - * - * Usage: - * ```typescript - * import { generateAutoMappings, createSamplePayload } from './datamapper'; - * - * const payload = createSamplePayload(); - * const response = await generateAutoMappings(payload); - * console.log(response.mappings); - * ``` - * - * Expected Response Format: - * ```json - * { - * "mappings": { - * "id": { - * "operation": "DIRECT", - * "targetType": "string", - * "parameters": ["person.id"] - * }, - * "firstName": { - * "operation": "DIRECT", - * "targetType": "string", - * "parameters": ["person.firstName"] - * } - * } - * } - * ``` - * - * Configuration: - * - Ensure the Claude endpoint is running and properly configured - * - The implementation supports various operation types defined in the operations table - * - Mapping validation ensures compatibility with supported data types - */ +// 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 { generateText, CoreMessage, generateObject } from "ai"; import { getDataMappingPrompt } from "./prompt"; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/prompt.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/prompt.ts index 2daac9d3158..c0baa454bb3 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/prompt.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/prompt.ts @@ -1,6 +1,18 @@ -// ============================================================================= -// AI PROMPT FUNCTIONS -// ============================================================================= +// 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. /** * Generates the main data mapping prompt for AI diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/schema.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/schema.ts index ba28e5f7b27..e4522337c40 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/schema.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/schema.ts @@ -1,3 +1,19 @@ +// 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 individual operation diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/types.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/types.ts index b2ce205edb6..60fbe082d26 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/types.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/types.ts @@ -1,3 +1,19 @@ +// 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. + // ============================================================================= // OPERATION TYPES // ============================================================================= diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts index 311b4a4496a..5ed7870ff0c 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts @@ -1,3 +1,19 @@ +// 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 { ChatNotify, ChatContent } from "@wso2/ballerina-core"; import { sendContentAppendNotification, sendContentReplaceNotification, sendDiagnosticMessageNotification, sendErrorNotification, sendMessagesNotification, sendMessageStartNotification, sendMessageStopNotification, sendTestGenIntermidateStateNotification } from "./utils"; 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 index 2332e4333e0..973fdd53a16 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts @@ -1,3 +1,19 @@ +// 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, generateObject, generateText, streamText } from "ai"; import { anthropic, ANTHROPIC_HAIKU, ANTHROPIC_SONNET_3_5, ANTHROPIC_SONNET_4 } from "../connection"; import { GenerationType, getRelevantLibrariesAndFunctions } from "../libs/libs"; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts index 7a5c2300a31..9781b46af64 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts @@ -1,3 +1,19 @@ +// 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, CoreMessage } from "ai"; import { GetFunctionResponse, GetFunctionsRequest, GetFunctionsResponse, getFunctionsResponseSchema, MinifiedClient, MinifiedRemoteFunction, MinifiedResourceFunction } from "./funcs_inter_types"; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs_inter_types.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs_inter_types.ts index aa4290ddf59..df21446528d 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs_inter_types.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs_inter_types.ts @@ -1,3 +1,19 @@ +// 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 { jsonSchema } from 'ai'; export interface GetFunctionsRequest { 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 index 68177b1d013..a015e741375 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/langlibs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/langlibs.ts @@ -1,3 +1,19 @@ +// 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 index 2695c956b3c..e3721a8c2ee 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts @@ -1,3 +1,19 @@ +// 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, CoreMessage } from "ai"; import { z } from "zod"; import { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs_types.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs_types.ts index 1725f2047a7..6ff8c85fd5c 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs_types.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs_types.ts @@ -1,4 +1,18 @@ -// TypeScript interfaces corresponding to Ballerina types +// 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 { jsonSchema } from "ai"; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts index 9809594f1b6..56dd43dd820 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts @@ -1,3 +1,19 @@ +// 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 { GenerateOpenAPIRequest } from "@wso2/ballerina-core"; import { streamText } from "ai"; import { anthropic, ANTHROPIC_HAIKU } from "../connection"; 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 index bec63dd4809..c5d90b6f505 100644 --- 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 @@ -1,3 +1,19 @@ +// 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 } from "@wso2/ballerina-core"; import { getErrorMessage } from "../utils"; import { generateTest, getDiagnostics } from "../../testGenerator"; 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 index 561195e9edd..bc6bb07fba5 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/prompts.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/prompts.ts @@ -1,3 +1,19 @@ +// 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 { CoreMessage } from "ai"; import { flattenProjectToText, getExternalTypesAsJsonSchema, getTypesAsJsonSchema, getDiagnosticsAsText, extractSectionToFix } from "./utils"; 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 index 0b6261391d9..c7deeede90d 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts @@ -1,3 +1,19 @@ +// 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 { generateText, CoreMessage } from "ai"; import { anthropic } from "../connection"; import { 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 index 3b90dc4dde6..bb01764a329 100644 --- 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 @@ -1,3 +1,19 @@ +// 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, streamText } from "ai"; import { anthropic, ANTHROPIC_SONNET_4 } from "../connection"; import { getErrorMessage } from "../utils"; 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 index 98f394efb65..e52f74bdf61 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/utils.ts @@ -1,3 +1,19 @@ +// 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"; // ============================================== diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/types.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/types.ts index 5e925c98f11..2ff5f20d6c4 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/types.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/types.ts @@ -1,3 +1,19 @@ +// 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"; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts index 04a941849fd..ad8f88e4fbf 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts @@ -1,3 +1,19 @@ +// 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 { ChatEntry, ChatError, 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 2a261ed3cae..05bd6317c10 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 @@ -1,11 +1,18 @@ -/** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com). All Rights Reserved. - * - * This software is the property of WSO2 LLC. and its suppliers, if any. - * Dissemination of any information or reproduction of any material contained - * herein in any form is strictly forbidden, unless permitted by WSO2 expressly. - * You may not alter or remove any copyright or other notice from copies of this content. - */ +// 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 { generateCodeCore } from "../../../../src/features/ai/service/code/code"; From cab4b35ea5a9a0289b0c9def9461e203dfd069fa Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Fri, 18 Jul 2025 16:39:22 +0530 Subject: [PATCH 040/349] Add diagramKey state to MainPanel for forced re-rendering of DiagramWrapper --- .../ballerina-visualizer/src/MainPanel.tsx | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index ac92805c93a..a3a9bcdc2dd 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -174,6 +174,7 @@ const MainPanel = () => { const [navActive, setNavActive] = useState(true); const [showHome, setShowHome] = useState(true); const [popupState, setPopupState] = useState("initialize"); + const [diagramKey, setDiagramKey] = useState(0); rpcClient?.onStateChanged((newState: MachineStateValue) => { if (typeof newState === "object" && "viewActive" in newState && newState.viewActive === "viewReady") { @@ -234,6 +235,8 @@ const MainPanel = () => { const fetchContext = () => { setNavActive(true); + // Force re-render of DiagramWrapper by incrementing the key + setDiagramKey(prev => prev + 1); rpcClient.getVisualizerLocation().then((value) => { let defaultFunctionsFile = Utils.joinPath(URI.file(value.projectUri), 'functions.bal').fsPath; if (value.documentUri) { @@ -268,6 +271,7 @@ const MainPanel = () => { case MACHINE_VIEW.BIDiagram: setViewComponent( { break; case MACHINE_VIEW.ViewConfigVariables: setViewComponent( - - ); + + ); break; default: setNavActive(false); From 7a5c3597611c528ed643d766637aca56b09c5fd3 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Fri, 18 Jul 2025 16:47:13 +0530 Subject: [PATCH 041/349] Refactor MainPanel to re-render the diagram when the identifier changes --- workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index a3a9bcdc2dd..22f21ae84a7 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -174,7 +174,6 @@ const MainPanel = () => { const [navActive, setNavActive] = useState(true); const [showHome, setShowHome] = useState(true); const [popupState, setPopupState] = useState("initialize"); - const [diagramKey, setDiagramKey] = useState(0); rpcClient?.onStateChanged((newState: MachineStateValue) => { if (typeof newState === "object" && "viewActive" in newState && newState.viewActive === "viewReady") { @@ -235,8 +234,6 @@ const MainPanel = () => { const fetchContext = () => { setNavActive(true); - // Force re-render of DiagramWrapper by incrementing the key - setDiagramKey(prev => prev + 1); rpcClient.getVisualizerLocation().then((value) => { let defaultFunctionsFile = Utils.joinPath(URI.file(value.projectUri), 'functions.bal').fsPath; if (value.documentUri) { @@ -271,7 +268,7 @@ const MainPanel = () => { case MACHINE_VIEW.BIDiagram: setViewComponent( Date: Fri, 18 Jul 2025 17:48:34 +0530 Subject: [PATCH 042/349] Update ModelConfig to support new ballerina/ai package --- .../ballerina-visualizer/src/constants.ts | 15 +++++ .../src/views/BI/AIChatAgent/ModelConfig.tsx | 62 ++++++++++++++++--- 2 files changed, 70 insertions(+), 7 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/constants.ts b/workspaces/ballerina/ballerina-visualizer/src/constants.ts index f32543a7a1f..3990e045496 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/constants.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/constants.ts @@ -21,3 +21,18 @@ import { TRIGGER_CHARACTERS } from '@wso2/ballerina-core'; export const EXPRESSION_EXTRACTION_REGEX = new RegExp( `(?(?:[a-zA-Z0-9_']+[${TRIGGER_CHARACTERS.join('')}\(\[])*)?(?[a-zA-Z0-9_']*)$` ); + +export const BALLERINA = "ballerina"; +export const BALLERINAX = "ballerinax"; + +export const GET_DEFAULT_MODEL_PROVIDER = "getDefaultModelProvider"; +export const WSO2_MODEL_PROVIDER = "Wso2ModelProvider"; + +export const PROVIDER_NAME_MAP: Record = { + "ai.anthropic": "AnthropicProvider", + "ai.openai": "OpenAiProvider", + "ai.azure": "AzureOpenAiProvider", + "ai.mistral": "MistralAiProvider", + "ai.deepseek": "DeepSeekProvider", + "ai.ollama": "OllamaProvider", +}; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx index 3f9932ae6fc..9b7c501b083 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx @@ -26,7 +26,8 @@ import ConfigForm from "./ConfigForm"; import { Dropdown } from "@wso2/ui-toolkit"; import { cloneDeep } from "lodash"; import { RelativeLoader } from "../../../components/RelativeLoader"; -import { getAgentFilePath } from "./utils"; +import { getAgentFilePath, getAgentOrg } from "./utils"; +import { BALLERINA, BALLERINAX, GET_DEFAULT_MODEL_PROVIDER, WSO2_MODEL_PROVIDER, PROVIDER_NAME_MAP } from "../../../constants"; const Container = styled.div` padding: 16px; @@ -68,6 +69,7 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { const [savingForm, setSavingForm] = useState(false); const agentFilePath = useRef(""); + const agentOrg = useRef(""); const moduleConnectionNodes = useRef([]); const selectedModelFlowNode = useRef(); @@ -77,13 +79,28 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { useEffect(() => { if (modelsCodeData.length > 0 && selectedModel && !selectedModelCodeData) { - fetchModelNodeTemplate(selectedModel.codedata); + // Find the initial modelCodeData that matches selectedModel + let initialModelCodeData: CodeData | undefined; + if (agentOrg.current === BALLERINA) { + initialModelCodeData = modelsCodeData.find((model) => model.module === selectedModel.codedata.module); + } else if (agentOrg.current === BALLERINAX) { + initialModelCodeData = modelsCodeData.find((model) => model.object === selectedModel.codedata.object); + } else { + initialModelCodeData = modelsCodeData.find((model) => model.module === selectedModel.codedata.module); + } + if (initialModelCodeData) { + setSelectedModelCodeData(initialModelCodeData); + fetchModelNodeTemplate(initialModelCodeData); + } else { + fetchModelNodeTemplate(selectedModel.codedata); + } } }, [modelsCodeData, selectedModel]); const initPanel = async () => { setLoading(true); agentFilePath.current = await getAgentFilePath(rpcClient); + agentOrg.current = await getAgentOrg(rpcClient); // fetch all models await fetchModels(); // fetch selected agent model @@ -91,6 +108,21 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { setLoading(false); }; + // Helper to get provider name from modelCodeData + const getProviderName = (model: CodeData, useMappedName: boolean = false) => { + if (!model) return ""; + if (agentOrg.current === BALLERINA) { + if (useMappedName) { + return PROVIDER_NAME_MAP[model.module] || model.module; + } + return model.module; + } else if (agentOrg.current === BALLERINAX) { + return model.object; + } + // fallback + return model.module || model.object; + }; + const fetchModels = async () => { console.log(">>> agent call node", agentCallNode); const agentName = agentCallNode?.properties.connection.value; @@ -100,7 +132,7 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { } const models = await rpcClient .getAIAgentRpcClient() - .getAllModels({ agent: agentName, filePath: agentFilePath.current }); + .getAllModels({ agent: agentName, filePath: agentFilePath.current, orgName: agentOrg.current }); console.log(">>> all models", models); setModelsCodeData(models.models); }; @@ -134,7 +166,16 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { const fetchModelNodeTemplate = async (modelCodeData: CodeData) => { setLoading(true); let nodeProperties: NodeProperties = {}; - if (selectedModel?.codedata.object === modelCodeData.object) { + // Determine provider match for both agentOrg cases + let isProviderMatch = false; + if (agentOrg.current === BALLERINA) { + isProviderMatch = selectedModel?.codedata.module === modelCodeData.module; + } else if (agentOrg.current === BALLERINAX) { + isProviderMatch = selectedModel?.codedata.object === modelCodeData.object; + } else { + isProviderMatch = selectedModel?.codedata.module === modelCodeData.module; + } + if (isProviderMatch) { // use selected model properties selectedModelFlowNode.current = cloneDeep(selectedModel); nodeProperties = selectedModel?.properties; @@ -203,7 +244,12 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { id="agent-model-dropdown" items={[ { value: "Select a provider...", content: "Select a provider..." }, - ...modelsCodeData.map((model) => ({ value: model.object, content: model.object })), + ...[...modelsCodeData] + .sort((a, b) => (b.symbol === GET_DEFAULT_MODEL_PROVIDER ? 1 : 0) - (a.symbol === GET_DEFAULT_MODEL_PROVIDER ? 1 : 0)) + .map((model) => ({ + value: getProviderName(model), + content: model.symbol === GET_DEFAULT_MODEL_PROVIDER ? WSO2_MODEL_PROVIDER : getProviderName(model, true) + })), ]} label="Select Model Provider" description={"Available Providers"} @@ -211,11 +257,12 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { if (value === "Select a provider...") { return; // Skip the init option } - const selectedModelCodeData = modelsCodeData.find((model) => model.object === value); + const selectedModelCodeData = modelsCodeData.find((model) => getProviderName(model) === value); + console.log("Selected Model Code Data: ", selectedModelCodeData); setSelectedModelCodeData(selectedModelCodeData); fetchModelNodeTemplate(selectedModelCodeData); }} - value={selectedModelCodeData?.object || (agentCallNode?.metadata.data?.model?.type as string)} + value={selectedModelCodeData ? getProviderName(selectedModelCodeData) : (agentCallNode?.metadata.data?.model?.type as string)} containerSx={{ width: "100%" }} />
@@ -231,6 +278,7 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { targetLineRange={selectedModel?.codedata.lineRange} onSubmit={handleOnSave} disableSaveButton={savingForm} + isSaving={savingForm} /> )} From d4132bf3b506b10e7fb6b61d43c6ca53e421fcc2 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Fri, 18 Jul 2025 17:51:59 +0530 Subject: [PATCH 043/349] Add isSaving prop to AgentConfig, MemoryManagerConfig, and ToolConfig components --- .../src/views/BI/AIChatAgent/AgentConfig.tsx | 1 + .../BI/AIChatAgent/MemoryManagerConfig.tsx | 25 ++++++++++--------- .../src/views/BI/AIChatAgent/ToolConfig.tsx | 1 + 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AgentConfig.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AgentConfig.tsx index bd2167ea100..2d93a6d86d9 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AgentConfig.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AgentConfig.tsx @@ -218,6 +218,7 @@ export function AgentConfig(props: AgentConfigProps): JSX.Element { targetLineRange={agentCallNode.codedata.lineRange} onSubmit={handleOnSave} disableSaveButton={savingForm} + isSaving={savingForm} /> )} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/MemoryManagerConfig.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/MemoryManagerConfig.tsx index 9f84bcbab47..85eb18b2e21 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/MemoryManagerConfig.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/MemoryManagerConfig.tsx @@ -125,32 +125,32 @@ export function MemoryManagerConfig(props: MemoryManagerConfigProps): JSX.Elemen console.error("No module connections found"); return; } - + moduleConnectionNodes.current = moduleNodes.flowModel.connections; - + // get agent name const agentName = agentCallNode.properties.connection.value; if (!agentName) { console.error("Agent name not found in agent call node"); return; } - + // get agent node - const agentNode = moduleConnectionNodes.current.find((node) => node.properties.variable.value === agentName); + const agentNode = moduleConnectionNodes.current.find((node) => node.properties.variable.value === agentName); if (!agentNode) { console.error("Agent node not found", agentCallNode); return; } - + agentNodeRef.current = agentNode; - + // get memory manager name const memoryManagerName = (agentNode.properties?.memory?.value as string) || ""; // "new ai:MessageWindowChatMemory(33)" if (!memoryManagerName) { console.log("No memory manager associated with this agent"); return; } - + // get memory manager from available ones const memoryManagerCodeData = memoryManagers.find((memory) => { // Extract the memory manager type from the expression like "new ai:MessageWindowChatMemory(33)" @@ -163,9 +163,9 @@ export function MemoryManagerConfig(props: MemoryManagerConfigProps): JSX.Elemen console.error("Memory manager not found in available memory managers"); return; } - + setSelectedMemoryManagerCodeData(memoryManagerCodeData); - + const selectedMemoryManagerNodeTemplate = await getNodeTemplate( memoryManagerCodeData, agentFilePath.current @@ -174,7 +174,7 @@ export function MemoryManagerConfig(props: MemoryManagerConfigProps): JSX.Elemen console.error("Failed to get node template for memory manager"); return; } - + // set properties size value const sizeValue = memoryManagerName.split("(")[1]?.split(")")[0]?.trim(); if (sizeValue) { @@ -192,7 +192,7 @@ export function MemoryManagerConfig(props: MemoryManagerConfigProps): JSX.Elemen // fetch selected memory manager code data - node template const fetchMemoryManagerNodeTemplate = async (memoryManagerCodeData: CodeData) => { setLoading(true); - const selectedMemoryManagerNodeTemplate = await getNodeTemplate( + const selectedMemoryManagerNodeTemplate = await getNodeTemplate( memoryManagerCodeData, agentFilePath.current ); @@ -202,7 +202,7 @@ export function MemoryManagerConfig(props: MemoryManagerConfigProps): JSX.Elemen } // set properties variable selectedMemoryManagerNodeTemplate.properties.variable.hidden = true; - + setSelectedMemoryManager(selectedMemoryManagerNodeTemplate); const memoryManagerFields = convertConfig(selectedMemoryManagerNodeTemplate.properties); setSelectedMemoryManagerFields(memoryManagerFields); @@ -326,6 +326,7 @@ export function MemoryManagerConfig(props: MemoryManagerConfigProps): JSX.Elemen targetLineRange={agentNodeRef.current.codedata.lineRange} onSubmit={handleOnSave} disableSaveButton={savingForm} + isSaving={savingForm} /> )} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ToolConfig.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ToolConfig.tsx index cc971c80ad0..498699b63b4 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ToolConfig.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ToolConfig.tsx @@ -124,6 +124,7 @@ export function ToolConfig(props: ToolConfigProps): JSX.Element { targetLineRange={agentCallNode.codedata.lineRange} onSubmit={handleOnSave} disableSaveButton={savingForm} + isSaving={savingForm} /> )} From a29512984d129b2ebbfe1090af6476738b772569 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Fri, 18 Jul 2025 17:57:20 +0530 Subject: [PATCH 044/349] Use constants in AIChatAgentWizard and NewAgent components --- workspaces/ballerina/ballerina-visualizer/src/constants.ts | 2 ++ .../src/views/BI/AIChatAgent/AIChatAgentWizard.tsx | 3 ++- .../ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/constants.ts b/workspaces/ballerina/ballerina-visualizer/src/constants.ts index 3990e045496..abbab12a826 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/constants.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/constants.ts @@ -25,6 +25,8 @@ export const EXPRESSION_EXTRACTION_REGEX = new RegExp( export const BALLERINA = "ballerina"; export const BALLERINAX = "ballerinax"; +export const AI = "ai"; + export const GET_DEFAULT_MODEL_PROVIDER = "getDefaultModelProvider"; export const WSO2_MODEL_PROVIDER = "Wso2ModelProvider"; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx index fbd3e6ba78f..4239831781c 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx @@ -29,6 +29,7 @@ import { RelativeLoader } from '../../../components/RelativeLoader'; import { FormHeader } from '../../../components/FormHeader'; import { getAgentOrg } from './utils'; import { cloneDeep } from 'lodash'; +import { AI, BALLERINA } from '../../../constants'; const FORM_WIDTH = 600; @@ -155,7 +156,7 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { .getAllModels({ agent: agentCodeData.object, filePath: agentFilePath.current, orgName: agentOrg.current }); console.log(">>> allModels", allModels); // get openai model - const defaultModel = allModels.models.find((model) => model.object === "OpenAiProvider" || (model.org === "ballerina" && model.module === "ai")); + const defaultModel = allModels.models.find((model) => model.object === "OpenAiProvider" || (model.org === BALLERINA && model.module === AI)); if (!defaultModel) { console.log(">>> no default model found"); return; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx index 3f81ec90ecf..3c5acbd8cc8 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx @@ -27,6 +27,7 @@ import ConfigForm from "./ConfigForm"; import { cloneDeep } from "lodash"; import { RelativeLoader } from "../../../components/RelativeLoader"; import { getAgentOrg } from "./utils"; +import { AI, BALLERINA } from "../../../constants"; const Container = styled.div` padding: 16px; @@ -116,7 +117,7 @@ export function NewAgent(props: NewAgentProps): JSX.Element { .getAllModels({ agent: agentCodeData.object, filePath: agentFilePath.current, orgName: agentOrg.current }); console.log(">>> allModels", allModels); // get openai model - const defaultModel = allModels.models.find((model) => model.object === "OpenAiProvider" || (model.org === "ballerina" && model.module === "ai")); + const defaultModel = allModels.models.find((model) => model.object === "OpenAiProvider" || (model.org === BALLERINA && model.module === AI)); if (!defaultModel) { console.log(">>> no default model found"); return; From 5c93fc91dbfd2f2331337cd498a1233a52166321 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Fri, 18 Jul 2025 20:42:13 +0530 Subject: [PATCH 045/349] Enhance VS Code extension test setup by adding automatic installation of extension dependencies from package.json --- .../ballerina/ballerina-extension/test/lib/index.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/test/lib/index.ts b/workspaces/ballerina/ballerina-extension/test/lib/index.ts index 75eecfc3083..2fceaa29c4d 100644 --- a/workspaces/ballerina/ballerina-extension/test/lib/index.ts +++ b/workspaces/ballerina/ballerina-extension/test/lib/index.ts @@ -16,11 +16,12 @@ * under the License. */ -import { downloadAndUnzipVSCode } from '@vscode/test-electron'; +import { downloadAndUnzipVSCode, resolveCliArgsFromVSCodeExecutablePath } from '@vscode/test-electron'; import { defaultCachePath } from '@vscode/test-electron/out/download'; import { TestOptions } from '@vscode/test-electron/out/runTest'; import * as cp from 'child_process'; import * as path from 'path'; +const packageJson = require('../../../package.json') /** * Run VS Code extension test @@ -30,6 +31,15 @@ import * as path from 'path'; export async function runTests(options: TestOptions): Promise { if (!options.vscodeExecutablePath) { options.vscodeExecutablePath = await downloadAndUnzipVSCode(options); + const [cli, ...args] = resolveCliArgsFromVSCodeExecutablePath(options.vscodeExecutablePath) + if (packageJson.extensionDependencies) { + for (const extensionId of packageJson.extensionDependencies) { + cp.spawnSync(cli, [...args, '--install-extension', extensionId], { + encoding: 'utf-8', + stdio: 'inherit', + }) + } + } } let args = [ From 79d0f161da69d1a2133f7550634e4e15c3fdff1c Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Fri, 18 Jul 2025 17:11:28 +0530 Subject: [PATCH 046/349] Refactor state machine logic to handle project initialization based on BI status. Added conditional transitions for rendering initial view or activating language server based on the presence of BI data. --- .../ballerina-extension/src/stateMachine.ts | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts index b01ab4274fe..c830b6a17d0 100644 --- a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts +++ b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts @@ -66,16 +66,30 @@ const stateMachine = createMachine( initialize: { invoke: { src: checkForProjects, - onDone: { - target: "renderInitialView", - actions: assign({ - isBI: (context, event) => event.data.isBI, - projectUri: (context, event) => event.data.projectPath, - scope: (context, event) => event.data.scope, - org: (context, event) => event.data.orgName, - package: (context, event) => event.data.packageName, - }) - }, + onDone: [ + { + target: "renderInitialView", + cond: (context, event) => event.data && event.data.isBI, + actions: assign({ + isBI: (context, event) => event.data.isBI, + projectUri: (context, event) => event.data.projectPath, + scope: (context, event) => event.data.scope, + org: (context, event) => event.data.orgName, + package: (context, event) => event.data.packageName, + }) + }, + { + target: "activateLS", + cond: (context, event) => event.data && event.data.isBI === false, + actions: assign({ + isBI: (context, event) => event.data.isBI, + projectUri: (context, event) => event.data.projectPath, + scope: (context, event) => event.data.scope, + org: (context, event) => event.data.orgName, + package: (context, event) => event.data.packageName, + }) + } + ], onError: { target: "renderInitialView" } @@ -547,7 +561,7 @@ async function handleSingleWorkspace(workspaceURI: any) { console.error("No BI enabled workspace found"); } - return { isBI, projectPath, scope, orgName, packageName }; + return { isBI, projectPath, scope, orgName, packageName }; } function setBIContext(isBI: boolean) { From fa5ec636d594172f00d84603d979af82566ec29e Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Sat, 19 Jul 2025 02:25:43 +0530 Subject: [PATCH 047/349] Refactor natural programming activator command registration and improving code structure. --- .../features/natural-programming/activator.ts | 54 +++++++++++++------ .../nl-code-action-provider.ts | 23 +------- 2 files changed, 40 insertions(+), 37 deletions(-) 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 4a73270a547..a1aecbde09f 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/activator.ts @@ -20,13 +20,16 @@ import vscode from 'vscode'; import { ENABLE_BACKGROUND_DRIFT_CHECK } from "../../core/preferences"; import { debounce } from 'lodash'; import { StateMachine } from "../../stateMachine"; -import { addConfigFile, getConfigFilePath, getLLMDiagnostics} from "./utils"; -import { NLCodeActionProvider, showTextOptions } from './nl-code-action-provider'; +import { addConfigFile, getConfigFilePath, getLLMDiagnostics } from "./utils"; +import { NLCodeActionProvider } from './nl-code-action-provider'; import { BallerinaExtension } from 'src/core'; -import { PROGRESS_BAR_MESSAGE_FOR_DRIFT, WARNING_MESSAGE, WARNING_MESSAGE_DEFAULT, - MONITERED_EXTENSIONS - } from './constants'; - import { isSupportedSLVersion } from "../../utils"; +import { + PROGRESS_BAR_MESSAGE_FOR_DRIFT, WARNING_MESSAGE, WARNING_MESSAGE_DEFAULT, + MONITERED_EXTENSIONS, + COMMAND_SHOW_TEXT +} from './constants'; +import { isSupportedSLVersion } from "../../utils"; +import { CustomDiagnostic } from './custom-diagnostics'; let diagnosticCollection: vscode.DiagnosticCollection; const BALLERINA_UPDATE_13 = 2201130; @@ -49,30 +52,30 @@ export function activate(ballerinaExtInstance: BallerinaExtension) { if (result == null) { return; } - + if (result > 400 && result < 500) { vscode.window.showWarningMessage(WARNING_MESSAGE); return; } vscode.window.showWarningMessage(WARNING_MESSAGE_DEFAULT); }, 600000); - + vscode.workspace.onDidChangeTextDocument(async event => { const filePath = event.document.uri.fsPath; // Get the file path const fileExtension = filePath.substring(filePath.lastIndexOf('.')); // Extract the file extension - + // Check if the file extension is in the monitoredExtensions array if (MONITERED_EXTENSIONS.includes(fileExtension)) { debouncedGetLLMDiagnostics(); } }, null, ballerinaExtInstance.context.subscriptions); - + vscode.workspace.onDidDeleteFiles(async event => { let isMoniteredFileGotDeleted = false; event.files.forEach(file => { const filePath = file.fsPath; // Get the file path const fileExtension = filePath.substring(filePath.lastIndexOf('.')); // Extract the file extension - + // Check if the file extension is in the monitoredExtensions array if (MONITERED_EXTENSIONS.includes(fileExtension)) { isMoniteredFileGotDeleted = true; @@ -92,9 +95,28 @@ export function activate(ballerinaExtInstance: BallerinaExtension) { }) ); - ballerinaExtInstance.context.subscriptions.push(showTextOptions); + ballerinaExtInstance.context.subscriptions.push( + vscode.commands.registerCommand(COMMAND_SHOW_TEXT, async (document: vscode.TextDocument, + diagnostic: CustomDiagnostic, newText: string, range: vscode.Range) => { + const editor = vscode.window.activeTextEditor; + if (!editor) { + vscode.window.showErrorMessage("No active editor found."); + return; + } + + const textToReplace = document.getText(range); + + // Create a Git conflict-like view with "|||||||", "HEAD" and "=======" + const conflictText = `<<<<<<< HEAD\n${textToReplace}\n=======\n${newText}\n>>>>>>>\n`; + + const edit = new vscode.WorkspaceEdit(); + edit.replace(document.uri, range, conflictText); + await vscode.workspace.applyEdit(edit); + vscode.window.showInformationMessage('Changes added'); + }) + ); - vscode.commands.registerCommand("ballerina.verifyDocs", async (...args: any[]) => { + vscode.commands.registerCommand("ballerina.verifyDocs", async (...args: any[]) => { await vscode.window.withProgress( { location: vscode.ProgressLocation.Notification, @@ -102,7 +124,7 @@ export function activate(ballerinaExtInstance: BallerinaExtension) { cancellable: false, }, async () => { - const result: number|null = await getLLMDiagnostics(projectPath, diagnosticCollection); + const result: number | null = await getLLMDiagnostics(projectPath, diagnosticCollection); if (result == null) { return; } @@ -119,8 +141,8 @@ export function activate(ballerinaExtInstance: BallerinaExtension) { vscode.commands.registerCommand("ballerina.configureDefaultModelForNaturalFunctions", async (...args: any[]) => { const configPath = await getConfigFilePath(ballerinaExtInstance, projectPath); if (configPath != null) { - const isNaturalFunctionsAvailableInBallerinaOrg = - isSupportedSLVersion(ballerinaExtInstance, BALLERINA_UPDATE_13); + const isNaturalFunctionsAvailableInBallerinaOrg = + isSupportedSLVersion(ballerinaExtInstance, BALLERINA_UPDATE_13); addConfigFile(configPath, isNaturalFunctionsAvailableInBallerinaOrg); } }); diff --git a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/nl-code-action-provider.ts b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/nl-code-action-provider.ts index 3e779b3a35b..7188100d8f0 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/nl-code-action-provider.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/nl-code-action-provider.ts @@ -18,7 +18,7 @@ import * as vscode from 'vscode'; import { CustomDiagnostic } from './custom-diagnostics'; -import {DRIFT_DIAGNOSTIC_ID, COMMAND_SHOW_TEXT} from "./constants"; +import { DRIFT_DIAGNOSTIC_ID, COMMAND_SHOW_TEXT } from "./constants"; import { result } from 'lodash'; const UPDATE_CODE_ACTION_CONTENT = "Update code to match docs"; @@ -37,7 +37,7 @@ export class NLCodeActionProvider implements vscode.CodeActionProvider { if (diagnostic instanceof CustomDiagnostic) { const customDiagnostic = diagnostic as CustomDiagnostic; - if (customDiagnostic.data.id == DRIFT_DIAGNOSTIC_ID){ + if (customDiagnostic.data.id == DRIFT_DIAGNOSTIC_ID) { const implementationChangeSolution = customDiagnostic.data.implementationChangeSolution; const docChangeSolution = customDiagnostic.data.docChangeSolution; @@ -70,22 +70,3 @@ export class NLCodeActionProvider implements vscode.CodeActionProvider { return actions; } } - -export const showTextOptions = vscode.commands.registerCommand(COMMAND_SHOW_TEXT, async (document: vscode.TextDocument, - diagnostic: CustomDiagnostic, newText: string, range: vscode.Range) => { - const editor = vscode.window.activeTextEditor; - if (!editor) { - vscode.window.showErrorMessage("No active editor found."); - return; - } - - const textToReplace = document.getText(range); - - // Create a Git conflict-like view with "|||||||", "HEAD" and "=======" - const conflictText = `<<<<<<< HEAD\n${textToReplace}\n=======\n${newText}\n>>>>>>>\n`; - - const edit = new vscode.WorkspaceEdit(); - edit.replace(document.uri, range, conflictText); - await vscode.workspace.applyEdit(edit); - vscode.window.showInformationMessage('Changes added'); -}); From a112884719f9e17352db20c95813da589aca532f Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Sat, 19 Jul 2025 02:26:05 +0530 Subject: [PATCH 048/349] Fix string type declaration in string.bal and update editor test assertions for string splitter functionality. --- .../ballerina-extension/test/data/string.bal | 2 +- .../test/editor/editor-support.test.ts | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/test/data/string.bal b/workspaces/ballerina/ballerina-extension/test/data/string.bal index bbece422f38..60d902b47f8 100644 --- a/workspaces/ballerina/ballerina-extension/test/data/string.bal +++ b/workspaces/ballerina/ballerina-extension/test/data/string.bal @@ -1 +1 @@ -strixng st = "saample giga string"; +string st = "saample giga string"; diff --git a/workspaces/ballerina/ballerina-extension/test/editor/editor-support.test.ts b/workspaces/ballerina/ballerina-extension/test/editor/editor-support.test.ts index 178599ffb77..0e1fa710cd4 100644 --- a/workspaces/ballerina/ballerina-extension/test/editor/editor-support.test.ts +++ b/workspaces/ballerina/ballerina-extension/test/editor/editor-support.test.ts @@ -22,12 +22,7 @@ import { assert } from "chai"; const PROJECT_ROOT = join(__dirname, '..', '..', '..', 'test', 'data'); -suite("Editor Tests", function () { - suiteTeardown((done) => { - commands.executeCommand('ballerina.stopLangServer'); - done(); - }); - +suite.only("Editor Tests", function () { test("Test string splitter", function (done): void { const uri = Uri.file(join(PROJECT_ROOT, 'string.bal')); @@ -40,7 +35,10 @@ suite("Editor Tests", function () { }); await wait(5000); - assert.strictEqual(editor.document.getText(), 'string st = "sample " +\n"giga string";\n', "Invalid string splitter"); + const actualText = editor.document.getText(); + console.log('Actual text:', JSON.stringify(actualText)); + console.log('Expected text:', JSON.stringify('string st = "saample" +\n" giga string";\n')); + assert.strictEqual(actualText, 'string st = "saample" +\n" giga string";\n', "Invalid string splitter"); done(); }); }); From 6dc10630acd0f36e74d34d9c3724e1033889431a Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Sat, 19 Jul 2025 02:30:24 +0530 Subject: [PATCH 049/349] Remove exclusive test suite flag for editor tests to ensure all tests are executed. --- .../ballerina-extension/test/editor/editor-support.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/test/editor/editor-support.test.ts b/workspaces/ballerina/ballerina-extension/test/editor/editor-support.test.ts index 0e1fa710cd4..fc6ef47957e 100644 --- a/workspaces/ballerina/ballerina-extension/test/editor/editor-support.test.ts +++ b/workspaces/ballerina/ballerina-extension/test/editor/editor-support.test.ts @@ -22,7 +22,7 @@ import { assert } from "chai"; const PROJECT_ROOT = join(__dirname, '..', '..', '..', 'test', 'data'); -suite.only("Editor Tests", function () { +suite("Editor Tests", function () { test("Test string splitter", function (done): void { const uri = Uri.file(join(PROJECT_ROOT, 'string.bal')); From 0b2497b3d4e08066a136a636072baf2a2d0acd36 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Sat, 19 Jul 2025 03:05:11 +0530 Subject: [PATCH 050/349] Update @vscode/test-electron dependency to version 2.5.2 and enhance AI Code Generator tests with workspace setup improvements. Add new Ballerina.toml and main.bal files for testing. --- common/config/rush/pnpm-lock.yaml | 2 +- .../ballerina-extension/package.json | 2 +- .../test/ai/evals/code/code.test.ts | 13 ++- .../test/data/aiTest/Ballerina.toml | 8 ++ .../test/data/aiTest/main.bal | 0 .../ballerina-extension/test/lib/index.ts | 93 ++++++++++++++----- 6 files changed, 87 insertions(+), 31 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/test/data/aiTest/Ballerina.toml create mode 100644 workspaces/ballerina/ballerina-extension/test/data/aiTest/main.bal diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index db982e67309..84db4551c63 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -134,7 +134,7 @@ importers: specifier: ^4.14.200 version: 4.17.17 '@vscode/test-electron': - specifier: ^2.4.0 + specifier: ^2.5.2 version: 2.5.2 '@vscode/vsce': specifier: ^2.22.0 diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 1401408a45a..65de410a623 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -1098,7 +1098,7 @@ "@types/lodash": "^4.14.200", "@ai-sdk/anthropic": "^1.2.12", "ai": "^4.3.16", - "@vscode/test-electron": "^2.4.0", + "@vscode/test-electron": "^2.5.2", "@vscode/vsce": "^2.22.0", "@wso2/ballerina-core": "workspace:*", "@wso2/ballerina-visualizer": "workspace:*", 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 05bd6317c10..7320e4d5795 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 @@ -108,11 +108,14 @@ function createTestEventHandler(): { handler: CopilotEventHandler; getResult: () } suite.only("AI Code Generator Tests Suite", () => { - test("basic workspace test", async function () { - this.timeout(30000); - //TODO: Set new langserver jar - const PROJECT_ROOT = "/Users/wso2/repos/ballerina-copilot/evals/project_samples/fresh_bi_package"; + // Close all the open workspace folders before running the test + suiteSetup(async function () { + await commands.executeCommand("workbench.action.closeAllEditors"); + }); + + test("basic workspace test", async function () { + const PROJECT_ROOT = "/Users/anjanash/Desktop/Office/OpenSource/vscode-extensions/workspaces/ballerina/ballerina-extension/test/data/aiTest"; const success = workspace.updateWorkspaceFolders(0, 0, { uri: Uri.file(PROJECT_ROOT), @@ -156,7 +159,7 @@ suite.only("AI Code Generator Tests Suite", () => { }); }); -// suite.only("AI Code Generator Tests Suite", () => { +// suite("AI Code Generator Tests Suite", () => { // // let langClient: ExtendedLangClient; // // suiteSetup(async (done): Promise => { diff --git a/workspaces/ballerina/ballerina-extension/test/data/aiTest/Ballerina.toml b/workspaces/ballerina/ballerina-extension/test/data/aiTest/Ballerina.toml new file mode 100644 index 00000000000..01f08b5cc32 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/data/aiTest/Ballerina.toml @@ -0,0 +1,8 @@ +[package] +org = "anjanash" +name = "aiTest" +version = "0.1.0" +distribution = "2201.13.0-m2" + +[build-options] +observabilityIncluded = true diff --git a/workspaces/ballerina/ballerina-extension/test/data/aiTest/main.bal b/workspaces/ballerina/ballerina-extension/test/data/aiTest/main.bal new file mode 100644 index 00000000000..e69de29bb2d diff --git a/workspaces/ballerina/ballerina-extension/test/lib/index.ts b/workspaces/ballerina/ballerina-extension/test/lib/index.ts index 2fceaa29c4d..f493725fd35 100644 --- a/workspaces/ballerina/ballerina-extension/test/lib/index.ts +++ b/workspaces/ballerina/ballerina-extension/test/lib/index.ts @@ -16,9 +16,10 @@ * under the License. */ -import { downloadAndUnzipVSCode, resolveCliArgsFromVSCodeExecutablePath } from '@vscode/test-electron'; +import { downloadAndUnzipVSCode, resolveCliPathFromVSCodeExecutablePath } from '@vscode/test-electron'; import { defaultCachePath } from '@vscode/test-electron/out/download'; import { TestOptions } from '@vscode/test-electron/out/runTest'; +import { killTree } from '@vscode/test-electron/out/util'; import * as cp from 'child_process'; import * as path from 'path'; const packageJson = require('../../../package.json') @@ -30,8 +31,8 @@ const packageJson = require('../../../package.json') */ export async function runTests(options: TestOptions): Promise { if (!options.vscodeExecutablePath) { - options.vscodeExecutablePath = await downloadAndUnzipVSCode(options); - const [cli, ...args] = resolveCliArgsFromVSCodeExecutablePath(options.vscodeExecutablePath) + options.vscodeExecutablePath = await downloadAndUnzipVSCode(); + const [cli, ...args] = resolveCliPathFromVSCodeExecutablePath(options.vscodeExecutablePath) if (packageJson.extensionDependencies) { for (const extensionId of packageJson.extensionDependencies) { cp.spawnSync(cli, [...args, '--install-extension', extensionId], { @@ -41,21 +42,25 @@ export async function runTests(options: TestOptions): Promise { } } } + if (!options.vscodeExecutablePath) { + options.vscodeExecutablePath = await downloadAndUnzipVSCode(options); + } let args = [ // https://github.com/microsoft/vscode/issues/84238 '--no-sandbox', + // https://github.com/microsoft/vscode-test/issues/221 + '--disable-gpu-sandbox', // https://github.com/microsoft/vscode-test/issues/120 '--disable-updates', '--skip-welcome', '--skip-release-notes', '--disable-workspace-trust', - '--extensionTestsPath=' + options.extensionTestsPath + '--extensionTestsPath=' + options.extensionTestsPath, ]; if (Array.isArray(options.extensionDevelopmentPath)) { - args.push(...options.extensionDevelopmentPath.map(devPath => - `--extensionDevelopmentPath=${devPath}`)); + args.push(...options.extensionDevelopmentPath.map((devPath) => `--extensionDevelopmentPath=${devPath}`)); } else { args.push(`--extensionDevelopmentPath=${options.extensionDevelopmentPath}`); } @@ -90,6 +95,8 @@ function hasArg(argName: string, argList: readonly string[]) { return argList.some(a => a === `--${argName}` || a.startsWith(`--${argName}=`)); } +const SIGINT = 'SIGINT'; + async function innerRunTests( executable: string, args: string[], @@ -97,17 +104,33 @@ async function innerRunTests( [key: string]: string | undefined; } ): Promise { - return new Promise((resolve, reject) => { - const fullEnv = Object.assign({}, process.env, testRunnerEnv); - const cmd = cp.spawn(executable, args, { env: fullEnv }); + const fullEnv = Object.assign({}, process.env, testRunnerEnv); + const shell = process.platform === 'win32'; + const cmd = cp.spawn(shell ? `"${executable}"` : executable, args, { env: fullEnv, shell }); + + let exitRequested = false; + const ctrlc1 = () => { + process.removeListener(SIGINT, ctrlc1); + process.on(SIGINT, ctrlc2); + console.log('Closing VS Code gracefully. Press Ctrl+C to force close.'); + exitRequested = true; + cmd.kill(SIGINT); // this should cause the returned promise to resolve + }; + + const ctrlc2 = () => { + console.log('Closing VS Code forcefully.'); + process.removeListener(SIGINT, ctrlc2); + exitRequested = true; + killTree(cmd.pid!, true); + }; + + const prom = new Promise((resolve, reject) => { + if (cmd.pid) { + process.on(SIGINT, ctrlc1); + } - cmd.stdout.on('data', function (data) { - console.log(data.toString()); - }); - - cmd.stderr.on('data', function (data) { - console.error(data.toString()); - }); + cmd.stdout.on('data', (d) => process.stdout.write(d)); + cmd.stderr.on('data', (d) => process.stderr.write(d)); cmd.on('error', function (data) { console.log('Test error: ' + data.toString()); @@ -121,18 +144,40 @@ async function innerRunTests( finished = true; console.log(`Exit code: ${code ?? signal}`); - if (code === null) { - reject(signal); - } else if (code !== 0) { - reject('Failed'); + // fix: on windows, it seems like these descriptors can linger for an + // indeterminate amount of time, causing the process to hang. + cmd.stdout.destroy(); + cmd.stderr.destroy(); + + if (code !== 0) { + reject(new TestRunFailedError(code ?? undefined, signal ?? undefined)); } else { - console.log('Done\n'); - resolve(code ?? -1); + resolve(0); } } cmd.on('close', onProcessClosed); - cmd.on('exit', onProcessClosed); }); -} \ No newline at end of file + + let code: number; + try { + code = await prom; + } finally { + process.removeListener(SIGINT, ctrlc1); + process.removeListener(SIGINT, ctrlc2); + } + + // exit immediately if we handled a SIGINT and no one else did + if (exitRequested && process.listenerCount(SIGINT) === 0) { + process.exit(1); + } + + return code; +} + +export class TestRunFailedError extends Error { + constructor(public readonly code: number | undefined, public readonly signal: string | undefined) { + super(signal ? `Test run terminated with signal ${signal}` : `Test run failed with code ${code}`); + } +} From c9b1e34b38371f49cf0b0e2a34b11f251e7f5fce Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Sat, 19 Jul 2025 11:06:42 +0530 Subject: [PATCH 051/349] Fix model variable name assignment in AIChatAgentWizard --- .../src/views/BI/AIChatAgent/AIChatAgentWizard.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx index 4239831781c..ed8977aa6ee 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx @@ -228,11 +228,12 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { console.log(">>> agent service sourceCode", sourceCode); console.log(">>> newArtifact", newArtifact); // save model node + const modelVarName = `_${agentName}Model`; + defaultModelNode.properties.variable.value = modelVarName; const modelResponse = await rpcClient .getBIDiagramRpcClient() .getSourceCode({ filePath: agentFilePath.current, flowNode: defaultModelNode }); console.log(">>> modelResponse getSourceCode", { modelResponse }); - const modelVarName = defaultModelNode.properties.variable.value as string; // wait 2 seconds (wait until LS is updated) console.log(">>> wait 2 seconds"); From 70bef1c5477ed7edaa56dfe863e78e1df124275b Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Sat, 19 Jul 2025 13:10:00 +0530 Subject: [PATCH 052/349] Refactor getNodeTemplate usage across AIChatAgent components and utils --- .../BI/AIChatAgent/AIChatAgentWizard.tsx | 22 ++++--------------- .../BI/AIChatAgent/MemoryManagerConfig.tsx | 14 +++--------- .../src/views/BI/AIChatAgent/ModelConfig.tsx | 14 ++---------- .../src/views/BI/AIChatAgent/NewAgent.tsx | 22 ++++--------------- .../src/views/BI/AIChatAgent/utils.ts | 17 +++++++++++++- 5 files changed, 29 insertions(+), 60 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx index ed8977aa6ee..37369262ac5 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx @@ -17,7 +17,7 @@ */ import { useEffect, useRef, useState } from 'react'; -import { CodeData, EVENT_TYPE, FlowNode, LinePosition, ListenerModel } from '@wso2/ballerina-core'; +import { EVENT_TYPE, FlowNode, LinePosition, ListenerModel } from '@wso2/ballerina-core'; import { View, ViewContent, TextField, Button, Typography } from '@wso2/ui-toolkit'; import styled from '@emotion/styled'; import { useRpcContext } from '@wso2/ballerina-rpc-client'; @@ -27,7 +27,7 @@ import { TitleBar } from '../../../components/TitleBar'; import { TopNavigationBar } from '../../../components/TopNavigationBar'; import { RelativeLoader } from '../../../components/RelativeLoader'; import { FormHeader } from '../../../components/FormHeader'; -import { getAgentOrg } from './utils'; +import { getAgentOrg, getNodeTemplate } from './utils'; import { cloneDeep } from 'lodash'; import { AI, BALLERINA } from '../../../constants'; @@ -123,20 +123,6 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { }); }, []); - const getNodeTemplate = async ( - codeData: CodeData, - filePath: string, - position: LinePosition = { line: 0, offset: 0 } - ) => { - const response = await rpcClient.getBIDiagramRpcClient().getNodeTemplate({ - position: position, - filePath: filePath, - id: codeData, - }); - console.log(">>> get node template response", response); - return response?.flowNode; - }; - const fetchAgentNode = async () => { // get the agent node const allAgents = await rpcClient.getAIAgentRpcClient().getAllAgents({ filePath: agentFilePath.current, orgName: agentOrg.current }); @@ -147,7 +133,7 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { } const agentCodeData = allAgents.agents.at(0); // get agent node template - const agentNodeTemplate = await getNodeTemplate(agentCodeData, agentFilePath.current); + const agentNodeTemplate = await getNodeTemplate(rpcClient, agentCodeData, agentFilePath.current); setAgentNode(agentNodeTemplate); // get all llm models @@ -162,7 +148,7 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { return; } // get model node template - const modelNodeTemplate = await getNodeTemplate(defaultModel, agentFilePath.current); + const modelNodeTemplate = await getNodeTemplate(rpcClient, defaultModel, agentFilePath.current); setDefaultModelNode(modelNodeTemplate); }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/MemoryManagerConfig.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/MemoryManagerConfig.tsx index 85eb18b2e21..039586c3cce 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/MemoryManagerConfig.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/MemoryManagerConfig.tsx @@ -26,7 +26,7 @@ import ConfigForm from "./ConfigForm"; import { Dropdown } from "@wso2/ui-toolkit"; import { cloneDeep } from "lodash"; import { RelativeLoader } from "../../../components/RelativeLoader"; -import { getAgentFilePath, getAgentOrg } from "./utils"; +import { getAgentFilePath, getAgentOrg, getNodeTemplate } from "./utils"; const Container = styled.div` padding: 16px; @@ -167,6 +167,7 @@ export function MemoryManagerConfig(props: MemoryManagerConfigProps): JSX.Elemen setSelectedMemoryManagerCodeData(memoryManagerCodeData); const selectedMemoryManagerNodeTemplate = await getNodeTemplate( + rpcClient, memoryManagerCodeData, agentFilePath.current ); @@ -193,6 +194,7 @@ export function MemoryManagerConfig(props: MemoryManagerConfigProps): JSX.Elemen const fetchMemoryManagerNodeTemplate = async (memoryManagerCodeData: CodeData) => { setLoading(true); const selectedMemoryManagerNodeTemplate = await getNodeTemplate( + rpcClient, memoryManagerCodeData, agentFilePath.current ); @@ -209,16 +211,6 @@ export function MemoryManagerConfig(props: MemoryManagerConfigProps): JSX.Elemen setLoading(false); }; - const getNodeTemplate = async (codeData: CodeData, filePath: string) => { - const response = await rpcClient.getBIDiagramRpcClient().getNodeTemplate({ - position: { line: 0, offset: 0 }, - filePath: filePath, - id: codeData, - }); - console.log(">>> get node template response", response); - return response?.flowNode; - }; - const handleOnSave = async (data: FormField[], rawData: FormValues) => { console.log(">>> save value", { data, rawData }); setSavingForm(true); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx index 9b7c501b083..bd03c916351 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx @@ -26,7 +26,7 @@ import ConfigForm from "./ConfigForm"; import { Dropdown } from "@wso2/ui-toolkit"; import { cloneDeep } from "lodash"; import { RelativeLoader } from "../../../components/RelativeLoader"; -import { getAgentFilePath, getAgentOrg } from "./utils"; +import { getAgentFilePath, getAgentOrg, getNodeTemplate } from "./utils"; import { BALLERINA, BALLERINAX, GET_DEFAULT_MODEL_PROVIDER, WSO2_MODEL_PROVIDER, PROVIDER_NAME_MAP } from "../../../constants"; const Container = styled.div` @@ -180,7 +180,7 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { selectedModelFlowNode.current = cloneDeep(selectedModel); nodeProperties = selectedModel?.properties; } else { - const modelNodeTemplate = await getNodeTemplate(modelCodeData, agentFilePath.current); + const modelNodeTemplate = await getNodeTemplate(rpcClient, modelCodeData, agentFilePath.current); console.log(">>> selected model node template", { modelNodeTemplate, modelCodeData }); selectedModelFlowNode.current = cloneDeep(modelNodeTemplate); nodeProperties = modelNodeTemplate.properties; @@ -199,16 +199,6 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { setLoading(false); }; - const getNodeTemplate = async (codeData: CodeData, filePath: string) => { - const response = await rpcClient.getBIDiagramRpcClient().getNodeTemplate({ - position: { line: 0, offset: 0 }, - filePath: filePath, - id: codeData, - }); - console.log(">>> get node template response", response); - return response?.flowNode; - }; - const handleOnSave = async (data: FormField[], rawData: FormValues) => { console.log(">>> save value", { data, rawData }); setSavingForm(true); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx index 3c5acbd8cc8..324175243f3 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx @@ -18,7 +18,7 @@ import { useEffect, useRef, useState } from "react"; import styled from "@emotion/styled"; -import { CodeData, FlowNode, LinePosition, LineRange, NodeProperties } from "@wso2/ballerina-core"; +import { FlowNode, LinePosition, LineRange, NodeProperties } from "@wso2/ballerina-core"; import { FormField, FormValues } from "@wso2/ballerina-side-panel"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { convertConfig } from "../../../utils/bi"; @@ -26,7 +26,7 @@ import { URI, Utils } from "vscode-uri"; import ConfigForm from "./ConfigForm"; import { cloneDeep } from "lodash"; import { RelativeLoader } from "../../../components/RelativeLoader"; -import { getAgentOrg } from "./utils"; +import { getAgentOrg, getNodeTemplate } from "./utils"; import { AI, BALLERINA } from "../../../constants"; const Container = styled.div` @@ -108,7 +108,7 @@ export function NewAgent(props: NewAgentProps): JSX.Element { } const agentCodeData = allAgents.agents.at(0); // get agent node template - const agentNodeTemplate = await getNodeTemplate(agentCodeData, agentFilePath.current); + const agentNodeTemplate = await getNodeTemplate(rpcClient, agentCodeData, agentFilePath.current); setAgentNode(agentNodeTemplate); // get all llm models @@ -123,7 +123,7 @@ export function NewAgent(props: NewAgentProps): JSX.Element { return; } // get model node template - const modelNodeTemplate = await getNodeTemplate(defaultModel, agentFilePath.current); + const modelNodeTemplate = await getNodeTemplate(rpcClient, defaultModel, agentFilePath.current); setDefaultModelNode(modelNodeTemplate); // get agent call node template @@ -286,20 +286,6 @@ export function NewAgent(props: NewAgentProps): JSX.Element { setSavingForm(false); }; - const getNodeTemplate = async ( - codeData: CodeData, - filePath: string, - position: LinePosition = { line: 0, offset: 0 } - ) => { - const response = await rpcClient.getBIDiagramRpcClient().getNodeTemplate({ - position: position, - filePath: filePath, - id: codeData, - }); - console.log(">>> get node template response", response); - return response?.flowNode; - }; - return ( {loading && ( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts index fe67ed00373..b25d60ca135 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts @@ -16,11 +16,26 @@ * under the License. */ -import { FlowNode } from "@wso2/ballerina-core"; +import { BINodeTemplateRequest, CodeData, FlowNode, LinePosition } from "@wso2/ballerina-core"; import { BallerinaRpcClient } from "@wso2/ballerina-rpc-client"; import { cloneDeep } from "lodash"; import { URI, Utils } from "vscode-uri"; +export const getNodeTemplate = async ( + rpcClient: BallerinaRpcClient, + codeData: CodeData, + filePath: string, + position: LinePosition = { line: 0, offset: 0 } +) => { + const response = await rpcClient.getBIDiagramRpcClient().getNodeTemplate({ + position: position, + filePath: filePath, + id: codeData, + }); + console.log(">>> get node template response", response); + return response?.flowNode; +}; + export const getAgentOrg = async (rpcClient: BallerinaRpcClient) => { const filePath = await rpcClient.getVisualizerLocation(); const agentOrgResponse = await rpcClient From 7f0f297dcea2bbc9728c2c44b93b27a522611b40 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Sat, 19 Jul 2025 14:32:33 +0530 Subject: [PATCH 053/349] Remove unused properties from updatedAgentNode in AIChatAgentWizard --- .../src/views/BI/AIChatAgent/AIChatAgentWizard.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx index 37369262ac5..c6b478763a0 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx @@ -232,8 +232,6 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { updatedAgentNode.properties.systemPrompt.value = systemPromptValue; updatedAgentNode.properties.model.value = modelVarName; updatedAgentNode.properties.tools.value = []; - updatedAgentNode.properties.verbose.value = "false"; - updatedAgentNode.properties.maxIter.value = "0"; updatedAgentNode.properties.variable.value = agentVarName; const agentResponse = await rpcClient From d0891414a02d4cf1175d3bb85f8722034e0b694b Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Sat, 19 Jul 2025 18:25:16 +0530 Subject: [PATCH 054/349] Fix import statement in extended-language-client.ts by adding a missing comma for consistency. --- .../ballerina-extension/src/core/extended-language-client.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 44c9b6e90db..e03e023a3c0 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts @@ -230,7 +230,7 @@ import { CopilotAllLibrariesRequest, CopilotFilterLibrariesResponse, CopilotFilterLibrariesRequest, - GetConfigVariableNodeTemplateRequest + GetConfigVariableNodeTemplateRequest, FunctionFromSourceRequest, FunctionFromSourceResponse } from "@wso2/ballerina-core"; From a9211c2785fc180c24c07ee2b61a06c630cbd4cf Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Sat, 19 Jul 2025 21:38:29 +0530 Subject: [PATCH 055/349] Library related prompt improvements and logs --- .../src/features/ai/service/code/code.ts | 4 +-- .../src/features/ai/service/libs/funcs.ts | 28 ++++++++++++++++++- .../src/features/ai/service/libs/libs.ts | 22 +++++++-------- 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index e29a5aae746..b51776a3ff7 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -233,7 +233,7 @@ Important reminders: - 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. +- 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. @@ -328,7 +328,7 @@ export async function repairCode(params: RepairParams): Promise }, ]; - const { text } = await generateText({ + const { text, usage, providerMetadata } = await generateText({ model: anthropic(ANTHROPIC_SONNET_4), maxTokens: 4096 * 4, temperature: 0, diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts index 9781b46af64..860ba6bf94f 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts @@ -122,6 +122,8 @@ async function getRequiredFunctions(libraries: string[], prompt: string, librari const largeLibs = libraryList.filter(lib => getClientFunctionCount(lib.clients) >= 100); const smallLibs = libraryList.filter(lib => !largeLibs.includes(lib)); + console.log(`[Parallel Execution Plan] Large libraries: ${largeLibs.length} (${largeLibs.map(lib => lib.name).join(', ')}), Small libraries: ${smallLibs.length} (${smallLibs.map(lib => lib.name).join(', ')})`); + // Create promises for large libraries (each processed individually) const largeLiberiesPromises: Promise[] = largeLibs.map(funcItem => getSuggestedFunctions(prompt, [funcItem]) @@ -132,24 +134,40 @@ async function getRequiredFunctions(libraries: string[], prompt: string, librari ? getSuggestedFunctions(prompt, smallLibs) : Promise.resolve([]); + console.log(`[Parallel Execution Start] Starting ${largeLiberiesPromises.length} large library requests + 1 small libraries bulk request`); + const parallelStartTime = Date.now(); + // Wait for all promises to complete const [smallLibResults, ...largeLibResults] = await Promise.all([ smallLibrariesPromise, ...largeLiberiesPromises ]); + const parallelEndTime = Date.now(); + const parallelDuration = (parallelEndTime - parallelStartTime) / 1000; + + console.log(`[Parallel Execution Complete] Total parallel execution time: ${parallelDuration}s`); + // Flatten the results const collectiveResp: GetFunctionResponse[] = [ ...smallLibResults, ...largeLibResults.flat() ]; const endTime = Date.now(); - console.log(`Time taken to get the functions: ${(endTime - startTime) / 1000} seconds`); + const totalDuration = (endTime - startTime) / 1000; + + console.log(`[getRequiredFunctions Complete] Total function count: ${collectiveResp.reduce((total, lib) => total + (lib.clients?.reduce((clientTotal, client) => clientTotal + client.functions.length, 0) || 0) + (lib.functions?.length || 0), 0)}, Total duration: ${totalDuration}s, Preparation time: ${(parallelStartTime - startTime) / 1000}s, Parallel time: ${parallelDuration}s`); return collectiveResp; } async function getSuggestedFunctions(prompt: string, libraryList: GetFunctionsRequest[]): Promise { + const startTime = Date.now(); + const libraryNames = libraryList.map(lib => lib.name).join(', '); + const functionCount = libraryList.reduce((total, lib) => total + getClientFunctionCount(lib.clients) + (lib.functions?.length || 0), 0); + + console.log(`[AI Request Start] Libraries: [${libraryNames}], Function Count: ${functionCount}`); + const getLibSystemPrompt = "You are an AI assistant tasked with filtering and removing unwanted functions and clients from a given set of libraries and clients based on a user query. Your goal is to return only the relevant libraries, clients, and functions that match the user's needs."; const getLibUserPrompt = ` You will be provided with a list of libraries, clients, and their functions and user query. @@ -190,9 +208,17 @@ Now, based on the provided libraries, clients, and functions, and the user query }); const libList = object as GetFunctionsResponse; + const endTime = Date.now(); + const duration = (endTime - startTime) / 1000; + + console.log(`[AI Request Complete] Libraries: [${libraryNames}], Duration: ${duration}s, Selected Functions: ${libList.libraries.reduce((total, lib) => total + (lib.clients?.reduce((clientTotal, client) => clientTotal + client.functions.length, 0) || 0) + (lib.functions?.length || 0), 0)}`); + printSelectedFunctions(libList.libraries); return libList.libraries; } catch (error) { + const endTime = Date.now(); + const duration = (endTime - startTime) / 1000; + console.error(`[AI Request Failed] Libraries: [${libraryNames}], Duration: ${duration}s, Error: ${error}`); throw new Error(`Failed to parse bulk functions response: ${error}`); } } 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 index e3721a8c2ee..66a0f048db8 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts @@ -66,21 +66,19 @@ export async function getSelectedLibraries(prompt: string, generationType: Gener const messages: CoreMessage[] = [ { role: "system", - content: getSystemPrompt(), + content: getSystemPrompt(allLibraries), providerOptions: { anthropic: { cacheControl: { type: "ephemeral" } }, }, }, { role: "user", - content: getUserPrompt(prompt, allLibraries, generationType), - providerOptions: { - anthropic: { cacheControl: { type: "ephemeral" } }, - }, + content: getUserPrompt(prompt, generationType), }, ]; + //TODO: Add thinking and test with claude haiku - //TODO: Check if we need to restrcuture prompt to optimize catching. + const startTime = Date.now(); const { object } = await generateObject({ model: anthropic(ANTHROPIC_HAIKU), maxTokens: 4096, @@ -89,19 +87,21 @@ export async function getSelectedLibraries(prompt: string, generationType: Gener 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(): 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.`; +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, libraryList: MinifiedLibrary[], generationType: GenerationType): string { +function getUserPrompt(prompt: string, generationType: GenerationType): string { return ` -# Library Context JSON -${JSON.stringify(libraryList)} # QUESTION ${prompt} From 2fcdb6e40929fd7e9d8cae7f86456c8960b1b3f6 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Sun, 20 Jul 2025 11:06:49 +0530 Subject: [PATCH 056/349] Add hack to display model icons in flow diagram for ballerinax ai modules --- .../ballerina-visualizer/src/constants.ts | 2 +- .../src/views/BI/FlowDiagram/index.tsx | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/constants.ts b/workspaces/ballerina/ballerina-visualizer/src/constants.ts index abbab12a826..9e1da4f81aa 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/constants.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/constants.ts @@ -35,6 +35,6 @@ export const PROVIDER_NAME_MAP: Record = { "ai.openai": "OpenAiProvider", "ai.azure": "AzureOpenAiProvider", "ai.mistral": "MistralAiProvider", - "ai.deepseek": "DeepSeekProvider", + "ai.deepseek": "DeepseekProvider", "ai.ollama": "OllamaProvider", }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index 949333f4e61..0ac109efa3e 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -61,6 +61,7 @@ import { removeAgentNode, removeToolFromAgentNode, } from "../AIChatAgent/utils"; +import { PROVIDER_NAME_MAP } from "../../../constants"; const Container = styled.div` width: 100%; @@ -141,6 +142,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { .getFlowModel() .then((model) => { if (model?.flowModel) { + updateAgentModelTypes(model?.flowModel); setModel(model.flowModel); onReady(model.flowModel.fileName); } @@ -152,6 +154,50 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }); }; + // Hack: Updates agent model types based on ModelProvider connections + // This is so that we render the icons for the models in the AgentCallNodeWidget + function updateAgentModelTypes(flowModel?: Flow) { + if (!flowModel || !Array.isArray(flowModel.connections) || !Array.isArray(flowModel.nodes)) return; + + const setModelType = (modelObj: any, providerName: string) => { + if (modelObj) { + modelObj.type = PROVIDER_NAME_MAP?.[providerName] || providerName; + } + }; + + flowModel.connections + .filter( + (connection) => + connection?.codedata?.object === "ModelProvider" || + connection?.codedata?.object === "OpenAiModelProvider" + ) + .forEach((connection) => { + const modelVarName = connection?.properties?.variable?.value; + const modelProviderName = connection?.codedata?.module; + if (!modelVarName || !modelProviderName) return; + + flowModel.nodes.forEach((node: FlowNode) => { + if ( + node?.codedata?.node === "AGENT_CALL" && + node?.metadata?.data?.model?.name === modelVarName + ) { + setModelType(node.metadata.data.model, modelProviderName); + } else if (node?.codedata?.node === "ERROR_HANDLER" && Array.isArray(node.branches)) { + node.branches.forEach((branch) => { + (branch.children ?? []).forEach((child) => { + if ( + child.codedata.node === "AGENT_CALL" && + child.metadata?.data?.model?.name === modelVarName + ) { + setModelType(child.metadata.data.model, modelProviderName); + } + }); + }); + } + }); + }); + } + useEffect(() => { if (model && selectedNodeRef.current?.codedata?.lineRange?.startLine && sidePanelView === SidePanelView.FORM) { const matchingNode = findNodeByStartLine(model, selectedNodeRef.current.codedata.lineRange.startLine); From 710a731168a61fe2f8113ee192ca8884e05f6bde Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Sun, 20 Jul 2025 11:07:04 +0530 Subject: [PATCH 057/349] Remove hack for AGENT_CALL node handling in transformCategories function --- .../src/views/BI/FlowDiagram/utils.ts | 31 ------------------- 1 file changed, 31 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/utils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/utils.ts index 469b40cd151..deaab7daf45 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/utils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/utils.ts @@ -68,37 +68,6 @@ export const transformCategories = (categories: Category[]): Category[] => { // remove agents from categories filteredCategories = filteredCategories.filter((category) => category.metadata.label !== "Agents"); - // find statement category - const statementCategory = filteredCategories.find((category) => category.metadata.label === "Statement"); - // find AGENT_CALL from statement category - const agentCallNode = statementCategory?.items?.find( - (item) => (item as AvailableNode).codedata?.node === "AGENT_CALL" - ) as AvailableNode; - if (agentCallNode?.codedata) { - // HACK: update agent call node until LS update with the new agent node - agentCallNode.codedata.object = "Agent"; - agentCallNode.codedata.parentSymbol = ""; - } else { - // TODO: this should remove once LS update with the new agent node - // add new item - statementCategory.items.push({ - codedata: { - module: "ai", - node: "AGENT_CALL", - object: "Agent", - org: "ballerinax", - parentSymbol: "", - symbol: "run", - version: "1.0.0", - }, - enabled: true, - metadata: { - label: "Agent", - description: "Add an AI Agent to the flow", - }, - }); - } - return filteredCategories; }; From 9543388eaed5da8ef3fcdac07e962923dd9810c2 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Mon, 21 Jul 2025 10:33:45 +0530 Subject: [PATCH 058/349] Fix server url input field name --- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index 0e998a73086..404e065d6f2 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -642,7 +642,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { )} - + {loadingMcpTools && ( @@ -712,7 +712,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { sx={{ flexGrow: 1, marginTop: 15 }} disabled={false} errorMsg={urlError} - label="Service URL" + label="Server URL" size={70} onChange={handleServiceUrlChange} placeholder="Enter MCP server URL" From 55631f11d0ed5dbce50d3f47b4ee73180522d2b8 Mon Sep 17 00:00:00 2001 From: vimukthiRajapaksha Date: Mon, 21 Jul 2025 12:10:41 +0530 Subject: [PATCH 059/349] Resolve merge conflicts --- .../src/features/ai/service/code/code.ts | 2 +- .../ai/service/healthcare/healthcare.ts | 312 +++++++++--------- .../src/features/ai/service/libs/funcs.ts | 1 + .../src/features/ai/service/libs/libs.ts | 1 + 4 files changed, 154 insertions(+), 162 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index b51776a3ff7..b4d5cc25555 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -348,7 +348,7 @@ export async function repairCode(params: RepairParams): Promise return { repairResponse: diagnosticFixResp, diagnostics: postProcessResp.diagnostics.diagnostics }; } -function stringifyExistingCode(existingCode: SourceFiles[], op: OperationType): string { +export function stringifyExistingCode(existingCode: SourceFiles[], op: OperationType): string { let existingCodeStr = ""; for (const file of existingCode) { const filePath = file.filePath; 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 index 973fdd53a16..57a253ac9f3 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts @@ -14,17 +14,11 @@ // specific language governing permissions and limitations // under the License. -import { CoreMessage, generateObject, generateText, streamText } from "ai"; -import { anthropic, ANTHROPIC_HAIKU, ANTHROPIC_SONNET_3_5, ANTHROPIC_SONNET_4 } from "../connection"; +import { CoreMessage, generateObject, streamText } from "ai"; +import { anthropic, ANTHROPIC_HAIKU, ANTHROPIC_SONNET_4 } from "../connection"; import { GenerationType, getRelevantLibrariesAndFunctions } from "../libs/libs"; import { getRewrittenPrompt, populateHistory, transformProjectSource, getErrorMessage } from "../utils"; -import { - getMaximizedSelectedLibs, - libraryContains, - selectRequiredFunctions, - toMaximizedLibrariesFromLibJson, -} from "../libs/funcs"; -import { GetFunctionResponse, GetFunctionsRequest, getFunctionsResponseSchema } from "../libs/funcs_inter_types"; +import { libraryContains } from "../libs/funcs"; import { LANGLIBS } from "../libs/langlibs"; import { GetTypeResponse, @@ -36,21 +30,17 @@ import { TypeDefinition, } from "../libs/libs_types"; import { - ChatNotify, - DiagnosticEntry, FileAttatchment, GenerateCodeRequest, - onChatNotify, - PostProcessResponse, - ProjectDiagnostics, ProjectSource, - RepairParams, - RepairResponse, SourceFiles, + OperationType, } from "@wso2/ballerina-core"; -import { getProjectSource, postProcess } from "../../../../rpc-managers/ai-panel/rpc-manager"; +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( @@ -58,6 +48,7 @@ export async function generateHealthcareCodeCore( eventHandler: CopilotEventHandler ): Promise { const project: ProjectSource = await getProjectSource(params.operationType); + const packageName = project.projectName; const sourceFiles: SourceFiles[] = transformProjectSource(project); const prompt = getRewrittenPrompt(params, sourceFiles); const relevantTrimmedFuncs: Library[] = ( @@ -69,11 +60,12 @@ export async function generateHealthcareCodeCore( const allMessages: CoreMessage[] = [ { role: "system", - content: getSystemPromptPrefix(relevantTrimmedFuncs), + content: getSystemPromptPrefix(relevantTrimmedFuncs, sourceFiles), }, { role: "system", - content: getSystemPromptSuffix(LANGLIBS, [], sourceFiles, params.fileAttachmentContents, prompt), + // content: getSystemPromptSuffix(LANGLIBS, [], sourceFiles, params.fileAttachmentContents, prompt), + content: getSystemPromptSuffix(LANGLIBS), providerOptions: { anthropic: { cacheControl: { type: "ephemeral" } }, }, @@ -81,7 +73,8 @@ export async function generateHealthcareCodeCore( ...historyMessages, { role: "user", - content: prompt, + content: getUserPrompt(prompt, sourceFiles, params.fileAttachmentContents, packageName, params.operationType), + // content: prompt, providerOptions: { anthropic: { cacheControl: { type: "ephemeral" } }, }, @@ -89,7 +82,8 @@ export async function generateHealthcareCodeCore( ]; const { fullStream } = streamText({ - model: anthropic(ANTHROPIC_SONNET_3_5), + // model: anthropic("claude-3-5-sonnet-20241022"), + model: anthropic(ANTHROPIC_SONNET_4), maxTokens: 4096*2, temperature: 0, messages: allMessages, @@ -138,157 +132,118 @@ export async function generateHealthcareCode(params: GenerateCodeRequest): Promi } } -function getSystemPromptPrefix(apidocs: Library[]) { - 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 thinking step-by-step and following the instructions provided. +export function getSystemPromptPrefix(apidocs: Library[], sourceFiles: SourceFiles[]): 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. -First, review and learn about the Ballerina libraries available for healthcare integration scenarios: - +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[], - types: string[], - existingCode: SourceFiles[], - fileUploadContents: FileAttatchment[], - usecase: string -): string { - return `Then, learn and understand the core Ballerina language libraries, the types and the functions they offer: +function getSystemPromptSuffix(langlibs: Library[]) { + return `2. Langlibs ${JSON.stringify(langlibs)} -Consider the following types and their corresponding libraries when generating the code: - -${JSON.stringify(types)} - -If you require these types, you have to import the corresponding libraries related to the selected types. +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.error, 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 you are accessing fields of a record, always assign it into new variables. +- Avoid long comments in the code. +- Always use named arguments when providing values to any parameter. (eg: .get(key="value")) +_ Do not use var keyword (variable declarations, for loops ...). Use explicit types insteads. +- 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. -Have a look and understand the current healthcare integrations that the user is being working on: - -${JSON.stringify(existingCode)} - +Begin your response with an explanation, then end the response with the codeblock segments(if any). +The explanation should explain the control flow decided in step 2, along with the selected libraries and their functions. -Read and try to understand the files user have attached to the query: -${JSON.stringify(fileUploadContents)} +Each file which needs modifications, should have a codeblock segment and it MUST have complete file content with the proposed change. Do not provide any explanation after codeblocks. -Now, consider this user query that explains the healthcare integration requirement to be considered when generating the Ballerina code: - -${usecase} - +If the user hasn't provided the information, request the missing information concisely. -Your goal is to generate accurate Ballerina code for the given query considering the knowledge you have, existing code and the files that are uploaded. I encourage you to plan the implementation first, before start writing code. Follow these steps in order: -- planning_phase -- writing_code phase -- verify_code phase -- generate_output phase - - -Think step-by-step and plan your code generation flow. Follow these steps when planning the code generation task: - -1. Understand whether the query requires code generation or not. If no code generation is required, skip the planning and codegen phases and answer the query based on your current understanding. -2. Deeply understand the query that requires code generation. Follow these steps: - - Carefully read and analyze the query. - - Identify input requirements, expected outputs, and constraints. - - Clarify any ambiguities, take judgemental calls and take necessary assumptions. Write down your assumptions. -3. Break the Problem Down. Follow these steps: - - Decompose the problem into smaller, manageable parts. - - Identify dependencies between different components. -4. Identify Edge Cases and Constraints. Follow these steps: - - Consider boundary conditions (e.g., empty inputs, large datasets). - - Identify performance constraints like time complexity and memory usage. -5. Choose the Right Approach. Follow these steps: - - Determine if existing algorithms or data structures can be applied. - - Select an optimal approach. -6. Design the Solution. Follow these steps: - - Create a high-level algorithm or flowchart. - - Define the key functions, data structures, and logic required. - - Identify whether these required functions, data structures are already available through the knowledge you have. - - Identify the model objects and use the types provided as much as possible. - - Identify the required libraries. 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; - -7. Write Pseudocode. Follow these steps: - - Draft a step-by-step logical representation of the solution. - - This helps validate the logic before coding. -8. Review and Iterate. Follow these steps: - - Validate whether you covered the requirements collected in step 2. - - Plan any thing you missed using the steps in the planning phase. - - - -Think step-by-step and start writing code. Adhere to the outcomes of the planning phase and follow these steps: - - You are writing a Ballerina program. - Important reminders: - - Only use the libraries, functions, types, and clients specified in the provided healthcare docs and types. - - Always strictly respect the types given in the types section. - - Do not introduce any additional libraries or functions not mentioned in the healthcare docs. - - Only use specified fields in records according to the healthcare 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. - To find the alias, split the library name from . and get the last element of the array as the name of the alias. - - 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 you are accessing fields of a record, always assign it into new variables. - - Avoid long comments in the code. - - Always use named arguments when providing values to any parameter. (eg: .get(key="value")) - _ Do not use var keyword (variable declarations, for loops ...). Use explicit types instead. - - 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. - - Start with the required import statements. Add all the must to have imports mentioned in Step 6 of the planning phase section. - - 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. - - 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 etc. - - Use defined connectors based on the query by following the healthcare docs. - - Use only the functions, types, and clients specified in the healthcare docs. - - Use dot notation 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 separate statements. - - - - Review and refine your code. Follow the steps below: - - Check that all query requirements are met. - - Make sure the special imports noted in step 6 of the planning phase are added in the code. - - Verify that you are only using elements from the provided healthcare docs. - - Ensure all the imports are properly specified and accurate. - - Make sure the types of the variables are correct based on the types specified in the types section. DOUBLE CHECK and FIX any incorrect imports. ALWAYS respect the section. - - Ensure the code follows Ballerina best practices and conventions. - - - - Begin your response with the very high level explanation about overall changes, then end the response with the codeblock segments(if any). Each file which needs modifications, should have a codeblock segment and it MUST have complete file content with the proposed change. Do not provide any explanation after codeblocks. - - - Example Codeblock segment: +Example Codeblock segment: 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 @@ -296,13 +251,48 @@ Think step-by-step and start writing code. Adhere to the outcomes of the plannin \`\`\ - If the generated code is a main function, use an appropriate name for the file. Use \`service\` as a prefix to the file name. Example: + 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, + existingCode: SourceFiles[], + fileUploadContents: FileAttatchment[], + packageName: string, + op: OperationType +): string { + let fileInstructions = ""; + if (fileUploadContents.length > 0) { + fileInstructions = `4. File Upload Contents. : Contents of the file which the user uploaded as addtional information for the query. + +${fileUploadContents + .map( + (file) => `File Name: ${file.fileName} +Content: ${file.content}` + ) + .join("\n")}`; + } + + return `QUERY: The query you need to answer using the provided api documentation. + +${usecase} + + +Existing Code: Users existing code. + +${stringifyExistingCode(existingCode, op)} + + +Current Package name: ${packageName} + +${fileInstructions} + `; } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts index 860ba6bf94f..fe124a3f63b 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts @@ -29,6 +29,7 @@ import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel export async function selectRequiredFunctions(prompt: string, selectedLibNames: string[], generationType: GenerationType): Promise { const selectedLibs: Library[] = await getMaximizedSelectedLibs(selectedLibNames, generationType); + console.log("Maximized libraries:", selectedLibs); const functionsResponse: GetFunctionResponse[] = await getRequiredFunctions(selectedLibNames, prompt, selectedLibs); let typeLibraries: Library[] = []; if (generationType === GenerationType.HEALTHCARE_GENERATION) { 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 index 66a0f048db8..90b9e97e5e4 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts @@ -63,6 +63,7 @@ export async function getSelectedLibraries(prompt: string, generationType: Gener if (allLibraries.length === 0) { return []; } + console.log("All libraries:", allLibraries); const messages: CoreMessage[] = [ { role: "system", From 5f95e9e5424a6ffcb06a966b71aac8502c1068b6 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Mon, 21 Jul 2025 12:53:38 +0530 Subject: [PATCH 060/349] Add string split feature --- .../src/features/editor-support/activator.ts | 11 +- .../editor-support/split-provider-visitor.ts | 48 +++++++ .../features/editor-support/split-provider.ts | 133 ++++++++++++++++++ 3 files changed, 187 insertions(+), 5 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/src/features/editor-support/split-provider-visitor.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/editor-support/split-provider.ts diff --git a/workspaces/ballerina/ballerina-extension/src/features/editor-support/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/editor-support/activator.ts index 929fe20fc16..c9d997b64b1 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/editor-support/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/editor-support/activator.ts @@ -24,16 +24,17 @@ import * as gitStatus from "./git-status"; import { INTERNAL_DEBUG_COMMAND, clearTerminal, FOCUS_DEBUG_CONSOLE_COMMAND, SOURCE_DEBUG_COMMAND, TEST_DEBUG_COMMAND } from "../project"; import { sendTelemetryEvent, TM_EVENT_SOURCE_DEBUG_CODELENS, CMP_EXECUTOR_CODELENS, TM_EVENT_TEST_DEBUG_CODELENS } from "../telemetry"; import { constructDebugConfig } from "../debugger"; +import { StringSplitFeature, StringSplitter } from "./split-provider"; export function activate(ballerinaExtInstance: BallerinaExtension) { if (!ballerinaExtInstance.context || !ballerinaExtInstance.langClient) { return; } - // TODO: Remove this once the use cases are identified - // if (isSupportedVersion(ballerinaExtInstance, VERSION.ALPHA, 5)) { - // ballerinaExtInstance.context!.subscriptions.push(new StringSplitFeature(new StringSplitter(), - // ballerinaExtInstance)); - // } + + if (isSupportedVersion(ballerinaExtInstance, VERSION.ALPHA, 5)) { + ballerinaExtInstance.context!.subscriptions.push(new StringSplitFeature(new StringSplitter(), + ballerinaExtInstance)); + } // Create new content provider for ballerina library files const blProvider = new ReadOnlyContentProvider(); diff --git a/workspaces/ballerina/ballerina-extension/src/features/editor-support/split-provider-visitor.ts b/workspaces/ballerina/ballerina-extension/src/features/editor-support/split-provider-visitor.ts new file mode 100644 index 00000000000..a673eec268e --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/editor-support/split-provider-visitor.ts @@ -0,0 +1,48 @@ +/** + * 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 { + StringLiteral, + STNode, + Visitor +} from "@wso2/syntax-tree"; +import { Range } from "vscode"; +import { newLine } from "./split-provider"; + +export class SplitProviderVisitor implements Visitor { + range: Range; + validSplit: boolean = false; + + constructor(range: Range) { + this.range = range; + } + + public beginVisitStringLiteral(node: StringLiteral, parent?: STNode) { + if (node.position.startLine === this.range.start.line && node.position.startColumn <= this.range.start.character && + node.position.endLine === this.range.end.line && node.position.endColumn >= this.range.end.character) { + if (node.position.endColumn === this.range.end.character && + (node.source.startsWith(`"${newLine}`) || !node.source.endsWith(`"${newLine}`))) { + this.validSplit = true; + } + } + } + + public isValidSplit(): boolean { + return this.validSplit; + } +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/editor-support/split-provider.ts b/workspaces/ballerina/ballerina-extension/src/features/editor-support/split-provider.ts new file mode 100644 index 00000000000..77ffb30d12e --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/editor-support/split-provider.ts @@ -0,0 +1,133 @@ +/** + * 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 { BallerinaExtension } from "../../core"; +import { Disposable, Position, Range, TextDocumentChangeEvent, TextDocumentContentChangeEvent, window, workspace } from "vscode"; +import { CMP_STRING_SPLIT, sendTelemetryEvent, TM_EVENT_STRING_SPLIT } from "../telemetry"; +import { isWindows } from "../../utils"; +import { traversNode } from "@wso2/syntax-tree"; +import { SplitProviderVisitor } from "./split-provider-visitor"; +import { SyntaxTree, SyntaxTreeNode } from "@wso2/ballerina-core"; + +export const newLine: string = isWindows() ? '\r\n' : '\n'; +const STRING_LITERAL: string = 'STRING_LITERAL'; +const WHITESPACE: string = 'WHITESPACE_MINUTIAE'; + +/** + * Provides string split capablity upon new line event. + */ +export class StringSplitter { + + public async updateDocument(event: TextDocumentChangeEvent) { + const editor = window.activeTextEditor; + if (!editor || !editor.document.fileName.endsWith('.bal') || event.contentChanges.length === 0 || + event.document.fileName.includes("extension-output-wso2.ballerina")) { + return; + } + if (this instanceof BallerinaExtension) { + // Add change for diagram edit callback + this.getDocumentContext().didEditorChange({ + fileUri: editor.document.uri, + startLine: editor.selection.active.line, + startColumn: editor.selection.active.character + }); + + let documentChange: TextDocumentContentChangeEvent | undefined; + event.contentChanges.forEach(change => { + if (change.text.startsWith(newLine)) { + documentChange = change; + } + }); + + if (!documentChange) { + return; + } + + const range: Range = documentChange!.range; + const extension: BallerinaExtension = this; + if (!this.langClient) { + return; + } + + let st = await this.langClient.getSyntaxTree({ + documentIdentifier: { + uri: editor.document.uri.toString() + } + }); + const visitor = new SplitProviderVisitor(range); + + traversNode((st as SyntaxTree).syntaxTree, visitor, undefined); + + if (!visitor.isValidSplit()) { + return; + } + + this.langClient.getSyntaxTreeNode({ + documentIdentifier: { + uri: editor.document.uri.toString() + }, + range: { + start: { + line: range.start.line, + character: range.start.character + }, + end: { + line: range.end.line, + character: range.end.character + } + } + }).then((stResponse) => { + const response = stResponse as SyntaxTreeNode; + if (!response.kind) { + return; + } + if (response.kind === WHITESPACE) { + sendTelemetryEvent(extension, TM_EVENT_STRING_SPLIT, CMP_STRING_SPLIT); + editor.edit(editBuilder => { + const startPosition = new Position(range.start.line, range.start.character); + const nextLinePosition = new Position(range.start.line + 1, documentChange!.text.length - 1); + const endPosition = new Position(range.end.line + 1, documentChange!.text.indexOf('\n')); + editBuilder.insert(startPosition, `\" +${newLine}`); + editBuilder.insert(nextLinePosition, `\"`); + editBuilder.delete(new Range(startPosition, endPosition)); + }); + } + }); + } + } +} + +/** + * Configures string split capability for the extension. + */ +export class StringSplitFeature implements Disposable { + + private disposables: Disposable[] = []; + private provider: StringSplitter; + private ballerinaExtInstance: BallerinaExtension; + + constructor(provider: StringSplitter, ballerinaExtInstance: BallerinaExtension) { + this.provider = provider; + this.ballerinaExtInstance = ballerinaExtInstance; + workspace.onDidChangeTextDocument(this.provider.updateDocument, this.ballerinaExtInstance, this.disposables); + } + + dispose() { + this.disposables.forEach((disposable) => disposable.dispose()); + } +} From 38cf2527d9661844eba8d8f4e5287ab17a2942a0 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Mon, 21 Jul 2025 16:16:45 +0530 Subject: [PATCH 061/349] Add command palette option to configure default WSO2 model provider variables --- .../ballerina-extension/package.json | 5 + .../src/features/ai/activator.ts | 14 ++ .../src/features/ai/constants.ts | 21 ++ .../src/features/ai/utils.ts | 190 +++++++++++++++++- 4 files changed, 226 insertions(+), 4 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/constants.ts diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 1401408a45a..386c34e5573 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -465,6 +465,11 @@ "title": "Check drift between code and documentation (Experimental)", "category": "Ballerina" }, + { + "command": "ballerina.configureWso2DefaultModelProvider", + "title": "Configure default WSO2 model provider", + "category": "Ballerina" + }, { "command": "ballerina.configureDefaultModelForNaturalFunctions", "title": "Configure default model for natural functions (Experimental)", diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts index 07df9a8c2a6..85a3688e3f9 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts @@ -16,8 +16,11 @@ * under the License. */ +import vscode from 'vscode'; import { BallerinaExtension, ExtendedLangClient } from '../../core'; import { activateCopilotLoginCommand, resetBIAuth } from './completions'; +import { addConfigFile, getConfigFilePath } from './utils'; +import { StateMachine } from "../../stateMachine"; export let langClient: ExtendedLangClient; @@ -25,4 +28,15 @@ export function activateAIFeatures(ballerinaExternalInstance: BallerinaExtension langClient = ballerinaExternalInstance.langClient; activateCopilotLoginCommand(); resetBIAuth(); + + const projectPath = StateMachine.context().projectUri; + + vscode.commands.registerCommand("ballerina.configureWso2DefaultModelProvider", async (...args: any[]) => { + const configPath = await getConfigFilePath(ballerinaExternalInstance, projectPath); + if (configPath != null) { + addConfigFile(configPath); + } + }); } + + diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/constants.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/constants.ts new file mode 100644 index 00000000000..6ba4d6d7097 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/constants.ts @@ -0,0 +1,21 @@ +/** + * 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 const CONFIG_FILE_NAME = "Config.toml"; +export const PROGRESS_BAR_MESSAGE_FROM_WSO2_DEFAULT_MODEL = "Fetching and saving access token for WSO2 default model"; +export const ERROR_NO_BALLERINA_SOURCES = "No Ballerina sources"; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts index 63f8db8d6ab..497a8ef50fd 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts @@ -18,9 +18,16 @@ import * as fs from 'fs'; import path from "path"; -import { Uri, workspace } from 'vscode'; +import vscode, { Uri, workspace } from 'vscode'; import { StateMachine } from "../../stateMachine"; +import { getRefreshedAccessToken } from '../../../src/utils/ai/auth'; +import { AIStateMachine } from '../../../src/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'; +import { BallerinaProject } from '@wso2/ballerina-core'; +import { BallerinaExtension } from 'src/core'; const config = workspace.getConfiguration('ballerina'); export const BACKEND_URL : string = config.get('rootUrl') || process.env.BALLERINA_ROOT_URL; @@ -44,17 +51,17 @@ export async function closeAllBallerinaFiles(dirPath: string): Promise { // Function to recursively find and close .bal files async function processDir(currentPath: string): Promise { const entries = fs.readdirSync(currentPath, { withFileTypes: true }); - + for (const entry of entries) { const entryPath = path.join(currentPath, entry.name); - + if (entry.isDirectory()) { // Recursively process subdirectories await processDir(entryPath); } else if (entry.isFile() && entry.name.endsWith('.bal')) { // Convert file path to URI const fileUri = Uri.file(entryPath).toString(); - + // Call didClose for this Ballerina file await langClient.didClose({ textDocument: { uri: fileUri } @@ -76,3 +83,178 @@ export async function closeAllBallerinaFiles(dirPath: string): Promise { // Start the recursive processing await processDir(dirPath); } + +export async function getConfigFilePath(ballerinaExtInstance: BallerinaExtension, rootPath: string): Promise { + if (await isBallerinaProjectAsync(rootPath)) { + return rootPath; + } + + const activeTextEditor = vscode.window.activeTextEditor; + const currentProject = ballerinaExtInstance.getDocumentContext().getCurrentProject(); + let activeFilePath = ""; + let configPath = ""; + + if (rootPath != "") { + return rootPath; + } + + if (activeTextEditor) { + activeFilePath = activeTextEditor.document.uri.fsPath; + } + + if (currentProject == null && activeFilePath == "") { + return await showNoBallerinaSourceWarningMessage(); + } + + try { + const currentBallerinaProject: BallerinaProject = await getCurrentBallerinaProjectFromContext(ballerinaExtInstance); + + if (!currentBallerinaProject) { + return await showNoBallerinaSourceWarningMessage(); + } + + if (currentBallerinaProject.kind == 'SINGLE_FILE_PROJECT') { + configPath = path.dirname(currentBallerinaProject.path); + } else { + configPath = currentBallerinaProject.path; + } + + if (configPath == undefined && configPath == "") { + return await showNoBallerinaSourceWarningMessage(); + } + return configPath; + } catch (error) { + return await showNoBallerinaSourceWarningMessage(); + } +} + +export function getTokenForDefaultModel() { + try { + return getRefreshedAccessToken(); + } catch (error) { + throw error; + } +} + +export async function getBackendURL(): Promise { + return new Promise(async (resolve) => { + resolve(BACKEND_URL); + }); +} + +// Function to find a file in a case-insensitive way +function findFileCaseInsensitive(directory, fileName) { + const files = fs.readdirSync(directory); + const targetFile = files.find(file => file.toLowerCase() === fileName.toLowerCase()); + const file = targetFile ? targetFile : fileName; + return path.join(directory, file); +} + +function addDefaultModelConfig( + projectPath: string, token: string, backendUrl: string) { + const targetTable = `[ballerina.ai.wso2ProviderConfig]`; + const urlLine = `serviceUrl = "${backendUrl}"`; + const accessTokenLine = `accessToken = "${token}"`; + const configFilePath = findFileCaseInsensitive(projectPath, CONFIG_FILE_NAME); + + let fileContent = ''; + + if (fs.existsSync(configFilePath)) { + fileContent = fs.readFileSync(configFilePath, 'utf-8'); + } + + const tableStartIndex = fileContent.indexOf(targetTable); + + if (tableStartIndex === -1) { + // Table doesn't exist, create it + if (fileContent.length > 0 && !fileContent.endsWith('\n')) { + fileContent += '\n\n'; + } + fileContent += `\n${targetTable}\n${urlLine}\n${accessTokenLine}\n`; + fs.writeFileSync(configFilePath, fileContent); + return; + } + + // Table exists, update it + const tableEndIndex = fileContent.indexOf('\n', tableStartIndex); + + let updatedTableContent = `${targetTable}\n${urlLine}\n${accessTokenLine}`; + + let urlLineIndex = fileContent.indexOf('url =', tableStartIndex); + let accessTokenLineIndex = fileContent.indexOf('accessToken =', tableStartIndex); + + if (urlLineIndex !== -1 && accessTokenLineIndex !== -1) { + // url and accessToken lines exist, replace them + const existingUrlLineEnd = fileContent.indexOf('\n', urlLineIndex); + const existingAccessTokenLineEnd = fileContent.indexOf('\n', accessTokenLineIndex); + + fileContent = + fileContent.substring(0, urlLineIndex) + + urlLine + + fileContent.substring(existingUrlLineEnd, accessTokenLineIndex) + + accessTokenLine + + fileContent.substring(existingAccessTokenLineEnd); + fs.writeFileSync(configFilePath, fileContent); + return; + } + + // If url or accessToken line does not exist, just replace the entire table + let nextTableStartIndex = fileContent.indexOf('[', tableEndIndex + 1); + if (nextTableStartIndex === -1) { + fileContent = fileContent.substring(0, tableStartIndex) + + updatedTableContent + fileContent.substring(tableEndIndex + 1); + } else { + let nextLineBreakIndex = fileContent.substring(tableEndIndex + 1).indexOf('\n'); + if (nextLineBreakIndex === -1) { + fileContent = fileContent.substring(0, tableStartIndex) + updatedTableContent; + } else { + fileContent = fileContent.substring(0, tableStartIndex) + + updatedTableContent + fileContent.substring(tableEndIndex + 1); + } + } + fs.writeFileSync(configFilePath, fileContent); +} + +export async function addConfigFile(configPath: string) { + await vscode.window.withProgress( + { + location: vscode.ProgressLocation.Notification, + title: PROGRESS_BAR_MESSAGE_FROM_WSO2_DEFAULT_MODEL, + cancellable: false, + }, + async () => { + try { + const token: string = await getTokenForDefaultModel(); + if (token == null) { + AIStateMachine.service().send(AIMachineEventType.LOGOUT); + return; + } + addDefaultModelConfig(configPath, token, await getBackendURL()); + } catch (error) { + AIStateMachine.service().send(AIMachineEventType.LOGOUT); + return; + } + } + ); +} + +export async function isBallerinaProjectAsync(rootPath: string): Promise { + try { + if (!fs.existsSync(rootPath)) { + return false; + } + + const files = fs.readdirSync(rootPath); + return files.some(file => + file.toLowerCase() === 'ballerina.toml' || + file.toLowerCase().endsWith('.bal') + ); + } catch (error) { + console.error(`Error checking Ballerina project: ${error}`); + return false; + } +} + +async function showNoBallerinaSourceWarningMessage() { + return await vscode.window.showWarningMessage(ERROR_NO_BALLERINA_SOURCES); +} From bfefaaa5cafec16c04376820f976fcf230822893 Mon Sep 17 00:00:00 2001 From: vimukthiRajapaksha Date: Mon, 21 Jul 2025 15:09:00 +0530 Subject: [PATCH 062/349] Support anthropic sonnet v4 support for healthcare --- .../ai/service/healthcare/healthcare.ts | 47 +++++++++---------- .../src/features/ai/service/libs/funcs.ts | 1 - .../src/features/ai/service/libs/libs.ts | 3 +- 3 files changed, 23 insertions(+), 28 deletions(-) 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 index 57a253ac9f3..1cc3664af84 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts @@ -35,8 +35,9 @@ import { ProjectSource, SourceFiles, OperationType, + PostProcessResponse, } from "@wso2/ballerina-core"; -import { getProjectSource } from "../../../../rpc-managers/ai-panel/rpc-manager"; +import { getProjectSource, postProcess } 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"; @@ -64,7 +65,6 @@ export async function generateHealthcareCodeCore( }, { role: "system", - // content: getSystemPromptSuffix(LANGLIBS, [], sourceFiles, params.fileAttachmentContents, prompt), content: getSystemPromptSuffix(LANGLIBS), providerOptions: { anthropic: { cacheControl: { type: "ephemeral" } }, @@ -74,7 +74,6 @@ export async function generateHealthcareCodeCore( { role: "user", content: getUserPrompt(prompt, sourceFiles, params.fileAttachmentContents, packageName, params.operationType), - // content: prompt, providerOptions: { anthropic: { cacheControl: { type: "ephemeral" } }, }, @@ -82,7 +81,6 @@ export async function generateHealthcareCodeCore( ]; const { fullStream } = streamText({ - // model: anthropic("claude-3-5-sonnet-20241022"), model: anthropic(ANTHROPIC_SONNET_4), maxTokens: 4096*2, temperature: 0, @@ -108,12 +106,11 @@ export async function generateHealthcareCodeCore( } case "finish": { const finishReason = part.finishReason; - const postProcessedResp: PostProcessResponse = await postProcess({ - assistant_response: assistantResponse, - }); - assistantResponse = postProcessedResp.assistant_response; - - eventHandler({ type: "content_replace", content: assistantResponse }); + console.log("Finish reason: ", finishReason); + if (finishReason === "error") { + // Already handled in error case. + break; + } eventHandler({ type: "stop" }); break; } @@ -150,7 +147,7 @@ function getSystemPromptSuffix(langlibs: Library[]) { ${JSON.stringify(langlibs)} -If the query doesn't require code examples, answer the code by utilzing the api documentation. +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: @@ -162,7 +159,7 @@ If the query requires code, Follow these steps to generate the Ballerina code: - 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.error, lang.float, lang.decimal, lang.int, lang.map langlibs as they are already imported by default). + - 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. @@ -181,7 +178,7 @@ If the query requires code, Follow these steps to generate the Ballerina code: 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). + - 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. @@ -204,17 +201,18 @@ Important reminders: - 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. +- 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. +- 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 you are accessing fields of a record, always assign it into new variables. -- Avoid long comments in the code. +- 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")) -_ Do not use var keyword (variable declarations, for loops ...). Use explicit types insteads. +- 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. @@ -236,14 +234,13 @@ _ Do not use var keyword (variable declarations, for loops ...). Use explicit ty \`\`\ - Note the use of \`Album\` instead of a json payload. -Begin your response with an explanation, then end the response with the codeblock segments(if any). +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. Do not provide any explanation after codeblocks. - -If the user hasn't provided the information, request the missing information concisely. +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 segment: +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 diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts index fe124a3f63b..860ba6bf94f 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts @@ -29,7 +29,6 @@ import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel export async function selectRequiredFunctions(prompt: string, selectedLibNames: string[], generationType: GenerationType): Promise { const selectedLibs: Library[] = await getMaximizedSelectedLibs(selectedLibNames, generationType); - console.log("Maximized libraries:", selectedLibs); const functionsResponse: GetFunctionResponse[] = await getRequiredFunctions(selectedLibNames, prompt, selectedLibs); let typeLibraries: Library[] = []; if (generationType === GenerationType.HEALTHCARE_GENERATION) { 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 index 90b9e97e5e4..6e93227c10b 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts @@ -63,7 +63,6 @@ export async function getSelectedLibraries(prompt: string, generationType: Gener if (allLibraries.length === 0) { return []; } - console.log("All libraries:", allLibraries); const messages: CoreMessage[] = [ { role: "system", @@ -137,7 +136,7 @@ Response: ${ generationType === GenerationType.CODE_GENERATION ? "" - : " ALWAYS include `ballerinax/health.base`, `ballerinax/health.fhir.r4`, `ballerinax/health.fhir.r4.parser`, `ballerinax/health.fhir.r4.international401`, `ballerinax/health.hl7v2commons` and `ballerinax/health.hl7v2` libraries in the selection in addition to what you selected." + : " 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." }`; } From 2f301a0c8eef89cf7ae1af599c4919dda756aebf Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Mon, 21 Jul 2025 18:39:14 +0530 Subject: [PATCH 063/349] Add login required warning to token retrieval process --- .../src/features/ai/constants.ts | 1 + .../src/features/ai/utils.ts | 14 ++++-- .../features/natural-programming/constants.ts | 1 + .../src/features/natural-programming/utils.ts | 45 +++++++++++-------- 4 files changed, 40 insertions(+), 21 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/constants.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/constants.ts index 6ba4d6d7097..78ed49ae313 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/constants.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/constants.ts @@ -19,3 +19,4 @@ export const CONFIG_FILE_NAME = "Config.toml"; export const PROGRESS_BAR_MESSAGE_FROM_WSO2_DEFAULT_MODEL = "Fetching and saving access token for WSO2 default model"; export const ERROR_NO_BALLERINA_SOURCES = "No Ballerina sources"; +export const LOGIN_REQUIRED_WARNING = "Please sign in to BI Copilot to use this feature."; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts index 497a8ef50fd..430f16a2bb3 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts @@ -24,7 +24,7 @@ import { StateMachine } from "../../stateMachine"; import { getRefreshedAccessToken } from '../../../src/utils/ai/auth'; import { AIStateMachine } from '../../../src/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 { CONFIG_FILE_NAME, ERROR_NO_BALLERINA_SOURCES, LOGIN_REQUIRED_WARNING, PROGRESS_BAR_MESSAGE_FROM_WSO2_DEFAULT_MODEL } from './constants'; import { getCurrentBallerinaProjectFromContext } from '../config-generator/configGenerator'; import { BallerinaProject } from '@wso2/ballerina-core'; import { BallerinaExtension } from 'src/core'; @@ -128,10 +128,18 @@ export async function getConfigFilePath(ballerinaExtInstance: BallerinaExtension } } -export function getTokenForDefaultModel() { +export async function getTokenForDefaultModel() { try { - return getRefreshedAccessToken(); + const token = await getRefreshedAccessToken(); + if (!token) { + vscode.window.showWarningMessage(LOGIN_REQUIRED_WARNING); + return null; + } + return token; } catch (error) { + if ((error as Error).message === "Refresh token is not available.") { + vscode.window.showWarningMessage(LOGIN_REQUIRED_WARNING); + } throw error; } } diff --git a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/constants.ts b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/constants.ts index 194021104ef..da00b99fc89 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/constants.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/constants.ts @@ -47,3 +47,4 @@ export const MONITERED_EXTENSIONS = [ export const CONFIG_FILE_NAME = "Config.toml"; export const DEFAULT_MODULE = "DEFAULT_MODULE"; export const ERROR_NO_BALLERINA_SOURCES = "No Ballerina sources"; +export const LOGIN_REQUIRED_WARNING = "Please sign in to BI Copilot to use this feature."; 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 f38c91b7268..f01d79386ca 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts @@ -34,7 +34,8 @@ import { DEFAULT_MODULE, MISSING_README_FILE_WARNING, README_DOCUMENTATION_IS_MISSING, MISSING_REQUIREMENT_FILE, MISSING_API_DOCS, API_DOCUMENTATION_IS_MISSING, PROGRESS_BAR_MESSAGE_FOR_NP_TOKEN, - ERROR_NO_BALLERINA_SOURCES + ERROR_NO_BALLERINA_SOURCES, + LOGIN_REQUIRED_WARNING } from "./constants"; import { isError, isNumber } from 'lodash'; import { HttpStatusCode } from 'axios'; @@ -49,10 +50,10 @@ import { fetchWithAuth } from '../ai/service/connection'; let controller = new AbortController(); export async function getLLMDiagnostics(projectUri: string, diagnosticCollection - : vscode.DiagnosticCollection): Promise { + : vscode.DiagnosticCollection): Promise { const ballerinaProjectSource: BallerinaSource = await getBallerinaProjectSourceFiles(projectUri); - const sourcesOfNonDefaultModulesWithReadme: BallerinaSource[] - = getSourcesOfNonDefaultModulesWithReadme(path.join(projectUri, "modules")); + const sourcesOfNonDefaultModulesWithReadme: BallerinaSource[] + = getSourcesOfNonDefaultModulesWithReadme(path.join(projectUri, "modules")); const sources: BallerinaSource[] = [ballerinaProjectSource, ...sourcesOfNonDefaultModulesWithReadme]; const backendurl = await getBackendURL(); @@ -72,9 +73,9 @@ export async function getLLMDiagnostics(projectUri: string, diagnosticCollection } async function getLLMResponses(sources: BallerinaSource[], token: string, backendurl: string) - : Promise { + : Promise { let promises: Promise[] = []; - const nonDefaultModulesWithReadmeFiles: string[] + const nonDefaultModulesWithReadmeFiles: string[] = sources.map(source => source.moduleName).filter(name => name != DEFAULT_MODULE); const commentResponsePromise = fetchWithAuth( @@ -116,8 +117,8 @@ async function getLLMResponses(sources: BallerinaSource[], token: string, backen let responses: (Response | Error)[] = await Promise.all(promises); const firstResponse = responses[0]; - const filteredResponses: Response[] - = responses.filter(response => !isError(response) && response.ok) as Response[]; + const filteredResponses: Response[] + = responses.filter(response => !isError(response) && response.ok) as Response[]; if (filteredResponses.length === 0) { if (isError(firstResponse)) { @@ -138,8 +139,8 @@ async function getLLMResponses(sources: BallerinaSource[], token: string, backen return extractedResponses; } -async function createDiagnosticCollection(responses: any[], projectUri: string, - diagnosticCollection: vscode.DiagnosticCollection) { +async function createDiagnosticCollection(responses: any[], projectUri: string, + diagnosticCollection: vscode.DiagnosticCollection) { let diagnosticsMap = new Map(); for (const response of responses) { @@ -258,8 +259,8 @@ async function createDiagnostic(result: ResultItem, uri: Uri): Promise { const ballerinaProjectSource: BallerinaSource = await getBallerinaProjectSourceFiles(projectUri); - const sourcesOfNonDefaultModulesWithReadme: BallerinaSource[] - = getSourcesOfNonDefaultModulesWithReadme(path.join(projectUri, "modules")); + const sourcesOfNonDefaultModulesWithReadme: BallerinaSource[] + = getSourcesOfNonDefaultModulesWithReadme(path.join(projectUri, "modules")); const sources: BallerinaSource[] = [ballerinaProjectSource, ...sourcesOfNonDefaultModulesWithReadme]; const backendurl = await getBackendURL(); @@ -539,7 +540,7 @@ function findFileCaseInsensitive(directory, fileName) { } export function addDefaultModelConfigForNaturalFunctions( - projectPath: string, token: string, backendUrl: string, isNaturalFunctionsAvailableInBallerinaOrg: boolean) { + projectPath: string, token: string, backendUrl: string, isNaturalFunctionsAvailableInBallerinaOrg: boolean) { const moduleOrg = isNaturalFunctionsAvailableInBallerinaOrg ? "ballerina" : "ballerinax"; const targetTable = `[${moduleOrg}.np.defaultModelConfig]`; const urlLine = `url = "${backendUrl}"`; @@ -604,10 +605,18 @@ export function addDefaultModelConfigForNaturalFunctions( fs.writeFileSync(configFilePath, fileContent); } -export function getTokenForNaturalFunction() { +export async function getTokenForNaturalFunction() { try { - return getRefreshedAccessToken(); + const token = await getRefreshedAccessToken(); + if (!token) { + vscode.window.showWarningMessage(LOGIN_REQUIRED_WARNING); + return null; + } + return token; } catch (error) { + if ((error as Error).message === "Refresh token is not available.") { + vscode.window.showWarningMessage(LOGIN_REQUIRED_WARNING); + } throw error; } } @@ -660,7 +669,7 @@ export async function getConfigFilePath(ballerinaExtInstance: BallerinaExtension if (!currentBallerinaProject) { return await showNoBallerinaSourceWarningMessage(); } - + if (currentBallerinaProject.kind == 'SINGLE_FILE_PROJECT') { configPath = path.dirname(currentBallerinaProject.path); } else { @@ -711,8 +720,8 @@ async function isBallerinaProjectAsync(rootPath: string): Promise { } const files = fs.readdirSync(rootPath); - return files.some(file => - file.toLowerCase() === 'ballerina.toml' || + return files.some(file => + file.toLowerCase() === 'ballerina.toml' || file.toLowerCase().endsWith('.bal') ); } catch (error) { From c2d96cb1e2ad1c5eb3482be0c681c93df2d55992 Mon Sep 17 00:00:00 2001 From: Nipuna Ranasinghe Date: Mon, 21 Jul 2025 14:04:59 +0530 Subject: [PATCH 064/349] Remove "Update Ballerina Nightly Build" command --- .../ballerina-extension/package.json | 5 - .../ballerina-extension/src/core/extension.ts | 211 ------------------ 2 files changed, 216 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index c4e304b0e30..965d34f7f29 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -327,11 +327,6 @@ } ], "commands": [ - { - "command": "ballerina.update-ballerina-dev-pack", - "title": "Update Ballerina Nightly Build", - "category": "Ballerina" - }, { "command": "ballerina.showExamples", "title": "Show Examples", diff --git a/workspaces/ballerina/ballerina-extension/src/core/extension.ts b/workspaces/ballerina/ballerina-extension/src/core/extension.ts index 57bae14ceb4..bd17e1fa0c4 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extension.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extension.ts @@ -247,10 +247,6 @@ export class BallerinaExtension { this.installBallerina(); }); - commands.registerCommand('ballerina.update-ballerina-dev-pack', () => { // Update developer pack from ballerina dev build and set to ballerina-home and enable plugin dev mode - this.updateBallerinaDeveloperPack(true); - }); - commands.registerCommand('ballerina.update-ballerina', () => { // Update release pack from ballerina update tool with terminal this.updateBallerina(); }); @@ -1242,213 +1238,6 @@ export class BallerinaExtension { } } - async updateBallerinaDeveloperPack(restartWindow?: boolean) { - try { - if (this.langClient?.isRunning()) { - window.showInformationMessage(`Stopping the ballerina language server...`); - await this.langClient.stop(); - await new Promise(resolve => setTimeout(resolve, 15000)); // Wait for 15 seconds - } - - window.showInformationMessage(`Updating Ballerina version`); - // Remove the existing Ballerina version - fs.rmSync(this.ballerinaInstallationDir, { recursive: true, force: true }); - - await this.downloadAndUnzipBallerina(restartWindow); - - await this.setBallerinaHomeAndCommand(true); - - await this.setExecutablePermissions(); - - let res: DownloadProgress = { - message: `Success..`, - success: true, - step: 6 // This is the last step - }; - RPCLayer._messenger.sendNotification(onDownloadProgress, { type: 'webview', webviewType: VisualizerWebview.viewType }, res); - - console.log('Ballerina home has been set successfully.'); - if (restartWindow) { - commands.executeCommand('workbench.action.reloadWindow'); - } else { - window.showInformationMessage("Ballerina has been set up successfully"); - } - } catch (error) { - console.error('Error downloading or unzipping the Ballerina:', error); - window.showErrorMessage('Error downloading or unzipping the Ballerina:', error); - } - } - - private async downloadAndUnzipBallerina(restartWindow?: boolean) { - try { - // Get the latest successful daily build run and artifacts - let res: DownloadProgress = { - downloadedSize: 0, - message: "Fetching Ballerina release details..", - percentage: 0, - success: false, - totalSize: 0, - step: 1 - }; - RPCLayer._messenger.sendNotification(onDownloadProgress, { type: 'webview', webviewType: VisualizerWebview.viewType }, res); - const releasesResponse = await axios.get(this.ballerinaIntegratorReleaseUrl); - const releases = releasesResponse.data; - const tags = releases.map((release: any) => release.tag_name).filter((tag: string) => tag.includes("bi-pack")); - if (tags.length === 0) { - throw new Error('No Ballerina distribution found in the releases'); - } - const latestTag = tags[0]; - console.log(`Latest release tag: ${latestTag}`); - - // Get the latest successful daily build run and artifacts - res = { - downloadedSize: 0, - message: "Fetching latest ballerina distribution details..", - percentage: 0, - success: false, - totalSize: 0, - step: 2 - }; - RPCLayer._messenger.sendNotification(onDownloadProgress, { type: 'webview', webviewType: VisualizerWebview.viewType }, res); - const biReleaseResponse = await axios.get(`${this.ballerinaIntegratorReleaseUrl}/tags/${latestTag}`); - const biRelease = biReleaseResponse.data; - this.ballerinaIntegratorVersion = biRelease.tag_name.replace('v', '').split('-')[0]; - console.log(`Latest release version: ${this.ballerinaIntegratorVersion}`); - - const platform = os.platform(); - const asset = biRelease.assets.find((asset: any) => { - if (platform === 'win32') { - return asset.name.endsWith('windows.zip'); - } else if (platform === 'linux') { - return asset.name.endsWith('linux.zip'); - } else if (platform === 'darwin') { - if (os.arch() === 'arm64') { - return asset.name.endsWith('macos-arm.zip'); - } else { - return asset.name.endsWith('macos.zip'); - } - } - }); - if (!asset) { - throw new Error('No artifact found in the release ' + this.ballerinaIntegratorVersion); - } - const artifactUrl = asset.browser_download_url; - - // Create destination folder if it doesn't exist - if (!fs.existsSync(this.getBallerinaUserHome())) { - fs.mkdirSync(this.getBallerinaUserHome(), { recursive: true }); - } - - // Download the artifact and save it to the user home directory - console.log(`Downloading artifact from ${artifactUrl}`); - let response; - try { - res = { - downloadedSize: 0, - message: "Download starting...", - percentage: 0, - success: false, - totalSize: 0, - step: 3 - }; - RPCLayer._messenger.sendNotification(onDownloadProgress, { type: 'webview', webviewType: VisualizerWebview.viewType }, res); - const sizeMB = 1024 * 1024; - await window.withProgress( - { - location: ProgressLocation.Notification, - title: `Downloading Ballerina distribution`, - cancellable: false, - }, - async (progress) => { - let lastPercentageReported = 0; - - response = await axios({ - url: artifactUrl, - method: 'GET', - responseType: 'arraybuffer', - onDownloadProgress: (progressEvent) => { - const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total); - console.log(`Total Size: ${progressEvent.total / sizeMB}MB`); - console.log(`Download progress: ${percentCompleted}%`); - - if (percentCompleted > lastPercentageReported) { - progress.report({ increment: percentCompleted - lastPercentageReported, message: `${percentCompleted}% of ${Math.round(progressEvent.total / sizeMB)}MB` }); - lastPercentageReported = percentCompleted; - } - - // Sizes will be sent as MB - res = { - downloadedSize: progressEvent.loaded / sizeMB, - message: "Downloading...", - percentage: percentCompleted, - success: false, - totalSize: progressEvent.total / sizeMB, - step: 2 - }; - RPCLayer._messenger.sendNotification(onDownloadProgress, { type: 'webview', webviewType: VisualizerWebview.viewType }, res); - } - }); - if (restartWindow) { - window.showInformationMessage("Download complete. Please wait..."); - } - return; - } - ); - // ... existing code to handle the response ... - } catch (error) { - // Sizes will be sent as MB - res = { - ...res, - message: `Failed: ${error}`, - success: false, - step: -1 // Error step - }; - RPCLayer._messenger.sendNotification(onDownloadProgress, { type: 'webview', webviewType: VisualizerWebview.viewType }, res); - console.error('Error downloading artifact:', error); - } - const zipFilePath = path.join(this.getBallerinaUserHome(), asset.name); - await fs.writeFileSync(zipFilePath, response.data); - console.log(`Downloaded artifact to ${zipFilePath}`); - - if (restartWindow) { - window.showInformationMessage("Setting the Ballerina distribution Home location..."); - } - res = { - ...res, - message: `Setting the Ballerina distribution Home location...`, - success: false, - step: 4 - }; - RPCLayer._messenger.sendNotification(onDownloadProgress, { type: 'webview', webviewType: VisualizerWebview.viewType }, res); - // Unzip the artifact - const zip = new AdmZip(zipFilePath); - zip.extractAllTo(this.getBallerinaUserHome(), true); - console.log(`Unzipped artifact to ${this.getBallerinaUserHome()}`); - - // Rename the root folder to the new name - const tempRootPath = path.join(this.getBallerinaUserHome(), asset.name.replace('.zip', '')); - fs.renameSync(tempRootPath, this.ballerinaInstallationDir); - - if (restartWindow) { - window.showInformationMessage("Cleaning up the temp files..."); - } - res = { - ...res, - message: `Cleaning up the temp files...`, - success: false, - step: 5 - }; - RPCLayer._messenger.sendNotification(onDownloadProgress, { type: 'webview', webviewType: VisualizerWebview.viewType }, res); - // Cleanup: Remove the downloaded zip file - fs.rmSync(zipFilePath); - - console.log('Cleanup complete.'); - } catch (error) { - console.error('Error downloading or unzipping Ballerina version:', error); - window.showErrorMessage('Error downloading or unzipping Ballerina version:', error); - } - } - private async setBallerinaHomeAndCommand(isDev?: boolean) { let exeExtension = ""; if (isWindows()) { From 4ce0d685c703e443e914af89328618dc93892354 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Tue, 22 Jul 2025 10:33:17 +0530 Subject: [PATCH 065/349] Refactor error handling for access token retrieval to use constant message --- .../ballerina/ballerina-extension/src/features/ai/utils.ts | 4 ++-- .../src/features/natural-programming/utils.ts | 4 ++-- workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts index 430f16a2bb3..fb61560c4bf 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts @@ -21,7 +21,7 @@ import path from "path"; import vscode, { Uri, workspace } from 'vscode'; import { StateMachine } from "../../stateMachine"; -import { getRefreshedAccessToken } from '../../../src/utils/ai/auth'; +import { getRefreshedAccessToken, REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE } from '../../../src/utils/ai/auth'; import { AIStateMachine } from '../../../src/views/ai-panel/aiMachine'; import { AIMachineEventType } from '@wso2/ballerina-core/lib/state-machine-types'; import { CONFIG_FILE_NAME, ERROR_NO_BALLERINA_SOURCES, LOGIN_REQUIRED_WARNING, PROGRESS_BAR_MESSAGE_FROM_WSO2_DEFAULT_MODEL } from './constants'; @@ -137,7 +137,7 @@ export async function getTokenForDefaultModel() { } return token; } catch (error) { - if ((error as Error).message === "Refresh token is not available.") { + if ((error as Error).message === REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE) { vscode.window.showWarningMessage(LOGIN_REQUIRED_WARNING); } throw error; 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 f01d79386ca..31440cfdd12 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts @@ -43,7 +43,7 @@ import { BACKEND_URL } from '../ai/utils'; import { AIMachineEventType, BallerinaProject } from '@wso2/ballerina-core'; import { getCurrentBallerinaProjectFromContext } from '../config-generator/configGenerator'; import { BallerinaExtension } from 'src/core'; -import { getRefreshedAccessToken } from '../../../src/utils/ai/auth'; +import { getRefreshedAccessToken, REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE } from '../../../src/utils/ai/auth'; import { AIStateMachine } from '../../../src/views/ai-panel/aiMachine'; import { fetchWithAuth } from '../ai/service/connection'; @@ -614,7 +614,7 @@ export async function getTokenForNaturalFunction() { } return token; } catch (error) { - if ((error as Error).message === "Refresh token is not available.") { + if ((error as Error).message === REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE) { vscode.window.showWarningMessage(LOGIN_REQUIRED_WARNING); } throw error; diff --git a/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts b/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts index 7085e502181..0623e186f3b 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts @@ -25,6 +25,7 @@ import { jwtDecode, JwtPayload } from 'jwt-decode'; export const ACCESS_TOKEN_SECRET_KEY = 'BallerinaAIUser'; export const REFRESH_TOKEN_SECRET_KEY = 'BallerinaAIRefreshToken'; +export const REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE = "Refresh token is not available."; //TODO: What if user doesnt have github copilot. //TODO: Where does auth git get triggered @@ -167,7 +168,7 @@ export const getRefreshedAccessToken = async (): Promise => { try { const refreshToken = await extension.context.secrets.get(REFRESH_TOKEN_SECRET_KEY); if (!refreshToken) { - reject(new Error("Refresh token is not available.")); + reject(new Error(REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE)); return; } From 4ef8235ecbaf91a2538c1e79ed23356ebe628d51 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Tue, 22 Jul 2025 11:38:26 +0530 Subject: [PATCH 066/349] Refactor equality checks to use strict comparison and add missing parameter types --- .../ballerina-extension/src/features/ai/activator.ts | 2 +- .../ballerina-extension/src/features/ai/utils.ts | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts index 85a3688e3f9..d0eff4fdc50 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts @@ -33,7 +33,7 @@ export function activateAIFeatures(ballerinaExternalInstance: BallerinaExtension vscode.commands.registerCommand("ballerina.configureWso2DefaultModelProvider", async (...args: any[]) => { const configPath = await getConfigFilePath(ballerinaExternalInstance, projectPath); - if (configPath != null) { + if (configPath !== null) { addConfigFile(configPath); } }); diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts index fb61560c4bf..f118fe93cad 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts @@ -94,7 +94,7 @@ export async function getConfigFilePath(ballerinaExtInstance: BallerinaExtension let activeFilePath = ""; let configPath = ""; - if (rootPath != "") { + if (rootPath !== "") { return rootPath; } @@ -119,7 +119,7 @@ export async function getConfigFilePath(ballerinaExtInstance: BallerinaExtension configPath = currentBallerinaProject.path; } - if (configPath == undefined && configPath == "") { + if (configPath == undefined || configPath == "") { return await showNoBallerinaSourceWarningMessage(); } return configPath; @@ -151,7 +151,7 @@ export async function getBackendURL(): Promise { } // Function to find a file in a case-insensitive way -function findFileCaseInsensitive(directory, fileName) { +function findFileCaseInsensitive(directory: string, fileName: string): string { const files = fs.readdirSync(directory); const targetFile = files.find(file => file.toLowerCase() === fileName.toLowerCase()); const file = targetFile ? targetFile : fileName; @@ -232,8 +232,8 @@ export async function addConfigFile(configPath: string) { }, async () => { try { - const token: string = await getTokenForDefaultModel(); - if (token == null) { + const token: string | null = await getTokenForDefaultModel(); + if (token === null) { AIStateMachine.service().send(AIMachineEventType.LOGOUT); return; } From e4319a7cdcc1ae7ef57aa55493d2a08c14bcb11d Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Tue, 22 Jul 2025 13:07:12 +0530 Subject: [PATCH 067/349] Refactor Ballerina extension context management by replacing direct references to ballerinaExtInstance with a centralized extension object. --- .../src/BalExtensionContext.ts | 2 + .../ballerina-extension/src/RPCLayer.ts | 4 +- .../ballerina-extension/src/core/extension.ts | 6 +- .../ballerina-extension/src/extension.ts | 10 ++-- .../src/features/ai/completions.ts | 12 ++-- .../config-generator/configGenerator.ts | 13 ++-- .../src/features/debugger/config-provider.ts | 59 ++++++++++--------- .../src/features/project/cmds/add.ts | 15 ++--- .../src/features/project/cmds/build.ts | 17 +++--- .../src/features/project/cmds/cloud.ts | 17 +++--- .../src/features/project/cmds/cmd-runner.ts | 6 +- .../src/features/project/cmds/configRun.ts | 12 ++-- .../src/features/project/cmds/doc.ts | 15 ++--- .../features/project/cmds/json-to-record.ts | 24 ++++---- .../src/features/project/cmds/pack.ts | 13 ++-- .../src/features/project/cmds/run.ts | 19 +++--- .../src/features/project/cmds/test.ts | 15 ++--- .../features/project/cmds/xml-to-record.ts | 20 +++---- .../src/features/test-explorer/discover.ts | 22 +++---- .../src/features/test-explorer/runner.ts | 4 +- .../rpc-managers/bi-diagram/rpc-manager.ts | 5 +- .../src/rpc-managers/common/rpc-manager.ts | 6 +- .../rpc-managers/lang-client/rpc-manager.ts | 4 +- .../ballerina-extension/src/stateMachine.ts | 16 +++-- .../src/utils/project-utils.ts | 8 +-- .../src/utils/state-machine-utils.ts | 6 +- .../src/utils/webview-utils.ts | 20 +++---- .../src/views/bbe/activator.ts | 2 +- .../src/views/graphql/graphqlViewPanel.ts | 5 +- .../src/views/notebook/notebookSerializer.ts | 6 +- .../test/core/ballerina-extention.test.ts | 6 +- .../test/language-server/lang-client.test.ts | 4 +- 32 files changed, 204 insertions(+), 189 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/BalExtensionContext.ts b/workspaces/ballerina/ballerina-extension/src/BalExtensionContext.ts index 8a4c4fa6cdb..16ee5028d23 100644 --- a/workspaces/ballerina/ballerina-extension/src/BalExtensionContext.ts +++ b/workspaces/ballerina/ballerina-extension/src/BalExtensionContext.ts @@ -20,9 +20,11 @@ import { ExtensionContext } from "vscode"; import { AgentChatContext } from "./views/agent-chat/activate"; import { AIPanelPrompt } from "@wso2/ballerina-core"; +import { BallerinaExtension } from "./core"; export class BalExtensionContext { public context!: ExtensionContext; + public ballerinaExtInstance: BallerinaExtension; public aiChatDefaultPrompt?: AIPanelPrompt; public agentChatContext?: AgentChatContext; public hasPullModuleNotification = false; diff --git a/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts b/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts index 6326f6c0cc3..29160887eda 100644 --- a/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts +++ b/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts @@ -41,7 +41,7 @@ import { registerSequenceDiagramRpcHandlers } from './rpc-managers/sequence-diag import { registerInlineDataMapperRpcHandlers } from './rpc-managers/inline-data-mapper/rpc-handler'; import { registerTestManagerRpcHandlers } from './rpc-managers/test-manager/rpc-handler'; import { registerIcpServiceRpcHandlers } from './rpc-managers/icp-service/rpc-handler'; -import { ballerinaExtInstance } from './core'; +import { extension } from './BalExtensionContext'; import { registerAgentChatRpcHandlers } from './rpc-managers/agent-chat/rpc-handler'; import { ArtifactsUpdated, ArtifactNotificationHandler } from './utils/project-artifacts-handler'; @@ -136,7 +136,7 @@ async function getContext(): Promise { isBISupported: context.isBISupported, haveLS: StateMachine.langClient() && true, recordFilePath: path.join(context.projectUri, "types.bal"), - enableSequenceDiagram: ballerinaExtInstance.enableSequenceDiagramView(), + enableSequenceDiagram: extension.ballerinaExtInstance.enableSequenceDiagramView(), target: context.metadata?.target }, scope: context.scope, diff --git a/workspaces/ballerina/ballerina-extension/src/core/extension.ts b/workspaces/ballerina/ballerina-extension/src/core/extension.ts index 57bae14ceb4..28c1e3abe41 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extension.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extension.ts @@ -294,7 +294,7 @@ export class BallerinaExtension { debug(`Feature flags - Experimental: ${this.enabledExperimentalFeatures()}, BI: ${this.biSupported}, NP: ${this.isNPSupported}`); if (!this.ballerinaVersion.match(SWAN_LAKE_REGEX) || (this.ballerinaVersion.match(SWAN_LAKE_REGEX) && - !isSupportedVersion(ballerinaExtInstance, VERSION.BETA, 3))) { + !isSupportedVersion(this, VERSION.BETA, 3))) { this.showMessageOldBallerina(); const message = `Ballerina version ${this.ballerinaVersion} is not supported. The extension supports Ballerina Swan Lake Beta 3+ versions.`; @@ -1675,7 +1675,7 @@ export class BallerinaExtension { if (download === selection) { commands.executeCommand('vscode.open', Uri.parse(DOWNLOAD_BALLERINA)); } else if (viewLogs === selection) { - const balOutput = ballerinaExtInstance.getOutPutChannel(); + const balOutput = this.getOutPutChannel(); if (balOutput) { balOutput.show(); } @@ -2179,5 +2179,3 @@ function getShellEnvironment(): Promise { }); }); } - -export const ballerinaExtInstance = new BallerinaExtension(); diff --git a/workspaces/ballerina/ballerina-extension/src/extension.ts b/workspaces/ballerina/ballerina-extension/src/extension.ts index f4a3348f32e..51411b44a53 100644 --- a/workspaces/ballerina/ballerina-extension/src/extension.ts +++ b/workspaces/ballerina/ballerina-extension/src/extension.ts @@ -17,7 +17,7 @@ */ import { ExtensionContext, commands, window, Location, Uri, TextEditor, extensions } from 'vscode'; -import { ballerinaExtInstance, BallerinaExtension } from './core'; +import { BallerinaExtension } from './core'; import { activate as activateBBE } from './views/bbe'; import { activate as activateTelemetryListener, CMP_EXTENSION_CORE, sendTelemetryEvent, @@ -94,7 +94,7 @@ function onBeforeInit(langClient: ExtendedLangClient) { } fillClientCapabilities(capabilities: ExtendedClientCapabilities): void { capabilities.experimental = capabilities.experimental || { introspection: false, showTextDocument: false }; - capabilities.experimental.experimentalLanguageFeatures = ballerinaExtInstance.enabledExperimentalFeatures(); + capabilities.experimental.experimentalLanguageFeatures = extension.ballerinaExtInstance.enabledExperimentalFeatures(); } initialize(_capabilities: ServerCapabilities, _documentSelector: DocumentSelector | undefined): void { } @@ -112,10 +112,12 @@ export async function activate(context: ExtensionContext) { // Wait for the ballerina extension to be ready await StateMachine.initialize(); // Then return the ballerina extension context - return { ballerinaExtInstance, projectPath: StateMachine.context().projectUri }; + return { ballerinaExtInstance: extension.ballerinaExtInstance, projectPath: StateMachine.context().projectUri }; } export async function activateBallerina(): Promise { + const ballerinaExtInstance = new BallerinaExtension(); + extension.ballerinaExtInstance = ballerinaExtInstance; debug('Active the Ballerina VS Code extension.'); sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_EXTENSION_ACTIVATE, CMP_EXTENSION_CORE); ballerinaExtInstance.setContext(extension.context); @@ -242,6 +244,6 @@ export function deactivate(): Thenable | undefined { if (!langClient) { return; } - ballerinaExtInstance.telemetryReporter.dispose(); + extension.ballerinaExtInstance.telemetryReporter.dispose(); return langClient.stop(); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/completions.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/completions.ts index 2fb684346aa..d143bc84852 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/completions.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/completions.ts @@ -16,7 +16,7 @@ * under the License. */ -import { ballerinaExtInstance } from "./../../core"; +import { extension } from "../../BalExtensionContext"; import { commands, window } from "vscode"; import { TM_EVENT_AUTH_COPILOT, CMP_AUTH_COPILOT, sendTelemetryEvent, @@ -32,11 +32,11 @@ import { ChatNotify, onChatNotify } from "@wso2/ballerina-core"; export function activateCopilotLoginCommand() { commands.registerCommand(PALETTE_COMMANDS.LOGIN_COPILOT, async () => { try { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_AUTH_COPILOT, CMP_AUTH_COPILOT); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_AUTH_COPILOT, CMP_AUTH_COPILOT); await loginGithubCopilot(); } catch (error) { if (error instanceof Error) { - sendTelemetryException(ballerinaExtInstance, error, CMP_AUTH_COPILOT); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_AUTH_COPILOT); window.showErrorMessage(error.message); } else { window.showErrorMessage("Unkown error occurred."); @@ -47,8 +47,8 @@ export function activateCopilotLoginCommand() { export function resetBIAuth() { commands.registerCommand(PALETTE_COMMANDS.RESET_BI, async () => { - await ballerinaExtInstance.context.secrets.delete('GITHUB_TOKEN'); - await ballerinaExtInstance.context.secrets.delete('GITHUB_COPILOT_TOKEN'); - await ballerinaExtInstance.context.secrets.delete('LOGIN_ALERT_SHOWN'); + await extension.ballerinaExtInstance.context.secrets.delete('GITHUB_TOKEN'); + await extension.ballerinaExtInstance.context.secrets.delete('GITHUB_COPILOT_TOKEN'); + await extension.ballerinaExtInstance.context.secrets.delete('LOGIN_ALERT_SHOWN'); }); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/config-generator/configGenerator.ts b/workspaces/ballerina/ballerina-extension/src/features/config-generator/configGenerator.ts index e8731888b4c..decb3f62705 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/config-generator/configGenerator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/config-generator/configGenerator.ts @@ -16,12 +16,13 @@ * under the License. */ -import { window, Uri, commands, workspace } from "vscode"; -import { existsSync, openSync, readFileSync, writeFile } from "fs"; -import { BAL_TOML, BAL_CONFIG_FILE, PALETTE_COMMANDS, clearTerminal } from "../project"; -import { BallerinaExtension, ballerinaExtInstance, ExtendedLangClient } from "../../core"; +import { window, Uri, commands } from "vscode"; +import { existsSync, readFileSync, writeFile } from "fs"; +import { BAL_CONFIG_FILE, PALETTE_COMMANDS, clearTerminal } from "../project"; +import { BallerinaExtension, ExtendedLangClient } from "../../core"; +import { extension } from "../../BalExtensionContext"; import { getCurrentBallerinaProject } from "../../utils/project-utils"; -import { parseTomlToConfig, typeOfComment } from "./utils"; +import { typeOfComment } from "./utils"; import { ConfigProperty, ConfigTypes, Constants, Property } from "./model"; import { BallerinaProject, ConfigVariableResponse, EVENT_TYPE, MACHINE_VIEW, PackageConfigSchema, ProjectDiagnosticsResponse, SyntaxTree } from "@wso2/ballerina-core"; import { TextDocumentEdit } from "vscode-languageserver-types"; @@ -227,7 +228,7 @@ async function executeRunCommand(ballerinaExtInstance: BallerinaExtension, fileP export async function cleanAndValidateProject(langClient: ExtendedLangClient, path: string): Promise { try { // Get initial project diagnostics - const projectPath = ballerinaExtInstance?.getDocumentContext()?.getCurrentProject()?.path || path; + const projectPath = extension.ballerinaExtInstance?.getDocumentContext()?.getCurrentProject()?.path || path; let response: ProjectDiagnosticsResponse = await langClient.getProjectDiagnostics({ projectRootIdentifier: { uri: Uri.file(projectPath).toString() 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 34a6d0e3e4a..fc7752db93b 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/debugger/config-provider.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/debugger/config-provider.ts @@ -33,7 +33,7 @@ import * as child_process from "child_process"; import { getPortPromise } from 'portfinder'; import * as path from "path"; import { - ballerinaExtInstance, BallerinaExtension, LANGUAGE, OLD_BALLERINA_VERSION_DEBUGGER_RUNINTERMINAL, + BallerinaExtension, LANGUAGE, OLD_BALLERINA_VERSION_DEBUGGER_RUNINTERMINAL, UNSUPPORTED_DEBUGGER_RUNINTERMINAL_KIND, INVALID_DEBUGGER_RUNINTERMINAL_KIND } from '../../core'; import { ExtendedLangClient } from '../../core/extended-language-client'; @@ -61,6 +61,7 @@ import { notifyBreakpointChange } from '../../RPCLayer'; import { VisualizerWebview } from '../../views/visualizer/webview'; import { URI } from 'vscode-uri'; import { prepareAndGenerateConfig, cleanAndValidateProject } from '../config-generator/configGenerator'; +import { extension } from '../../BalExtensionContext'; const BALLERINA_COMMAND = "ballerina.command"; const EXTENDED_CLIENT_CAPABILITIES = "capabilities"; @@ -97,7 +98,7 @@ class DebugConfigProvider implements DebugConfigurationProvider { return Promise.resolve({ request: '', type: '', name: '' }); } - if (config.noDebug && (ballerinaExtInstance.enabledRunFast() || StateMachine.context().isBI)) { + if (config.noDebug && (extension.ballerinaExtInstance.enabledRunFast() || StateMachine.context().isBI)) { await handleMainFunctionParams(config); } return getModifiedConfigs(_folder, config); @@ -109,7 +110,7 @@ function getValueFromProgramArgs(programArgs: string[], idx: number) { } async function handleMainFunctionParams(config: DebugConfiguration) { - const res = await ballerinaExtInstance.langClient?.getMainFunctionParams({ + const res = await extension.ballerinaExtInstance.langClient?.getMainFunctionParams({ projectRootIdentifier: { uri: "file://" + StateMachine.context().projectUri } @@ -235,9 +236,9 @@ async function getModifiedConfigs(workspaceFolder: WorkspaceFolder, config: Debu const debuggeePort = config.debuggeePort ?? await findFreePort(); config.debuggeePort = debuggeePort.toString(); - const ballerinaHome = ballerinaExtInstance.getBallerinaHome(); + const ballerinaHome = extension.ballerinaExtInstance.getBallerinaHome(); config['ballerina.home'] = ballerinaHome; - config[BALLERINA_COMMAND] = ballerinaExtInstance.getBallerinaCmd(); + config[BALLERINA_COMMAND] = extension.ballerinaExtInstance.getBallerinaCmd(); config[EXTENDED_CLIENT_CAPABILITIES] = { supportsReadOnlyEditors: true, supportsFastRun: isFastRunEnabled() }; if (!config.type) { @@ -253,7 +254,7 @@ async function getModifiedConfigs(workspaceFolder: WorkspaceFolder, config: Debu const activeTextEditor = window.activeTextEditor; if (activeTextEditor && activeTextEditor.document.fileName.endsWith(BAL_NOTEBOOK)) { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_START_NOTEBOOK_DEBUG, CMP_NOTEBOOK); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_START_NOTEBOOK_DEBUG, CMP_NOTEBOOK); let activeTextEditorUri = activeTextEditor.document.uri; if (activeTextEditorUri.scheme === NOTEBOOK_CELL_SCHEME) { activeTextEditorUri = Uri.file(getTempFile()); @@ -297,11 +298,11 @@ async function getModifiedConfigs(workspaceFolder: WorkspaceFolder, config: Debu } } } else { - ballerinaExtInstance.showMessageInvalidProject(); + extension.ballerinaExtInstance.showMessageInvalidProject(); return Promise.reject(); } - let langClient = ballerinaExtInstance.langClient; + let langClient = extension.ballerinaExtInstance.langClient; if (langClient.initializeResult) { const { experimental } = langClient.initializeResult!.capabilities; if (experimental && experimental.introspection && experimental.introspection.port > 0) { @@ -319,7 +320,7 @@ async function getModifiedConfigs(workspaceFolder: WorkspaceFolder, config: Debu } if (config.terminal) { - var balVersion: decimal = parseFloat(ballerinaExtInstance.ballerinaVersion); + var balVersion: decimal = parseFloat(extension.ballerinaExtInstance.ballerinaVersion); if (balVersion < 2201.3) { window.showWarningMessage(OLD_BALLERINA_VERSION_DEBUGGER_RUNINTERMINAL); } else if (config.terminal.toLowerCase() === "external") { @@ -350,7 +351,7 @@ export async function constructDebugConfig(uri: Uri, testDebug: boolean, args?: const debugConfigs: DebugConfiguration[] = launchConfig.configurations; if (debugConfigs.length == 0) { - const initialConfigurations: DebugConfiguration[] = ballerinaExtInstance.extension.packageJSON.contributes.debuggers[0].initialConfigurations; + const initialConfigurations: DebugConfiguration[] = extension.ballerinaExtInstance.extension.packageJSON.contributes.debuggers[0].initialConfigurations; debugConfigs.push(...initialConfigurations); launchConfig.update('configurations', debugConfigs, ConfigurationTarget.WorkspaceFolder, true); @@ -377,7 +378,7 @@ export async function constructDebugConfig(uri: Uri, testDebug: boolean, args?: } export function activateDebugConfigProvider(ballerinaExtInstance: BallerinaExtension) { - let context = ballerinaExtInstance.context; + let context = extension.ballerinaExtInstance.context; context.subscriptions.push(debug.registerDebugConfigurationProvider('ballerina', new DebugConfigProvider())); @@ -492,7 +493,7 @@ class BallerinaDebugAdapterTrackerFactory implements DebugAdapterTrackerFactory const workspaceRoot = workspace.workspaceFolders && workspace.workspaceFolders[0].uri.fsPath; if (workspaceRoot) { // Get the component list - const components: BallerinaProjectComponents = await ballerinaExtInstance?.langClient?.getBallerinaProjectComponents({ + const components: BallerinaProjectComponents = await extension.ballerinaExtInstance?.langClient?.getBallerinaProjectComponents({ documentIdentifiers: [{ uri: URI.file(workspaceRoot).toString() }] }); @@ -566,14 +567,14 @@ class BallerinaDebugAdapterDescriptorFactory implements DebugAdapterDescriptorFa async createDebugAdapterDescriptor(session: DebugSession, executable: DebugAdapterExecutable | undefined): Promise { // Check if the project contains errors(and fix the possible ones) before starting the debug session - const langClient = ballerinaExtInstance.langClient; + const langClient = extension.ballerinaExtInstance.langClient; const projectRoot = await getCurrentRoot(); await cleanAndValidateProject(langClient, projectRoot); // Check if config generation is required before starting the debug session - await prepareAndGenerateConfig(ballerinaExtInstance, session.configuration.script, false, StateMachine.context().isBI, false); + await prepareAndGenerateConfig(extension.ballerinaExtInstance, session.configuration.script, false, StateMachine.context().isBI, false); - if (session.configuration.noDebug && ballerinaExtInstance.enabledRunFast()) { + if (session.configuration.noDebug && extension.ballerinaExtInstance.enabledRunFast()) { return new Promise((resolve) => { resolve(new DebugAdapterInlineImplementation(new FastRunDebugAdapter())); }); @@ -596,7 +597,7 @@ class BallerinaDebugAdapterDescriptorFactory implements DebugAdapterDescriptorFa opt.env = Object.assign({}, process.env, configEnv); try { - log(`Starting debug adapter: '${this.ballerinaExtInstance.getBallerinaCmd()} start-debugger-adapter ${port.toString()}`); + log(`Starting debug adapter: '${extension.ballerinaExtInstance.getBallerinaCmd()} start-debugger-adapter ${port.toString()}`); const serverProcess = child_process.spawn(cmd, args, opt); await new Promise((resolve) => { @@ -611,17 +612,17 @@ class BallerinaDebugAdapterDescriptorFactory implements DebugAdapterDescriptorFa debugLog(`${data}`); }); }); - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_START_DEBUG_SESSION, CMP_DEBUGGER); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_START_DEBUG_SESSION, CMP_DEBUGGER); this.registerLogTraceNotificationHandler(session); return new DebugAdapterServer(port); } catch (error) { - sendTelemetryException(ballerinaExtInstance, error as Error, CMP_DEBUGGER); + sendTelemetryException(extension.ballerinaExtInstance, error as Error, CMP_DEBUGGER); return await Promise.reject(error); } } private registerLogTraceNotificationHandler(session: DebugSession) { - const langClient = ballerinaExtInstance.langClient; + const langClient = extension.ballerinaExtInstance.langClient; const notificationHandler = langClient.onNotification('$/logTrace', (params: any) => { if (params.verbose === "stopped") { // do nothing @@ -636,10 +637,10 @@ class BallerinaDebugAdapterDescriptorFactory implements DebugAdapterDescriptorFa } getScriptPath(args: string[]): string { args.push('start-debugger-adapter'); - return this.ballerinaExtInstance.getBallerinaCmd(); + return extension.ballerinaExtInstance.getBallerinaCmd(); } getCurrentWorkingDir(): string { - return path.join(this.ballerinaExtInstance.ballerinaHome, "bin"); + return path.join(extension.ballerinaExtInstance.ballerinaHome, "bin"); } } @@ -650,7 +651,7 @@ class FastRunDebugAdapter extends LoggingDebugSession { programArgs: string[] = []; protected launchRequest(response: DebugProtocol.LaunchResponse, args: DebugProtocol.LaunchRequestArguments, request?: DebugProtocol.Request): void { - const langClient = ballerinaExtInstance.langClient; + const langClient = extension.ballerinaExtInstance.langClient; const notificationHandler = langClient.onNotification('$/logTrace', (params: any) => { if (params.verbose === "stopped") { // even if a single channel (stderr,stdout) stopped, we stop the debug session notificationHandler!.dispose(); @@ -694,14 +695,14 @@ class BIRunAdapter extends LoggingDebugSession { task: 'run' }; - const ballerinaHome = ballerinaExtInstance.getConfiguredBallerinaHome(); - const pluginDevModeEnabled = ballerinaExtInstance.overrideBallerinaHome(); + const ballerinaHome = extension.ballerinaExtInstance.getConfiguredBallerinaHome(); + const pluginDevModeEnabled = extension.ballerinaExtInstance.overrideBallerinaHome(); let runCommand: string; if (pluginDevModeEnabled && ballerinaHome) { - runCommand = path.join(ballerinaHome, 'bin', ballerinaExtInstance.getBallerinaCmd()); + runCommand = path.join(ballerinaHome, 'bin', extension.ballerinaExtInstance.getBallerinaCmd()); } else { - runCommand = ballerinaExtInstance.getBallerinaCmd(); + runCommand = extension.ballerinaExtInstance.getBallerinaCmd(); } runCommand += ' run'; @@ -710,7 +711,7 @@ class BIRunAdapter extends LoggingDebugSession { runCommand = `${runCommand} -- ${programArgs.join(' ')}`; } - if (isSupportedSLVersion(ballerinaExtInstance, 2201130) && ballerinaExtInstance.enabledExperimentalFeatures()) { + if (isSupportedSLVersion(extension.ballerinaExtInstance, 2201130) && extension.ballerinaExtInstance.enabledExperimentalFeatures()) { runCommand = `${runCommand} --experimental`; } @@ -776,7 +777,7 @@ async function runFast(root: string, options: { debugPort?: number; env?: Map { - return await ballerinaExtInstance.langClient.executeCommand({ + return await extension.ballerinaExtInstance.langClient.executeCommand({ command: "STOP", arguments: [ { key: "path", value: root! }] }); diff --git a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/add.ts b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/add.ts index 848df90dd81..968f564e229 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/add.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/add.ts @@ -16,7 +16,8 @@ * under the License. */ -import { ballerinaExtInstance, LANGUAGE } from "../../../core"; +import { LANGUAGE } from "../../../core"; +import { extension } from "../../../BalExtensionContext"; import { commands, window } from "vscode"; import { TM_EVENT_PROJECT_ADD, TM_EVENT_ERROR_EXECUTE_PROJECT_ADD, CMP_PROJECT_ADD, sendTelemetryEvent, sendTelemetryException, getMessageObject @@ -28,18 +29,18 @@ function activateAddCommand() { // register ballerina add handler commands.registerCommand(PALETTE_COMMANDS.ADD, async () => { try { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_PROJECT_ADD, CMP_PROJECT_ADD); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_PROJECT_ADD, CMP_PROJECT_ADD); if (window.activeTextEditor && window.activeTextEditor.document.languageId != LANGUAGE.BALLERINA) { window.showErrorMessage(MESSAGES.NOT_IN_PROJECT); return; } - const currentProject = ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await - getCurrentBallerinaProject(ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) + const currentProject = extension.ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await + getCurrentBallerinaProject(extension.ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) : await getCurrentBallerinaProject(); if (currentProject.kind === PROJECT_TYPE.SINGLE_FILE || !currentProject.path) { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_ERROR_EXECUTE_PROJECT_ADD, CMP_PROJECT_ADD, + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_ERROR_EXECUTE_PROJECT_ADD, CMP_PROJECT_ADD, getMessageObject(MESSAGES.NOT_IN_PROJECT)); window.showErrorMessage(MESSAGES.NOT_IN_PROJECT); return; @@ -47,13 +48,13 @@ function activateAddCommand() { const moduleName = await window.showInputBox({ placeHolder: MESSAGES.MODULE_NAME }); if (moduleName && moduleName.trim().length > 0) { - runCommand(currentProject, ballerinaExtInstance.getBallerinaCmd(), BALLERINA_COMMANDS.ADD, + runCommand(currentProject, extension.ballerinaExtInstance.getBallerinaCmd(), BALLERINA_COMMANDS.ADD, moduleName); } } catch (error) { if (error instanceof Error) { - sendTelemetryException(ballerinaExtInstance, error, CMP_PROJECT_ADD); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_PROJECT_ADD); window.showErrorMessage(error.message); } else { window.showErrorMessage("Unkown error occurred."); diff --git a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/build.ts b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/build.ts index e282a6b7af2..50eb77e5998 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/build.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/build.ts @@ -16,7 +16,8 @@ * under the License. */ -import { ballerinaExtInstance, LANGUAGE } from "../../../core"; +import { LANGUAGE } from "../../../core"; +import { extension } from "../../../BalExtensionContext"; import { commands, window } from "vscode"; import { TM_EVENT_PROJECT_BUILD, CMP_PROJECT_BUILD, sendTelemetryEvent, sendTelemetryException @@ -31,34 +32,34 @@ export function activateBuildCommand() { // register run project build handler commands.registerCommand(PALETTE_COMMANDS.BUILD, async () => { try { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_PROJECT_BUILD, CMP_PROJECT_BUILD); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_PROJECT_BUILD, CMP_PROJECT_BUILD); if (window.activeTextEditor && window.activeTextEditor.document.languageId != LANGUAGE.BALLERINA) { window.showErrorMessage(MESSAGES.NOT_IN_PROJECT); return; } - const currentProject = ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await - getCurrentBallerinaProject(ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) + const currentProject = extension.ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await + getCurrentBallerinaProject(extension.ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) : await getCurrentBallerinaProject(); let balCommand = BALLERINA_COMMANDS.BUILD; - if (isSupportedSLVersion(ballerinaExtInstance, 2201130) && ballerinaExtInstance.enabledExperimentalFeatures()) { + if (isSupportedSLVersion(extension.ballerinaExtInstance, 2201130) && extension.ballerinaExtInstance.enabledExperimentalFeatures()) { balCommand = BALLERINA_COMMANDS.BUILD_WITH_EXPERIMENTAL; } if (currentProject.kind !== PROJECT_TYPE.SINGLE_FILE) { - runCommand(currentProject, ballerinaExtInstance.getBallerinaCmd(), balCommand, + runCommand(currentProject, extension.ballerinaExtInstance.getBallerinaCmd(), balCommand, currentProject.path!); } else { - runCommand(getCurrenDirectoryPath(), ballerinaExtInstance.getBallerinaCmd(), + runCommand(getCurrenDirectoryPath(), extension.ballerinaExtInstance.getBallerinaCmd(), balCommand, getCurrentBallerinaFile()); } } catch (error) { if (error instanceof Error) { - sendTelemetryException(ballerinaExtInstance, error, CMP_PROJECT_BUILD); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_PROJECT_BUILD); window.showErrorMessage(error.message); } else { window.showErrorMessage("Unkown error occurred."); 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 4280e2e0392..29fc636363e 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/cloud.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/cloud.ts @@ -16,7 +16,8 @@ * under the License. */ -import { ballerinaExtInstance, LANGUAGE } from "../../../core"; +import { LANGUAGE } from "../../../core"; +import { extension } from "../../../BalExtensionContext"; import { commands, window } from "vscode"; import { outputChannel } from "../../../utils"; import { @@ -35,16 +36,16 @@ export function activateCloudCommand() { // register create Cloud.toml command handler commands.registerCommand(PALETTE_COMMANDS.CLOUD, async () => { try { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_PROJECT_CLOUD, CMP_PROJECT_CLOUD); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_PROJECT_CLOUD, CMP_PROJECT_CLOUD); if (window.activeTextEditor && window.activeTextEditor.document.languageId != LANGUAGE.BALLERINA) { window.showErrorMessage(MESSAGES.NOT_IN_PROJECT); return; } - const isDiagram: boolean = ballerinaExtInstance.getDocumentContext().isActiveDiagram(); + const isDiagram: boolean = extension.ballerinaExtInstance.getDocumentContext().isActiveDiagram(); const currentProject = isDiagram ? await - getCurrentBallerinaProject(ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) + getCurrentBallerinaProject(extension.ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) : await getCurrentBallerinaProject(); if (currentProject.kind !== PROJECT_TYPE.SINGLE_FILE) { @@ -53,27 +54,27 @@ export function activateCloudCommand() { if (!fs.existsSync(cloudTomlPath)) { const commandArgs = { key: "uri", - value: isDiagram ? ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString() + 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(ballerinaExtInstance, TM_EVENT_ERROR_EXECUTE_PROJECT_CLOUD, + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_ERROR_EXECUTE_PROJECT_CLOUD, CMP_PROJECT_CLOUD, getMessageObject(message)); window.showErrorMessage(message); } } } else { const message = `Cloud.toml is not supported for single file projects.`; - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_ERROR_EXECUTE_PROJECT_CLOUD, CMP_PROJECT_CLOUD, + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_ERROR_EXECUTE_PROJECT_CLOUD, CMP_PROJECT_CLOUD, getMessageObject(message)); window.showErrorMessage(message); } } catch (error) { if (error instanceof Error) { - sendTelemetryException(ballerinaExtInstance, error, CMP_PROJECT_CLOUD); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_PROJECT_CLOUD); window.showErrorMessage(error.message); } else { window.showErrorMessage("Unkown error occurred."); diff --git a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/cmd-runner.ts b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/cmd-runner.ts index 43fed68700d..8dcdc8a3c69 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/cmd-runner.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/cmd-runner.ts @@ -19,7 +19,7 @@ import { BallerinaProject } from "@wso2/ballerina-core"; import { Terminal, window, workspace } from "vscode"; import { isSupportedSLVersion, isWindows } from "../../../utils"; -import { ballerinaExtInstance } from "../../../core"; +import { extension } from "../../../BalExtensionContext"; export const PALETTE_COMMANDS = { @@ -195,9 +195,9 @@ export function createTerminal(path: string, env?: { [key: string]: string }): v } export function getRunCommand(): BALLERINA_COMMANDS { - if (isSupportedSLVersion(ballerinaExtInstance, 2201130) && ballerinaExtInstance.enabledExperimentalFeatures()) { + if (isSupportedSLVersion(extension.ballerinaExtInstance, 2201130) && extension.ballerinaExtInstance.enabledExperimentalFeatures()) { return BALLERINA_COMMANDS.RUN_WITH_EXPERIMENTAL; - } else if (ballerinaExtInstance.enabledLiveReload()) { + } else if (extension.ballerinaExtInstance.enabledLiveReload()) { return BALLERINA_COMMANDS.RUN_WITH_WATCH; } return BALLERINA_COMMANDS.RUN; 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 1dec715093a..d8787db53b1 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/configRun.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/configRun.ts @@ -17,17 +17,17 @@ */ import { commands, languages, Uri, window, workspace } from "vscode"; -import { BALLERINA_COMMANDS, getRunCommand, PALETTE_COMMANDS, runCommand } from "./cmd-runner"; -import { ballerinaExtInstance } from "../../../core"; +import { getRunCommand, 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"; function activateConfigRunCommand() { // register the config view run command commands.registerCommand(PALETTE_COMMANDS.RUN_CONFIG, async (filePath: Uri) => { - const currentProject = ballerinaExtInstance.getDocumentContext().getCurrentProject(); + const currentProject = extension.ballerinaExtInstance.getDocumentContext().getCurrentProject(); if (currentProject) { - runCommand(currentProject, ballerinaExtInstance.getBallerinaCmd(), + runCommand(currentProject, extension.ballerinaExtInstance.getBallerinaCmd(), getRunCommand(), currentProject.path!); return; @@ -54,10 +54,10 @@ function activateConfigRunCommand() { languages.registerCompletionItemProvider({ language: 'toml' }, { async provideCompletionItems(document, position, token, context) { - const currentProject = ballerinaExtInstance.getDocumentContext().getCurrentProject(); + const currentProject = extension.ballerinaExtInstance.getDocumentContext().getCurrentProject(); const filePath = window.activeTextEditor.document; const path = filePath.uri.fsPath; - const suggestions = await getConfigCompletions(ballerinaExtInstance, currentProject ? currentProject.path! : path, document, position); + const suggestions = await getConfigCompletions(extension.ballerinaExtInstance, currentProject ? currentProject.path! : path, document, position); return suggestions; } }); 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 165bc1f5d70..45580f45267 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/doc.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/doc.ts @@ -16,7 +16,7 @@ * under the License. */ -import { ballerinaExtInstance, LANGUAGE } from "../../../core"; +import { extension } from "../../../BalExtensionContext"; import { commands, window } from "vscode"; import { TM_EVENT_PROJECT_DOC, TM_EVENT_ERROR_EXECUTE_PROJECT_DOC, CMP_PROJECT_DOC, sendTelemetryEvent, @@ -25,33 +25,34 @@ import { } from "../../telemetry"; import { runCommand, BALLERINA_COMMANDS, MESSAGES, PROJECT_TYPE, PALETTE_COMMANDS } from "./cmd-runner"; import { getCurrentBallerinaProject } from "../../../utils/project-utils"; +import { LANGUAGE } from "../../../core"; function activateDocCommand() { // register ballerina doc handler commands.registerCommand(PALETTE_COMMANDS.DOC, async () => { try { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_PROJECT_DOC, CMP_PROJECT_DOC); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_PROJECT_DOC, CMP_PROJECT_DOC); if (window.activeTextEditor && window.activeTextEditor.document.languageId != LANGUAGE.BALLERINA) { window.showErrorMessage(MESSAGES.NOT_IN_PROJECT); return; } - const currentProject = await ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await - getCurrentBallerinaProject(ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) + const currentProject = await extension.ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await + getCurrentBallerinaProject(extension.ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) : await getCurrentBallerinaProject(); if (currentProject.kind === PROJECT_TYPE.SINGLE_FILE) { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_ERROR_EXECUTE_PROJECT_DOC, CMP_PROJECT_DOC, + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_ERROR_EXECUTE_PROJECT_DOC, CMP_PROJECT_DOC, getMessageObject(MESSAGES.NOT_IN_PROJECT)); window.showErrorMessage(MESSAGES.NOT_IN_PROJECT); return; } - runCommand(currentProject, ballerinaExtInstance.getBallerinaCmd(), BALLERINA_COMMANDS.DOC, + runCommand(currentProject, extension.ballerinaExtInstance.getBallerinaCmd(), BALLERINA_COMMANDS.DOC, currentProject.path!); } catch (error) { if (error instanceof Error) { - sendTelemetryException(ballerinaExtInstance, error, CMP_PROJECT_DOC); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_PROJECT_DOC); window.showErrorMessage(error.message); } else { window.showErrorMessage("Unkown error occurred."); diff --git a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/json-to-record.ts b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/json-to-record.ts index d38554cd284..20e8d51634e 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/json-to-record.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/json-to-record.ts @@ -20,48 +20,48 @@ import { sendTelemetryEvent, sendTelemetryException, TM_EVENT_PASTE_AS_RECORD, CMP_JSON_TO_RECORD, } from "../../telemetry"; import { commands, window, env } from "vscode"; -import { ballerinaExtInstance, DIAGNOSTIC_SEVERITY } from "../../../core"; +import { extension } from "../../../BalExtensionContext"; import { PALETTE_COMMANDS, MESSAGES } from "./cmd-runner"; -import { JsonToRecord } from "@wso2/ballerina-core"; +import { DIAGNOSTIC_SEVERITY, JsonToRecord } from "@wso2/ballerina-core"; const MSG_NOT_SUPPORT = "Paste JSON as a Ballerina record feature is not supported"; export function activatePasteJsonAsRecord() { - if (!ballerinaExtInstance.langClient) { + if (!extension.ballerinaExtInstance.langClient) { return; } commands.registerCommand(PALETTE_COMMANDS.PASTE_JSON_AS_RECORD, () => { // This command is only available since Swan Lake Beta 2 // Check the version before registering the command - const balVersion = ballerinaExtInstance.ballerinaVersion.toLowerCase(); + const balVersion = extension.ballerinaExtInstance.ballerinaVersion.toLowerCase(); if (!balVersion.includes("alpha") && !balVersion.includes("preview")) { if (balVersion.includes("beta")) { // check if SL Beta version >= 2 - const digits = ballerinaExtInstance.ballerinaVersion.replace(/[^0-9]/g, ""); + const digits = extension.ballerinaExtInstance.ballerinaVersion.replace(/[^0-9]/g, ""); const versionNumber = +digits; if (versionNumber < 2) { - window.showErrorMessage(`${MSG_NOT_SUPPORT} in ${ballerinaExtInstance.ballerinaVersion}`); + window.showErrorMessage(`${MSG_NOT_SUPPORT} in ${extension.ballerinaExtInstance.ballerinaVersion}`); return; } } } else { - window.showErrorMessage(`${MSG_NOT_SUPPORT} in ${ballerinaExtInstance.ballerinaVersion}`); + window.showErrorMessage(`${MSG_NOT_SUPPORT} in ${extension.ballerinaExtInstance.ballerinaVersion}`); return; } if (!window.activeTextEditor || !window.activeTextEditor?.document.fileName.endsWith('.bal')) { window.showErrorMessage("Target is not a Ballerina file!"); return; } - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_PASTE_AS_RECORD, CMP_JSON_TO_RECORD); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_PASTE_AS_RECORD, CMP_JSON_TO_RECORD); env.clipboard.readText() .then(clipboardText => { - if (!ballerinaExtInstance.langClient) { + if (!extension.ballerinaExtInstance.langClient) { window.showErrorMessage("Ballerina language client not found."); return; } - ballerinaExtInstance.langClient!.convertJsonToRecord({ jsonString: clipboardText, isClosed: false, isRecordTypeDesc: false, recordName: "", forceFormatRecordFields: false }) + extension.ballerinaExtInstance.langClient!.convertJsonToRecord({ jsonString: clipboardText, isClosed: false, isRecordTypeDesc: false, recordName: "", forceFormatRecordFields: false }) .then(lSResponse => { const response = lSResponse as JsonToRecord; if (!response) { @@ -96,12 +96,12 @@ export function activatePasteJsonAsRecord() { }, error => { window.showErrorMessage(error.message); - sendTelemetryException(ballerinaExtInstance, error, CMP_JSON_TO_RECORD); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_JSON_TO_RECORD); }); }, error => { window.showErrorMessage(error.message); - sendTelemetryException(ballerinaExtInstance, error, CMP_JSON_TO_RECORD); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_JSON_TO_RECORD); }); }); } 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 394cd10a040..89d55cca0f1 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/pack.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/pack.ts @@ -16,7 +16,7 @@ * under the License. */ -import { ballerinaExtInstance, LANGUAGE } from "../../../core"; +import { extension } from "../../../BalExtensionContext"; import { commands, window } from "vscode"; import { CMP_PROJECT_PACK, sendTelemetryEvent, sendTelemetryException, TM_EVENT_PROJECT_PACK @@ -25,23 +25,24 @@ import { runCommand, BALLERINA_COMMANDS, PROJECT_TYPE, PALETTE_COMMANDS, MESSAGE from "./cmd-runner"; import { getCurrentBallerinaProject } from "../../../utils/project-utils"; +import { LANGUAGE } from "../../../core"; export function activatePackCommand() { // register run project build handler commands.registerCommand(PALETTE_COMMANDS.PACK, async () => { try { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_PROJECT_PACK, CMP_PROJECT_PACK); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_PROJECT_PACK, CMP_PROJECT_PACK); if (window.activeTextEditor && window.activeTextEditor.document.languageId != LANGUAGE.BALLERINA) { window.showErrorMessage(MESSAGES.NOT_IN_PROJECT); return; } - const currentProject = ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await - getCurrentBallerinaProject(ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) + const currentProject = extension.ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await + getCurrentBallerinaProject(extension.ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) : await getCurrentBallerinaProject(); if (currentProject.kind !== PROJECT_TYPE.SINGLE_FILE) { - runCommand(currentProject, ballerinaExtInstance.getBallerinaCmd(), BALLERINA_COMMANDS.PACK, + runCommand(currentProject, extension.ballerinaExtInstance.getBallerinaCmd(), BALLERINA_COMMANDS.PACK, currentProject.path!); } else { window.showErrorMessage(MESSAGES.INVALID_PACK); @@ -49,7 +50,7 @@ export function activatePackCommand() { } catch (error) { if (error instanceof Error) { - sendTelemetryException(ballerinaExtInstance, error, CMP_PROJECT_PACK); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_PROJECT_PACK); window.showErrorMessage(error.message); } else { window.showErrorMessage("Unkown error occurred."); diff --git a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/run.ts b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/run.ts index 731bf7c2666..55733dc3d59 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/run.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/run.ts @@ -16,7 +16,7 @@ * under the License. */ -import { ballerinaExtInstance, LANGUAGE } from "../../../core"; +import { extension } from "../../../BalExtensionContext"; import { commands, Uri, window } from "vscode"; import { TM_EVENT_PROJECT_RUN, CMP_PROJECT_RUN, sendTelemetryEvent, sendTelemetryException @@ -24,11 +24,12 @@ import { import { runCommand, BALLERINA_COMMANDS, PROJECT_TYPE, PALETTE_COMMANDS, runCommandWithConf, MESSAGES, getRunCommand } from "./cmd-runner"; import { getCurrentBallerinaProject, getCurrentBallerinaFile, getCurrenDirectoryPath } from "../../../utils/project-utils"; import { prepareAndGenerateConfig } from '../../config-generator/configGenerator'; +import { LANGUAGE } from "../../../core"; function activateRunCmdCommand() { commands.registerCommand(PALETTE_COMMANDS.RUN, async (filePath: Uri) => { - prepareAndGenerateConfig(ballerinaExtInstance, filePath?.fsPath); + prepareAndGenerateConfig(extension.ballerinaExtInstance, filePath?.fsPath); }); // register ballerina run handler @@ -38,7 +39,7 @@ function activateRunCmdCommand() { async function run(args: any[]) { try { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_PROJECT_RUN, CMP_PROJECT_RUN); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_PROJECT_RUN, CMP_PROJECT_RUN); if (window.activeTextEditor && window.activeTextEditor.document.isDirty) { await commands.executeCommand(PALETTE_COMMANDS.SAVE_ALL); } @@ -51,7 +52,7 @@ function activateRunCmdCommand() { } currentProject = await getCurrentBallerinaProject(); } else { - const document = ballerinaExtInstance.getDocumentContext().getLatestDocument(); + const document = extension.ballerinaExtInstance.getDocumentContext().getLatestDocument(); if (document) { currentProject = await getCurrentBallerinaProject(document.fsPath); } else { @@ -70,9 +71,9 @@ function activateRunCmdCommand() { } if (currentProject.kind !== PROJECT_TYPE.SINGLE_FILE) { - const configPath: string = ballerinaExtInstance.getBallerinaConfigPath(); - ballerinaExtInstance.setBallerinaConfigPath(''); - runCommandWithConf(currentProject, ballerinaExtInstance.getBallerinaCmd(), + const configPath: string = extension.ballerinaExtInstance.getBallerinaConfigPath(); + extension.ballerinaExtInstance.setBallerinaConfigPath(''); + runCommandWithConf(currentProject, extension.ballerinaExtInstance.getBallerinaCmd(), getRunCommand(), configPath, currentProject.path!, ...args); } else { @@ -81,7 +82,7 @@ function activateRunCmdCommand() { } catch (error) { if (error instanceof Error) { - sendTelemetryException(ballerinaExtInstance, error, CMP_PROJECT_RUN); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_PROJECT_RUN); window.showErrorMessage(error.message); } else { window.showErrorMessage("Unkown error occurred."); @@ -91,7 +92,7 @@ function activateRunCmdCommand() { } function runCurrentFile() { - runCommand(getCurrenDirectoryPath(), ballerinaExtInstance.getBallerinaCmd(), + runCommand(getCurrenDirectoryPath(), extension.ballerinaExtInstance.getBallerinaCmd(), getRunCommand(), getCurrentBallerinaFile()); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/test.ts b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/test.ts index 01c8b79d09b..66522c964e8 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/test.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/test.ts @@ -16,7 +16,7 @@ * under the License. */ -import { ballerinaExtInstance, LANGUAGE } from "../../../core"; +import { extension } from "../../../BalExtensionContext"; import { commands, window } from "vscode"; import { TM_EVENT_PROJECT_TEST, CMP_PROJECT_TEST, sendTelemetryEvent, sendTelemetryException @@ -24,12 +24,13 @@ import { import { runCommand, BALLERINA_COMMANDS, PROJECT_TYPE, PALETTE_COMMANDS, MESSAGES } from "./cmd-runner"; import { getCurrentBallerinaProject, getCurrentBallerinaFile, getCurrenDirectoryPath } from "../../../utils/project-utils"; +import { LANGUAGE } from "../../../core"; export function activateTestRunner() { // register run project tests handler commands.registerCommand(PALETTE_COMMANDS.TEST, async (...args: any[]) => { try { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_PROJECT_TEST, CMP_PROJECT_TEST); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_PROJECT_TEST, CMP_PROJECT_TEST); if (window.activeTextEditor && window.activeTextEditor.document.isDirty) { await commands.executeCommand(PALETTE_COMMANDS.SAVE_ALL); } @@ -39,19 +40,19 @@ export function activateTestRunner() { return; } // get Ballerina Project path for current Ballerina file - const currentProject = await ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await - getCurrentBallerinaProject(ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) + const currentProject = await extension.ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await + getCurrentBallerinaProject(extension.ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) : await getCurrentBallerinaProject(); if (currentProject.kind !== PROJECT_TYPE.SINGLE_FILE) { - runCommand(currentProject, ballerinaExtInstance.getBallerinaCmd(), BALLERINA_COMMANDS.TEST, + runCommand(currentProject, extension.ballerinaExtInstance.getBallerinaCmd(), BALLERINA_COMMANDS.TEST, ...args, currentProject.path!); } else { - runCommand(getCurrenDirectoryPath(), ballerinaExtInstance.getBallerinaCmd(), + runCommand(getCurrenDirectoryPath(), extension.ballerinaExtInstance.getBallerinaCmd(), BALLERINA_COMMANDS.TEST, ...args, getCurrentBallerinaFile()); } } catch (error) { if (error instanceof Error) { - sendTelemetryException(ballerinaExtInstance, error, CMP_PROJECT_TEST); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_PROJECT_TEST); window.showErrorMessage(error.message); } else { window.showErrorMessage("Unkown error occurred."); diff --git a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/xml-to-record.ts b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/xml-to-record.ts index 6cd8ed89f51..294569cef24 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/xml-to-record.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/xml-to-record.ts @@ -20,37 +20,37 @@ import { sendTelemetryEvent, sendTelemetryException, TM_EVENT_PASTE_AS_RECORD, CMP_XML_TO_RECORD, } from "../../telemetry"; import { commands, window, env } from "vscode"; -import { ballerinaExtInstance, DIAGNOSTIC_SEVERITY } from "../../../core"; +import { extension } from "../../../BalExtensionContext"; import { PALETTE_COMMANDS, MESSAGES } from "./cmd-runner"; import { isSupportedSLVersion } from "../../../utils"; -import { XMLToRecord } from "@wso2/ballerina-core"; +import { DIAGNOSTIC_SEVERITY, XMLToRecord } from "@wso2/ballerina-core"; const MSG_NOT_SUPPORT = "Paste XML as a Ballerina record feature is not supported"; export function activatePasteXMLAsRecord() { - if (!ballerinaExtInstance.langClient) { + if (!extension.ballerinaExtInstance.langClient) { return; } commands.registerCommand(PALETTE_COMMANDS.PASTE_XML_AS_RECORD, () => { // This command is only available since Swan Lake Update 7 patch 2 - if (!isSupportedSLVersion(ballerinaExtInstance, 220172)) { - window.showErrorMessage(`${MSG_NOT_SUPPORT} in ${ballerinaExtInstance.ballerinaVersion}`); + if (!isSupportedSLVersion(extension.ballerinaExtInstance, 220172)) { + window.showErrorMessage(`${MSG_NOT_SUPPORT} in ${extension.ballerinaExtInstance.ballerinaVersion}`); return; } if (!window.activeTextEditor || !window.activeTextEditor?.document.fileName.endsWith('.bal')) { window.showErrorMessage("Target is not a Ballerina file!"); return; } - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_PASTE_AS_RECORD, CMP_XML_TO_RECORD); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_PASTE_AS_RECORD, CMP_XML_TO_RECORD); env.clipboard.readText() .then(clipboardText => { - if (!ballerinaExtInstance.langClient) { + if (!extension.ballerinaExtInstance.langClient) { window.showErrorMessage("Ballerina language client not found."); return; } - ballerinaExtInstance.langClient.convertXMLToRecord({ + extension.ballerinaExtInstance.langClient.convertXMLToRecord({ xmlValue: clipboardText, isClosed: false, isRecordTypeDesc: false, @@ -91,13 +91,13 @@ export function activatePasteXMLAsRecord() { }); error => { window.showErrorMessage(error.message); - sendTelemetryException(ballerinaExtInstance, error, CMP_XML_TO_RECORD); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_XML_TO_RECORD); }; }); }, error => { window.showErrorMessage(error.message); - sendTelemetryException(ballerinaExtInstance, error, CMP_XML_TO_RECORD); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_XML_TO_RECORD); }); }); } 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 aa9ea9171f7..cc31b0a2d61 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/discover.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/discover.ts @@ -25,10 +25,10 @@ import { Position, Range, TestController, Uri, TestItem, commands } from "vscode let groups: string[] = []; -export async function discoverTestFunctionsInProject(ballerinaExtInstance: BallerinaExtension, +export async function discoverTestFunctionsInProject(ballerinaExtInstance: BallerinaExtension, testController: TestController) { groups.push(testController.id); - const filePath : string = path.join(StateMachine.context().projectUri); + const filePath: string = path.join(StateMachine.context().projectUri); const request: TestsDiscoveryRequest = { filePath }; @@ -55,7 +55,7 @@ function createTests(response: TestsDiscoveryResponse, testController: TestContr for (const [group, testFunctions] of entries) { // Create a test item for the group const groupId = `group:${group}`; - let groupItem : TestItem = testController.items.get(groupId); + let groupItem: TestItem = testController.items.get(groupId); if (!groupItem) { // If the group doesn't exist, create it @@ -65,16 +65,16 @@ function createTests(response: TestsDiscoveryResponse, testController: TestContr } // Ensure testFunctions is iterable (convert to an array if necessary) - const testFunctionsArray = Array.isArray(testFunctions) - ? testFunctions // If it's already an array, use it directly - : Object.values(testFunctions); // If it's an object, convert to an array + const testFunctionsArray = Array.isArray(testFunctions) + ? testFunctions // If it's already an array, use it directly + : Object.values(testFunctions); // If it's an object, convert to an array // Iterate over the test functions in the group for (const tf of testFunctionsArray) { - const testFunc : FunctionTreeNode = tf as FunctionTreeNode; + const testFunc: FunctionTreeNode = tf as FunctionTreeNode; // Generate a unique ID for the test item using the function name const fileName: string = testFunc.lineRange.fileName; - const fileUri = Uri.file(path.join(projectDir, fileName)); + const fileUri = Uri.file(path.join(projectDir, fileName)); const testId = `test:${path.basename(fileUri.path)}:${testFunc.functionName}`; // Create a test item for the test function @@ -95,12 +95,12 @@ function createTests(response: TestsDiscoveryResponse, testController: TestContr groupItem.children.add(testItem); } } - } + } } -export async function handleFileChange(ballerinaExtInstance: BallerinaExtension, - uri: Uri, testController: TestController) { +export async function handleFileChange(ballerinaExtInstance: BallerinaExtension, + uri: Uri, testController: TestController) { const request: TestsDiscoveryRequest = { filePath: uri.path }; diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/runner.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/runner.ts index b1363a6882c..e6c03cd9b4e 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/runner.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/runner.ts @@ -22,7 +22,7 @@ import { CancellationToken, TestRunRequest, TestMessage, TestRun, TestItem, debu import { testController } from './activator'; import { StateMachine } from "../../stateMachine"; import { isTestFunctionItem, isTestGroupItem } from './discover'; -import { ballerinaExtInstance } from '../../core'; +import { extension } from '../../BalExtensionContext'; import { constructDebugConfig } from "../debugger"; const fs = require('fs'); import path from 'path'; @@ -58,7 +58,7 @@ export async function runHandler(request: TestRunRequest, token: CancellationTok run.started(test); let command: string; - const executor = ballerinaExtInstance.getBallerinaCmd(); + const executor = extension.ballerinaExtInstance.getBallerinaCmd(); if (isTestGroupItem(test)) { let testCaseNames: string[] = []; let testItems : TestItem[] = []; 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 e163771284b..8415c251363 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 @@ -151,7 +151,6 @@ import { import { DebugProtocol } from "vscode-debugprotocol"; import { extension } from "../../BalExtensionContext"; import { notifyBreakpointChange } from "../../RPCLayer"; -import { ballerinaExtInstance } from "../../core"; import { BreakpointManager } from "../../features/debugger/breakpoint-manager"; import { StateMachine, updateView } from "../../stateMachine"; import { getCompleteSuggestions } from '../../utils/ai/completions'; @@ -400,7 +399,7 @@ export class BiDiagramRpcManager implements BIDiagramAPI { return new Promise(async (resolve) => { const { filePath, position, prompt } = params; - const enableAiSuggestions = ballerinaExtInstance.enableAiSuggestions(); + const enableAiSuggestions = extension.ballerinaExtInstance.enableAiSuggestions(); if (!enableAiSuggestions) { resolve(undefined); return; @@ -609,7 +608,7 @@ export class BiDiagramRpcManager implements BIDiagramAPI { async getConfigVariablesV2(): Promise { return new Promise(async (resolve) => { const projectPath = path.join(StateMachine.context().projectUri); - const showLibraryConfigVariables = ballerinaExtInstance.showLibraryConfigVariables(); + const showLibraryConfigVariables = extension.ballerinaExtInstance.showLibraryConfigVariables(); const variables = await StateMachine.langClient().getConfigVariablesV2({ projectPath: projectPath, includeLibraries: showLibraryConfigVariables !== false 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 5db2df30076..9d0f7f4da52 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 @@ -43,7 +43,7 @@ import { import child_process from 'child_process'; import { Uri, commands, env, window, workspace, MarkdownString } from "vscode"; import { URI } from "vscode-uri"; -import { ballerinaExtInstance } from "../../core"; +import { extension } from "../../BalExtensionContext"; import { StateMachine } from "../../stateMachine"; import { goToSource } from "../../utils"; import { askFilePath, askProjectPath, BALLERINA_INTEGRATOR_ISSUES_URL, getUpdatedSource } from "./utils"; @@ -187,7 +187,7 @@ export class CommonRpcManager implements CommonRPCAPI { } async experimentalEnabled(): Promise { - return ballerinaExtInstance.enabledExperimentalFeatures(); + return extension.ballerinaExtInstance.enabledExperimentalFeatures(); } async runBackgroundTerminalCommand(params: RunExternalCommandRequest): Promise { @@ -227,6 +227,6 @@ export class CommonRpcManager implements CommonRPCAPI { } async isNPSupported(): Promise { - return ballerinaExtInstance.isNPSupported; + return extension.ballerinaExtInstance.isNPSupported; } } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/lang-client/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/lang-client/rpc-manager.ts index da9f92b3737..8470be5a40e 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/lang-client/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/lang-client/rpc-manager.ts @@ -58,7 +58,7 @@ import { } from "@wso2/ballerina-core"; import { workspace } from "vscode"; import { URI } from "vscode-uri"; -import { ballerinaExtInstance } from "../../core"; +import { extension } from "../../BalExtensionContext"; import { StateMachine } from "../../stateMachine"; import { modifyFileContent } from "../../utils/modification"; @@ -277,7 +277,7 @@ export class LangClientRpcManager implements LangClientAPI { async getBallerinaVersion(): Promise { return new Promise(async (resolve) => { - resolve({ version: ballerinaExtInstance.ballerinaVersion }); + resolve({ version: extension.ballerinaExtInstance.ballerinaVersion }); }); } diff --git a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts index d5819faaa1c..9b4343fd81c 100644 --- a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts +++ b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts @@ -1,5 +1,5 @@ -import { ballerinaExtInstance, ExtendedLangClient } from './core'; +import { ExtendedLangClient } from './core'; import { createMachine, assign, interpret } from 'xstate'; import { activateBallerina } from './extension'; import { EVENT_TYPE, SyntaxTree, History, HistoryEntry, MachineStateValue, STByRangeRequest, SyntaxTreeResponse, UndoRedoManager, VisualizerLocation, webviewReady, MACHINE_VIEW, DIRECTORY_MAP, SCOPE, ProjectStructureResponse, ArtifactData, ProjectStructureArtifactResponse } from "@wso2/ballerina-core"; @@ -91,7 +91,7 @@ const stateMachine = createMachine( } ], onError: { - target: "renderInitialView" + target: "activateLS" } } }, @@ -117,7 +117,10 @@ const stateMachine = createMachine( }) }, onError: { - target: "lsError" + target: "lsError", + actions: () => { + console.error("Error occurred while activating Language Server."); + } } } }, @@ -131,7 +134,10 @@ const stateMachine = createMachine( }) }, onError: { - target: "lsError" + target: "lsError", + actions: () => { + console.error("Error occurred while fetching project structure."); + } } } }, @@ -281,7 +287,7 @@ const stateMachine = createMachine( // Get context values from the project storage so that we can restore the earlier state when user reopens vscode return new Promise((resolve, reject) => { if (!VisualizerWebview.currentPanel) { - ballerinaExtInstance.setContext(extension.context); + extension.ballerinaExtInstance.setContext(extension.context); VisualizerWebview.currentPanel = new VisualizerWebview(); RPCLayer._messenger.onNotification(webviewReady, () => { history = new History(); diff --git a/workspaces/ballerina/ballerina-extension/src/utils/project-utils.ts b/workspaces/ballerina/ballerina-extension/src/utils/project-utils.ts index cb9b2ccef28..55bf802e4b1 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/project-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/project-utils.ts @@ -16,7 +16,7 @@ * under the License. */ -import { ballerinaExtInstance } from "../core"; +import { extension } from "../BalExtensionContext"; import { Uri, window, workspace } from "vscode"; import * as path from 'path'; import { isSupportedVersion, VERSION } from "./config"; @@ -28,9 +28,9 @@ function getCurrentBallerinaProject(file?: string): Promise { // get path of the current bal file const uri = file ? Uri.file(file) : activeEditor.document.uri; // if currently opened file is a bal file - if (ballerinaExtInstance.langClient && isSupportedVersion(ballerinaExtInstance, VERSION.BETA, 1)) { + if (extension.ballerinaExtInstance.langClient && isSupportedVersion(extension.ballerinaExtInstance, VERSION.BETA, 1)) { // get Ballerina Project path for current Ballerina file - ballerinaExtInstance.langClient.getBallerinaProject({ + extension.ballerinaExtInstance.langClient.getBallerinaProject({ documentIdentifier: { uri: uri.toString(), } @@ -54,7 +54,7 @@ function getCurrentBallerinaFile(): string { if (activeEditor && activeEditor.document.fileName.endsWith('.bal')) { return activeEditor.document.fileName; } - const document = ballerinaExtInstance.getDocumentContext().getLatestDocument(); + const document = extension.ballerinaExtInstance.getDocumentContext().getLatestDocument(); if (document) { return document.toString(); } diff --git a/workspaces/ballerina/ballerina-extension/src/utils/state-machine-utils.ts b/workspaces/ballerina/ballerina-extension/src/utils/state-machine-utils.ts index 93ad39b6846..bc70c083387 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/state-machine-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/state-machine-utils.ts @@ -25,7 +25,7 @@ import { FindNodeByUidVisitor } from "./history/find-node-by-uid"; import { FindConstructByNameVisitor } from "./history/find-construct-by-name-visitor"; import { FindConstructByIndexVisitor } from "./history/find-construct-by-index-visitor"; import { getConstructBodyString } from "./history/util"; -import { ballerinaExtInstance } from "../core"; +import { extension } from "../BalExtensionContext"; import path from "path"; export async function getView(documentUri: string, position: NodePosition, projectUri?: string): Promise { @@ -223,7 +223,7 @@ async function getViewBySTRange(documentUri: string, position: NodePosition, pro documentUri: documentUri, position: node.syntaxTree.position, metadata: { - enableSequenceDiagram: ballerinaExtInstance.enableSequenceDiagramView(), + enableSequenceDiagram: extension.ballerinaExtInstance.enableSequenceDiagramView(), } }, dataMapperDepth: 0 @@ -354,7 +354,7 @@ function findViewByArtifact(dir: ProjectStructureArtifactResponse, position: Nod identifier: dir.name, position: dir.position, metadata: { - enableSequenceDiagram: ballerinaExtInstance.enableSequenceDiagramView(), + enableSequenceDiagram: extension.ballerinaExtInstance.enableSequenceDiagramView(), } }, dataMapperDepth: 0 diff --git a/workspaces/ballerina/ballerina-extension/src/utils/webview-utils.ts b/workspaces/ballerina/ballerina-extension/src/utils/webview-utils.ts index 3277353d7f4..0061b1ae349 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/webview-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/webview-utils.ts @@ -18,18 +18,18 @@ import { Uri, ExtensionContext, WebviewOptions, WebviewPanelOptions, Webview } from "vscode"; import { join, sep } from "path"; -import { ballerinaExtInstance } from "../core"; +import { extension } from "../BalExtensionContext"; export const RESOURCES_CDN = `https://choreo-shared-codeserver-cdne.azureedge.net/ballerina-low-code-resources@${process.env.BALLERINA_LOW_CODE_RESOURCES_VERSION}`; const isDevMode = process.env.WEB_VIEW_WATCH_MODE === "true"; function getWebViewResourceRoot(): string { - return join((ballerinaExtInstance.context as ExtensionContext).extensionPath, + return join((extension.ballerinaExtInstance.context as ExtensionContext).extensionPath, 'resources'); } function getNodeModulesRoot(): string { - return join((ballerinaExtInstance.context as ExtensionContext).extensionPath, + return join((extension.ballerinaExtInstance.context as ExtensionContext).extensionPath, 'node_modules'); } @@ -38,7 +38,7 @@ export function getCommonWebViewOptions(): Partial @@ -125,12 +125,12 @@ export function getLibraryWebViewContent(options: WebViewOptions, webView: Webvi } function getComposerURI(webView: Webview): string { - return getVSCodeResourceURI(join((ballerinaExtInstance.context as ExtensionContext).extensionPath, 'resources', + return getVSCodeResourceURI(join((extension.ballerinaExtInstance.context as ExtensionContext).extensionPath, 'resources', 'jslibs'), webView); } function getComposerCSSFiles(disableComDebug: boolean, devHost: string, webView: Webview): string[] { - const filePath = join((ballerinaExtInstance.context as ExtensionContext).extensionPath, 'resources', 'jslibs', 'themes', 'ballerina-default.min.css'); + const filePath = join((extension.ballerinaExtInstance.context as ExtensionContext).extensionPath, 'resources', 'jslibs', 'themes', 'ballerina-default.min.css'); return [ (isDevMode && !disableComDebug) ? join(devHost, 'themes', 'ballerina-default.min.css') : webView.asWebviewUri(Uri.file(filePath)).toString() @@ -138,7 +138,7 @@ function getComposerCSSFiles(disableComDebug: boolean, devHost: string, webView: } function getComposerJSFiles(componentName: string, disableComDebug: boolean, devHost: string, webView: Webview): string[] { - const filePath = join((ballerinaExtInstance.context as ExtensionContext).extensionPath, 'resources', 'jslibs') + sep + componentName + '.js'; + const filePath = join((extension.ballerinaExtInstance.context as ExtensionContext).extensionPath, 'resources', 'jslibs') + sep + componentName + '.js'; return [ (isDevMode && !disableComDebug) ? join(devHost, componentName + '.js') : webView.asWebviewUri(Uri.file(filePath)).toString(), diff --git a/workspaces/ballerina/ballerina-extension/src/views/bbe/activator.ts b/workspaces/ballerina/ballerina-extension/src/views/bbe/activator.ts index 34cc31b9d17..eda692f24a5 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/bbe/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/bbe/activator.ts @@ -20,7 +20,7 @@ import { commands, window, Uri, ViewColumn, ExtensionContext, WebviewPanel, work import { join } from 'path'; import { render } from './renderer'; import { ExtendedLangClient } from '../../core/extended-language-client'; -import { ballerinaExtInstance, BallerinaExtension } from '../../core'; +import { BallerinaExtension } from '../../core'; import { getCommonWebViewOptions } from '../../utils'; import { TM_EVENT_OPEN_EXAMPLES, CMP_EXAMPLES_VIEW, sendTelemetryEvent, sendTelemetryException } from '../../features/telemetry'; import { PALETTE_COMMANDS } from '../../features/project'; diff --git a/workspaces/ballerina/ballerina-extension/src/views/graphql/graphqlViewPanel.ts b/workspaces/ballerina/ballerina-extension/src/views/graphql/graphqlViewPanel.ts index dcc215afe45..bf9e35624e7 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/graphql/graphqlViewPanel.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/graphql/graphqlViewPanel.ts @@ -19,11 +19,10 @@ import { ViewColumn, window, WebviewPanel, Uri } from "vscode"; import { getCommonWebViewOptions } from '../../utils'; import { render } from './render'; -import { ballerinaExtInstance } from "../../core"; +import { extension } from "../../BalExtensionContext"; import { SwaggerServer } from "./server"; import { CMP_TRYIT_GRAPHQL_VIEW, sendTelemetryEvent, TM_EVENT_GRAPHQL_RUN } from "../../features/telemetry"; import path from "path"; -import { extension } from "../../BalExtensionContext"; let graphqlViewPanel: WebviewPanel | undefined; @@ -81,5 +80,5 @@ export async function showGraphqlView(serviceAPI: string): Promise { } } //editor-lowcode-code-tryit - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_GRAPHQL_RUN, CMP_TRYIT_GRAPHQL_VIEW); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_GRAPHQL_RUN, CMP_TRYIT_GRAPHQL_VIEW); } diff --git a/workspaces/ballerina/ballerina-extension/src/views/notebook/notebookSerializer.ts b/workspaces/ballerina/ballerina-extension/src/views/notebook/notebookSerializer.ts index 52e554af5b8..d287599c6ad 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/notebook/notebookSerializer.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/notebook/notebookSerializer.ts @@ -21,7 +21,7 @@ import { CancellationToken, NotebookCellData, NotebookCellExecutionSummary, NotebookCellKind, NotebookCellOutput, NotebookCellOutputItem, NotebookData, NotebookSerializer } from 'vscode'; -import { ballerinaExtInstance } from "../../core"; +import { extension } from "../../BalExtensionContext"; import { CMP_NOTEBOOK, sendTelemetryEvent, TM_EVENT_CLOSE_NOTEBOOK, TM_EVENT_OPEN_NOTEBOOK } from "../../features/telemetry"; /** @@ -47,7 +47,7 @@ interface RawCellOutput { */ export class BallerinaNotebookSerializer implements NotebookSerializer { async deserializeNotebook(content: Uint8Array, _token: CancellationToken): Promise { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_OPEN_NOTEBOOK, CMP_NOTEBOOK); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_OPEN_NOTEBOOK, CMP_NOTEBOOK); var contents = new TextDecoder().decode(content); let raw: RawNotebookCell[]; @@ -71,7 +71,7 @@ export class BallerinaNotebookSerializer implements NotebookSerializer { } async serializeNotebook(data: NotebookData, _token: CancellationToken): Promise { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_CLOSE_NOTEBOOK, CMP_NOTEBOOK); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_CLOSE_NOTEBOOK, CMP_NOTEBOOK); let contents: RawNotebookCell[] = []; for (const cell of data.cells) { contents.push({ diff --git a/workspaces/ballerina/ballerina-extension/test/core/ballerina-extention.test.ts b/workspaces/ballerina/ballerina-extension/test/core/ballerina-extention.test.ts index 029fa2c7cfc..1f26aac7cf4 100644 --- a/workspaces/ballerina/ballerina-extension/test/core/ballerina-extention.test.ts +++ b/workspaces/ballerina/ballerina-extension/test/core/ballerina-extention.test.ts @@ -21,7 +21,7 @@ import * as assert from 'assert'; import * as fs from 'fs'; // You can import and use all API from the 'vscode' module // as well as import your extension to test it -import { ballerinaExtInstance } from '../../src/core'; +import { extension } from '../../src/BalExtensionContext'; import { getBallerinaHome, getBallerinaVersion } from '../test-util'; // Ballerina tools distribution will be copied to following location by maven @@ -32,14 +32,14 @@ const testBallerinaVersion = getBallerinaVersion(); suite("Ballerina Extension Core Tests", function () { test("Test autoDetectBallerinaHome", function () { // Following should not throw an error all times. - const { home } = ballerinaExtInstance.autoDetectBallerinaHome(); + const { home } = extension.ballerinaExtInstance.autoDetectBallerinaHome(); if (home) { assert.equal(fs.existsSync(home), true); } }); test("Test getBallerinaVersion", function () { - ballerinaExtInstance.getBallerinaVersion(testBallerinaHome, true).then(detected => { + extension.ballerinaExtInstance.getBallerinaVersion(testBallerinaHome, true).then(detected => { const regex = /(s|S)wan( |-)(l|L)ake/g; if (detected.match(regex) && testBallerinaHome.match(regex)) { let detectedLowerCase = detected.toLowerCase(); 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 c00f42b7238..fd11ab78384 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 @@ -32,7 +32,7 @@ import { Connectors, Completion, Diagnostics, SyntaxTree} from '@wso2/ballerina-core'; import { ExtendedLangClient } from '../../src/core/extended-language-client'; -import { ballerinaExtInstance } from '../../src/core/extension'; +import { extension } from '../../src/BalExtensionContext'; const PROJECT_ROOT = join(__dirname, '..', '..', '..', 'test', 'data'); @@ -44,7 +44,7 @@ suite.skip("Language Server Tests", function () { langClient = new ExtendedLangClient( 'ballerina-vscode', 'Ballerina LS Client', - getServerOptions(ballerinaExtInstance), + getServerOptions(extension.ballerinaExtInstance), { documentSelector: [{ scheme: 'file', language: 'ballerina' }] }, undefined, false From 775cfc4576882220af75fc5e96fb23bc52ee4a03 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Tue, 22 Jul 2025 13:07:12 +0530 Subject: [PATCH 068/349] Enhance AI features in Ballerina extension by registering a command for generating code in test environments and updating test setup to include AI_TEST_ENV variable. --- .../src/features/ai/activator.ts | 10 ++++++++++ .../test/ai/evals/code/code.test.ts | 3 +-- .../ballerina/ballerina-extension/test/runTest.ts | 13 +++++++------ 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts index 07df9a8c2a6..6ebe60bf5b7 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts @@ -16,8 +16,12 @@ * under the License. */ +import { commands } from 'vscode'; import { BallerinaExtension, ExtendedLangClient } from '../../core'; import { activateCopilotLoginCommand, resetBIAuth } from './completions'; +import { generateCodeCore } from './service/code/code'; +import { GenerateCodeRequest } from '@wso2/ballerina-core'; +import { CopilotEventHandler } from './service/event'; export let langClient: ExtendedLangClient; @@ -25,4 +29,10 @@ export function activateAIFeatures(ballerinaExternalInstance: BallerinaExtension langClient = ballerinaExternalInstance.langClient; activateCopilotLoginCommand(); resetBIAuth(); + // Register a command 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); + }); + } } 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 7320e4d5795..a83da6661dc 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 @@ -22,7 +22,6 @@ import { ChatNotify, GenerateCodeRequest } from "@wso2/ballerina-core"; import { CopilotEventHandler } from "../../../../src/features/ai/service/event"; import { commands, Uri, workspace } from "vscode"; import { ExtendedLangClient } from "../../../../src/core/extended-language-client"; -import { ballerinaExtInstance } from "../../../../src/core/extension"; import { getServerOptions } from "../../../../src/utils/server/server"; const RESOURCES_PATH = path.resolve(__dirname, "../../../../../test/ai/evals/code/resources"); @@ -135,7 +134,7 @@ suite.only("AI Code Generator Tests Suite", () => { }; try { - await generateCodeCore(params, testEventHandler); + await commands.executeCommand('ballerina.test.ai.generateCodeCore', params, testEventHandler); const result = getResult(); diff --git a/workspaces/ballerina/ballerina-extension/test/runTest.ts b/workspaces/ballerina/ballerina-extension/test/runTest.ts index 6b732f34ee3..c8c09170955 100644 --- a/workspaces/ballerina/ballerina-extension/test/runTest.ts +++ b/workspaces/ballerina/ballerina-extension/test/runTest.ts @@ -30,18 +30,19 @@ async function go() { console.log("Fetching values for environment variables..."); const { envKeys, missingVars } = createEnvDefinePlugin(env); if (missingVars.length > 0) { - console.warn( - '\n⚠️ Environment Variable Configuration Warning:\n' + - `Missing required environment variables: ${missingVars.join(', ')}\n` + - `Please provide values in either .env file or runtime environment.\n` - ); + console.warn( + '\n⚠️ Environment Variable Configuration Warning:\n' + + `Missing required environment variables: ${missingVars.join(', ')}\n` + + `Please provide values in either .env file or runtime environment.\n` + ); } await runTests({ extensionDevelopmentPath, extensionTestsPath, extensionTestsEnv: { - ...envKeys + ...envKeys, + AI_TEST_ENV: 'true' } }); } catch (err) { From 876e59cb5e5d1fd33d53d07eea2b819ffb5f7ebb Mon Sep 17 00:00:00 2001 From: tharindulak Date: Tue, 22 Jul 2025 16:27:17 +0530 Subject: [PATCH 069/349] Add vscode profile for testing --- .../src/test/e2e-playwright-tests/utils.ts | 4 +- .../README-profiles.md | 98 +++++++++++++++++++ .../examples/profile-test.spec.ts | 82 ++++++++++++++++ .../playwright-vscode-tester/src/browser.ts | 14 +-- .../playwright-vscode-tester/src/codeUtil.ts | 9 +- .../playwright-vscode-tester/src/launcher.ts | 6 +- .../playwright-vscode-tester/src/utils.ts | 8 +- .../src/test/e2e-playwright-tests/Utils.ts | 4 +- 8 files changed, 205 insertions(+), 20 deletions(-) create mode 100644 workspaces/common-libs/playwright-vscode-tester/README-profiles.md create mode 100644 workspaces/common-libs/playwright-vscode-tester/examples/profile-test.spec.ts diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/utils.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/utils.ts index 40593e4a954..519f6c2840f 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/utils.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/utils.ts @@ -32,7 +32,7 @@ async function initVSCode() { if (vscode && page) { await page.executePaletteCommand('Reload Window'); } else { - vscode = await startVSCode(resourcesFolder, vscodeVersion, undefined, false, extensionsFolder, newProjectPath); + vscode = await startVSCode(resourcesFolder, vscodeVersion, undefined, false, extensionsFolder, newProjectPath, 'bi-test-profile'); } page = new ExtendedPage(await vscode!.firstWindow({ timeout: 60000 })); } @@ -42,7 +42,7 @@ async function resumeVSCode() { await page.executePaletteCommand('Reload Window'); } else { console.log('Starting VSCode'); - vscode = await startVSCode(resourcesFolder, vscodeVersion, undefined, false, extensionsFolder, path.join(newProjectPath, 'testProject')); + vscode = await startVSCode(resourcesFolder, vscodeVersion, undefined, false, extensionsFolder, path.join(newProjectPath, 'testProject'), 'bi-test-profile'); await new Promise(resolve => setTimeout(resolve, 5000)); } page = new ExtendedPage(await vscode!.firstWindow({ timeout: 60000 })); diff --git a/workspaces/common-libs/playwright-vscode-tester/README-profiles.md b/workspaces/common-libs/playwright-vscode-tester/README-profiles.md new file mode 100644 index 00000000000..1710200a207 --- /dev/null +++ b/workspaces/common-libs/playwright-vscode-tester/README-profiles.md @@ -0,0 +1,98 @@ +# Using Custom VSCode Profiles with Playwright VSCode Tester + +The `playwright-vscode-tester` module now supports creating isolated VSCode profiles for testing, ensuring that your tests don't interfere with your development VSCode settings and extensions. + +## What Changed + +Previously, the module used a shared `settings/Code` directory which could inherit settings and extensions from your development VSCode. Now you can specify a custom profile name to create completely isolated test environments. + +## Usage Examples + +### Basic Usage with Custom Profile + +```typescript +import { startVSCode, ReleaseQuality } from '@wso2/playwright-vscode-tester'; + +// Start VSCode with a custom profile named "my-test-profile" +const vscode = await startVSCode( + './test-resources', // resources folder + 'latest', // VSCode version + ReleaseQuality.Stable, // release type + false, // enable recorder + undefined, // extensions folder + './my-project', // project path + 'my-test-profile' // custom profile name +); +``` + +### Using getBrowser with Custom Profile + +```typescript +import { getBrowser, ReleaseQuality } from '@wso2/playwright-vscode-tester'; + +const browser = await getBrowser( + './test-resources', + 'latest', + ReleaseQuality.Stable, + './extensions', // extensions folder + 'isolated-test-profile' // custom profile name +); +``` + +### Using getBrowserLaunchOptions with Custom Profile + +```typescript +import { getBrowserLaunchOptions, ReleaseQuality } from '@wso2/playwright-vscode-tester'; + +const options = await getBrowserLaunchOptions( + './test-resources', + 'latest', + ReleaseQuality.Stable, + './my-project', // project path + './extensions', // extensions folder + 'clean-test-profile' // custom profile name +); +``` + +## Profile Directory Structure + +When you specify a custom profile name (e.g., "my-test-profile"), the module will create the following directory structure: + +``` +test-resources/ +└── settings/ + └── my-test-profile/ + ├── chromium-log + ├── crash-reports/ + └── Code/ + └── User/ + ├── settings.json + └── globalStorage/ +``` + +## Benefits + +1. **Isolation**: Each test can use a completely clean VSCode environment +2. **Reproducibility**: Tests start with the same baseline configuration every time +3. **Parallel Testing**: Multiple test suites can run simultaneously with different profiles +4. **No Interference**: Your development VSCode settings and extensions won't affect tests + +## Automatic Profile Generation + +If you don't specify a profile name, the module will automatically generate a unique one based on the current timestamp: + +```typescript +// This will create a profile like "test-profile-1642784567890" +const vscode = await startVSCode('./test-resources', 'latest'); +``` + +## Backward Compatibility + +All existing code will continue to work without changes. The profile name parameter is optional, and when not provided, a unique profile is automatically generated. + +## Best Practices + +1. Use descriptive profile names for different test scenarios +2. Consider cleaning up old profile directories after tests complete +3. Use unique profile names for parallel test execution +4. Include the profile name in test logs for debugging purposes diff --git a/workspaces/common-libs/playwright-vscode-tester/examples/profile-test.spec.ts b/workspaces/common-libs/playwright-vscode-tester/examples/profile-test.spec.ts new file mode 100644 index 00000000000..c2d21567ec8 --- /dev/null +++ b/workspaces/common-libs/playwright-vscode-tester/examples/profile-test.spec.ts @@ -0,0 +1,82 @@ +import { test, expect } from '@playwright/test'; +import { startVSCode, ReleaseQuality } from '@wso2/playwright-vscode-tester'; + +test.describe('VSCode Profile Testing', () => { + test('should start VSCode with custom profile', async () => { + // Start VSCode with a custom profile for isolation + const vscode = await startVSCode( + './test-resources', // resources folder + 'latest', // VSCode version + ReleaseQuality.Stable, // release type + false, // enable recorder + undefined, // extensions folder + './test-project', // project path to open + 'test-profile-clean' // custom profile name + ); + + // Get the main workbench page + const workbench = vscode.firstWindow(); + + // Verify VSCode opened with clean profile + await expect(workbench.locator('.monaco-workbench')).toBeVisible(); + + // You can now interact with VSCode in a clean environment + // without any interference from your development settings + + // Close VSCode when done + await vscode.close(); + }); + + test('should start multiple VSCode instances with different profiles', async () => { + // Start first instance with profile A + const vscode1 = await startVSCode( + './test-resources', + 'latest', + ReleaseQuality.Stable, + false, + undefined, + './project-a', + 'test-profile-a' + ); + + // Start second instance with profile B + const vscode2 = await startVSCode( + './test-resources', + 'latest', + ReleaseQuality.Stable, + false, + undefined, + './project-b', + 'test-profile-b' + ); + + // Both instances are now running with isolated profiles + const workbench1 = vscode1.firstWindow(); + const workbench2 = vscode2.firstWindow(); + + await expect(workbench1.locator('.monaco-workbench')).toBeVisible(); + await expect(workbench2.locator('.monaco-workbench')).toBeVisible(); + + // Clean up + await vscode1.close(); + await vscode2.close(); + }); + + test('should use auto-generated profile when none specified', async () => { + // This will automatically generate a unique profile name + const vscode = await startVSCode( + './test-resources', + 'latest', + ReleaseQuality.Stable, + false, + undefined, + './test-project' + // No profile name specified - will auto-generate + ); + + const workbench = vscode.firstWindow(); + await expect(workbench.locator('.monaco-workbench')).toBeVisible(); + + await vscode.close(); + }); +}); diff --git a/workspaces/common-libs/playwright-vscode-tester/src/browser.ts b/workspaces/common-libs/playwright-vscode-tester/src/browser.ts index 459d75319a5..ac5f7785df0 100644 --- a/workspaces/common-libs/playwright-vscode-tester/src/browser.ts +++ b/workspaces/common-libs/playwright-vscode-tester/src/browser.ts @@ -14,14 +14,16 @@ export class VSBrowser { private customSettings: object; private codeVersion: string; private releaseType: ReleaseQuality; + private profileName: string; private static _instance: VSBrowser; - constructor(codeVersion: string, releaseType: ReleaseQuality, private resources: string[], customSettings: object = {}) { + constructor(codeVersion: string, releaseType: ReleaseQuality, private resources: string[], customSettings: object = {}, profileName?: string) { this.storagePath = process.env.TEST_RESOURCES ? process.env.TEST_RESOURCES : os.tmpdir(); this.extensionsFolder = process.env.EXTENSIONS_FOLDER ? process.env.EXTENSIONS_FOLDER : undefined; this.customSettings = customSettings; this.codeVersion = codeVersion; this.releaseType = releaseType; + this.profileName = profileName || `test-profile-${Date.now()}`; VSBrowser._instance = this; } @@ -38,8 +40,8 @@ export class VSBrowser { '--no-sandbox', '--enable-logging', '--log-level=0', - `--log-file=${path.join(this.storagePath, 'settings', 'chromium-log')}`, - `--crash-reporter-directory=${path.join(this.storagePath, 'settings', 'crash-reports')}`, + `--log-file=${path.join(this.storagePath, 'settings', this.profileName, 'chromium-log')}`, + `--crash-reporter-directory=${path.join(this.storagePath, 'settings', this.profileName, 'crash-reports')}`, '--enable-blink-features=ShadowDOMV0', '--disable-renderer-backgrounding', '--ignore-certificate-errors', @@ -51,7 +53,7 @@ export class VSBrowser { '--disable-ipc-flooding-protection', '--enable-precise-memory-info', '--disable-workspace-trust', - `--user-data-dir=${path.join(this.storagePath, 'settings', 'Code')}`, + `--user-data-dir=${path.join(this.storagePath, 'settings', this.profileName, 'Code')}`, ]; if (this.extensionsFolder) { @@ -70,9 +72,9 @@ export class VSBrowser { private async writeSettings() { - const userSettings = path.join(this.storagePath, 'settings', 'Code', 'User'); + const userSettings = path.join(this.storagePath, 'settings', this.profileName, 'Code', 'User'); if (fs.existsSync(userSettings)) { - fs.removeSync(path.join(this.storagePath, 'settings')); + fs.removeSync(path.join(this.storagePath, 'settings', this.profileName)); } let defaultSettings = { "workbench.editor.enablePreview": false, diff --git a/workspaces/common-libs/playwright-vscode-tester/src/codeUtil.ts b/workspaces/common-libs/playwright-vscode-tester/src/codeUtil.ts index 7442cb191ea..547040e73b0 100644 --- a/workspaces/common-libs/playwright-vscode-tester/src/codeUtil.ts +++ b/workspaces/common-libs/playwright-vscode-tester/src/codeUtil.ts @@ -52,18 +52,21 @@ export class CodeUtil { private cliEnv!: string; private availableVersions: string[]; private extensionsFolder: string | undefined; + private profileName: string; /** * Create an instance of code handler * @param folder Path to folder where all the artifacts will be stored. * @param extensionsFolder Path to use as extensions directory by VSCode + * @param profileName Custom profile name for VSCode user data directory (optional) */ - constructor(folder = 'test-resources', type: ReleaseQuality = ReleaseQuality.Stable, extensionsFolder?: string) { + constructor(folder = 'test-resources', type: ReleaseQuality = ReleaseQuality.Stable, extensionsFolder?: string, profileName?: string) { this.availableVersions = []; this.downloadPlatform = this.getPlatform(); this.downloadFolder = path.resolve(folder); this.extensionsFolder = extensionsFolder ? path.resolve(extensionsFolder) : undefined; this.releaseType = type; + this.profileName = profileName || `test-profile-${Date.now()}`; if (type === ReleaseQuality.Stable) { this.codeFolder = path.join(this.downloadFolder, (process.platform === 'darwin') @@ -169,7 +172,7 @@ export class CodeUtil { */ open(...paths: string[]): void { const segments = paths.map(f => `"${f}"`).join(' '); - const command = `${this.cliEnv} "${this.executablePath}" "${this.cliPath}" --ms-enable-electron-run-as-node -r ${segments} --user-data-dir="${path.join(this.downloadFolder, 'settings')}"`; + const command = `${this.cliEnv} "${this.executablePath}" "${this.cliPath}" --ms-enable-electron-run-as-node -r ${segments} --user-data-dir="${path.join(this.downloadFolder, 'settings', this.profileName, 'Code')}"`; child_process.execSync(command); } @@ -380,7 +383,7 @@ export class CodeUtil { const key = 'PATH'; finalEnv[key] = [this.downloadFolder, process.env[key]].join(path.delimiter); - const browser = new VSBrowser(literalVersion, this.releaseType, runOptions.resources); + const browser = new VSBrowser(literalVersion, this.releaseType, runOptions.resources, {}, this.profileName); const launchArgs = await browser.getLaunchArgs() process.env = { diff --git a/workspaces/common-libs/playwright-vscode-tester/src/launcher.ts b/workspaces/common-libs/playwright-vscode-tester/src/launcher.ts index d4e9664ed18..3b0eb19f9e5 100644 --- a/workspaces/common-libs/playwright-vscode-tester/src/launcher.ts +++ b/workspaces/common-libs/playwright-vscode-tester/src/launcher.ts @@ -4,10 +4,10 @@ import { getBrowser, getBrowserLaunchOptions } from './utils'; import { ReleaseQuality } from './codeUtil'; export const startVSCode = async (resourcesFolder: string, vscodeVersion: string, - releaseType: ReleaseQuality = ReleaseQuality.Stable, enableRecorder = false, extensionsFolder?: string, projectPath?: string) => { + releaseType: ReleaseQuality = ReleaseQuality.Stable, enableRecorder = false, extensionsFolder?: string, projectPath?: string, profileName?: string) => { - const browser = await getBrowser(resourcesFolder, vscodeVersion, releaseType, extensionsFolder); - const browserOptions = await getBrowserLaunchOptions(resourcesFolder, vscodeVersion, releaseType, projectPath, extensionsFolder); + const browser = await getBrowser(resourcesFolder, vscodeVersion, releaseType, extensionsFolder, profileName); + const browserOptions = await getBrowserLaunchOptions(resourcesFolder, vscodeVersion, releaseType, projectPath, extensionsFolder, profileName); const args = [...browserOptions.args]; diff --git a/workspaces/common-libs/playwright-vscode-tester/src/utils.ts b/workspaces/common-libs/playwright-vscode-tester/src/utils.ts index cea74eecde7..44bcd1bfacc 100644 --- a/workspaces/common-libs/playwright-vscode-tester/src/utils.ts +++ b/workspaces/common-libs/playwright-vscode-tester/src/utils.ts @@ -3,8 +3,8 @@ import { CodeUtil, ReleaseQuality } from "./codeUtil"; import { BrowserLaunchOptions, Browser } from "./types"; import fs from "fs"; -export async function getBrowser(folder: string, version: string, quality: ReleaseQuality, extensionsFolder?: string): Promise { - const codeUtil = new CodeUtil(folder, quality); +export async function getBrowser(folder: string, version: string, quality: ReleaseQuality, extensionsFolder?: string, profileName?: string): Promise { + const codeUtil = new CodeUtil(folder, quality, extensionsFolder, profileName); const vscodePath = path.join(folder, `Visual Studio Code.app`); if (!fs.existsSync(vscodePath)) { await codeUtil.downloadVSCode(version); @@ -23,8 +23,8 @@ export async function getBrowser(folder: string, version: string, quality: Relea return browser; } -export async function getBrowserLaunchOptions(folder: string, version: string, quality: ReleaseQuality, projectPath?: string, extensionsFolder?: string): Promise { - const codeUtil = new CodeUtil(folder, quality, extensionsFolder); +export async function getBrowserLaunchOptions(folder: string, version: string, quality: ReleaseQuality, projectPath?: string, extensionsFolder?: string, profileName?: string): Promise { + const codeUtil = new CodeUtil(folder, quality, extensionsFolder, profileName); const resources = [] if (projectPath) { resources.push(projectPath); diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/Utils.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/Utils.ts index c5caf22e358..96f48c0092f 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/Utils.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/Utils.ts @@ -42,7 +42,7 @@ async function initVSCode() { if (vscode && page) { await page.executePaletteCommand('Reload Window'); } else { - vscode = await startVSCode(resourcesFolder, vscodeVersion, undefined, false, extensionsFolder, newProjectPath); + vscode = await startVSCode(resourcesFolder, vscodeVersion, undefined, false, extensionsFolder, newProjectPath, 'mi-test-profile'); } page = new ExtendedPage(await vscode!.firstWindow({ timeout: 60000 })); } @@ -114,7 +114,7 @@ export async function resumeVSCode() { await page.executePaletteCommand('Reload Window'); } else { console.log('Starting VSCode'); - vscode = await startVSCode(resourcesFolder, vscodeVersion, undefined, false, extensionsFolder, path.join(newProjectPath, 'testProject')); + vscode = await startVSCode(resourcesFolder, vscodeVersion, undefined, false, extensionsFolder, path.join(newProjectPath, 'testProject'), 'mi-test-profile'); await new Promise(resolve => setTimeout(resolve, 5000)); } page = new ExtendedPage(await vscode!.firstWindow({ timeout: 60000 })); From ec9d499217aced92e046bcc81242fd55e0e4d576 Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Tue, 22 Jul 2025 20:02:49 +0530 Subject: [PATCH 070/349] Add custom urls to new copilot eps --- workspaces/ballerina/ballerina-extension/.env.example | 4 ++-- .../ballerina-extension/src/features/ai/service/ask/ask.ts | 4 ++-- .../src/features/ai/service/connection.ts | 5 ++--- .../ballerina/ballerina-extension/src/features/ai/utils.ts | 6 +++--- .../src/features/natural-programming/utils.ts | 4 ++-- .../src/rpc-managers/ai-panel/rpc-manager.ts | 6 +++--- .../src/rpc-managers/bi-diagram/rpc-manager.ts | 6 +++--- 7 files changed, 17 insertions(+), 18 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/.env.example b/workspaces/ballerina/ballerina-extension/.env.example index 44bc69d0787..e48ddcef710 100644 --- a/workspaces/ballerina/ballerina-extension/.env.example +++ b/workspaces/ballerina/ballerina-extension/.env.example @@ -1,4 +1,4 @@ -BALLERINA_ROOT_URL=https://dev-tools.wso2.com/ballerina-copilot/v2.0 +BALLERINA_ROOT_URL=https://dev-tools.wso2.com/ballerina-copilot BALLERINA_AUTH_ORG= BALLERINA_AUTH_CLIENT_ID= -BALLERINA_AUTH_REDIRECT_URL=https://98c70105-822c-4359-8579-4da58f0ab4b7.e1-us-east-azure.choreoapps.dev \ No newline at end of file +BALLERINA_AUTH_REDIRECT_URL=https://eae690d5-80c3-4fb7-9bc5-e8d747cca11b.e1-us-east-azure.choreoapps.dev diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts index d4452fd897c..e3c64712224 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts @@ -15,7 +15,7 @@ // under the License. import { generateText } from "ai"; -import { LIBS_URL } from "../../utils"; +import { BACKEND_URL } from "../../utils"; import { selectRequiredFunctions } from "../libs/funcs"; import { GenerationType, getSelectedLibraries } from "../libs/libs"; import { Library, LibraryWithUrl } from "../libs/libs_types"; @@ -94,7 +94,7 @@ async function extractLearnPages(query: string): Promise { async function fetchDocumentationFromVectorStore(query: string): Promise { try { - const response = await fetchWithAuth(`${LIBS_URL}/topK`, { + const response = await fetchWithAuth(`${BACKEND_URL}/learn-docs-api/v1.0/topK`, { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts index ef4df70cec7..a39b6ce9993 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts @@ -18,6 +18,7 @@ import { createAnthropic } from "@ai-sdk/anthropic"; import { getAccessToken, getRefreshedAccessToken } from "../../../utils/ai/auth"; import { AIStateMachine } from "../../../views/ai-panel/aiMachine"; import { AIMachineEventType } from "@wso2/ballerina-core"; +import { BACKEND_URL } from "../utils"; /** * Reusable fetch function that handles authentication with token refresh @@ -58,10 +59,8 @@ export async function fetchWithAuth(input: string | URL | Request, options: Requ return response; } -let url = "https://e95488c8-8511-4882-967f-ec3ae2a0f86f-prod.e1-us-east-azure.choreoapis.dev/ballerina-copilot/intelligence-api/v1.0/claude"; - export const anthropic = createAnthropic({ - baseURL: url, + baseURL: BACKEND_URL+ "/intelligence-api/v1.0/claude", apiKey: "xx", //TODO: Gives error without this. see if we can remove, fetch: fetchWithAuth, }); diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts index f118fe93cad..ddef12d66f5 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts @@ -35,8 +35,8 @@ export const AUTH_ORG : string = config.get('authOrg') || process.env.BALLERINA_ export const AUTH_CLIENT_ID : string = config.get('authClientID') || process.env.BALLERINA_AUTH_CLIENT_ID; export const AUTH_REDIRECT_URL : string = config.get('authRedirectURL') || process.env.BALLERINA_AUTH_REDIRECT_URL; -// Add new config exports for other services -export const LIBS_URL : string = "https://e95488c8-8511-4882-967f-ec3ae2a0f86f-prod.e1-us-east-azure.choreoapis.dev/ballerina-copilot/ballerina-learn-docs-api/v1.0"; +// This refers to old backend before FE Migration. We need to eventually remove this. +export const OLD_BACKEND_URL : string = BACKEND_URL + "/v2.0"; export async function closeAllBallerinaFiles(dirPath: string): Promise { // Check if the directory exists @@ -146,7 +146,7 @@ export async function getTokenForDefaultModel() { export async function getBackendURL(): Promise { return new Promise(async (resolve) => { - resolve(BACKEND_URL); + resolve(OLD_BACKEND_URL); }); } 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 31440cfdd12..d4762159653 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts @@ -39,7 +39,7 @@ import { } from "./constants"; import { isError, isNumber } from 'lodash'; import { HttpStatusCode } from 'axios'; -import { BACKEND_URL } from '../ai/utils'; +import { OLD_BACKEND_URL } from '../ai/utils'; import { AIMachineEventType, BallerinaProject } from '@wso2/ballerina-core'; import { getCurrentBallerinaProjectFromContext } from '../config-generator/configGenerator'; import { BallerinaExtension } from 'src/core'; @@ -499,7 +499,7 @@ export function getPluginConfig(): BallerinaPluginConfig { export async function getBackendURL(): Promise { return new Promise(async (resolve) => { - resolve(BACKEND_URL); + resolve(OLD_BACKEND_URL); }); } 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 2b68afaaaa0..1e42c7dcf88 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 @@ -88,7 +88,7 @@ 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 { BACKEND_URL, closeAllBallerinaFiles } from "../../features/ai/utils"; +import { closeAllBallerinaFiles, OLD_BACKEND_URL } from "../../features/ai/utils"; import { getLLMDiagnosticArrayAsString, handleChatSummaryFailure } from "../../features/natural-programming/utils"; import { StateMachine, updateView } from "../../stateMachine"; import { getAccessToken, getRefreshedAccessToken, loginGithubCopilot } from "../../utils/ai/auth"; @@ -113,7 +113,7 @@ export class AiPanelRpcManager implements AIPanelAPI { // ================================== async getBackendUrl(): Promise { return new Promise(async (resolve) => { - resolve(BACKEND_URL); + resolve(OLD_BACKEND_URL); }); } @@ -722,7 +722,7 @@ export class AiPanelRpcManager implements AIPanelAPI { diagnostics: cleanDiagnosticMessages(content.diagnostics) }; - const response = await fetchWithAuth(`${BACKEND_URL}/feedback`, { + const response = await fetchWithAuth(`${OLD_BACKEND_URL}/feedback`, { method: 'POST', headers: { 'Content-Type': 'application/json' 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 e163771284b..19dfd8f576f 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 @@ -157,7 +157,7 @@ import { StateMachine, updateView } from "../../stateMachine"; import { getCompleteSuggestions } from '../../utils/ai/completions'; import { README_FILE, createBIAutomation, createBIFunction, createBIProjectPure } from "../../utils/bi"; import { writeBallerinaFileDidOpen } from "../../utils/modification"; -import { BACKEND_URL } from "../../features/ai/utils"; +import { OLD_BACKEND_URL } from "../../features/ai/utils"; import { ICreateComponentCmdParams, IWso2PlatformExtensionAPI, CommandIds as PlatformExtCommandIds } from "@wso2/wso2-platform-core"; import { cleanAndValidateProject, getCurrentBIProject } from "../../features/config-generator/configGenerator"; import { updateSourceCode } from "../../utils/source-utils"; @@ -436,7 +436,7 @@ export class BiDiagramRpcManager implements BIDiagramAPI { }; console.log(">>> request ai suggestion", { request: requestBody }); // generate new nodes - const response = await fetchWithAuth(BACKEND_URL + "/inline/generation", requestOptions); + const response = await fetchWithAuth(OLD_BACKEND_URL + "/inline/generation", requestOptions); if (!response.ok) { console.log(">>> ai completion api call failed ", response); return new Promise((resolve) => { @@ -1259,7 +1259,7 @@ export class BiDiagramRpcManager implements BIDiagramAPI { }; console.log(">>> request ai suggestion", { request: requestBody }); // generate new nodes - const response = await fetchWithAuth(BACKEND_URL + "/completion", requestOptions); + const response = await fetchWithAuth(OLD_BACKEND_URL + "/completion", requestOptions); if (!response.ok) { console.log(">>> ai completion api call failed ", response); return new Promise((resolve) => { From 1f0672fa808a4c77b77a8ce235fc85dfe9a50c0b Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Fri, 18 Jul 2025 11:28:55 +0530 Subject: [PATCH 071/349] Change MCP url input name to Server URL From 1542857892196bae7fe7ef65efaa5eb7eb91d12f Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Sat, 19 Jul 2025 13:58:13 +0530 Subject: [PATCH 072/349] Update dynamic dropdown for mcp toolkits --- .../src/components/editors/DropdownEditor.tsx | 259 ++++++++++++++++-- .../src/components/editors/EditorFactory.tsx | 7 + .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 149 ++++++---- 3 files changed, 345 insertions(+), 70 deletions(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx index 774999f3a3f..299fabd94f4 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx @@ -16,46 +16,263 @@ * under the License. */ -import React from "react"; +import React, { useState, useEffect } from "react"; +import styled from "@emotion/styled"; -import { Dropdown } from "@wso2/ui-toolkit"; +import { Dropdown, Button, CheckBox, ThemeColors } from "@wso2/ui-toolkit"; import { FormField } from "../Form/types"; import { capitalize, getValueForDropdown } from "./utils"; import { useFormContext } from "../../context"; import { SubPanel, SubPanelView } from "@wso2/ballerina-core"; +// Styled components for tools selection +const ToolsContainer = styled.div` + display: flex; + flex-direction: column; + gap: 8px; + margin-top: 12px; + padding: 12px; + border: 1px solid ${ThemeColors.OUTLINE_VARIANT}; + border-radius: 8px; +`; + +const ToolsHeader = styled.div` + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + margin-bottom: 8px; +`; + +const ToolsTitle = styled.div` + font-size: 14px; + font-family: GilmerBold; + color: ${ThemeColors.ON_SURFACE}; +`; + +const ToolCheckboxContainer = styled.div` + display: flex; + flex-direction: column; + gap: 6px; + max-height: 200px; + overflow-y: auto; +`; + +const ToolCheckboxItem = styled.div` + display: flex; + flex-direction: row; + align-items: center; + gap: 8px; + padding: 4px 0; +`; + +const ErrorMessage = styled.div` + color: ${ThemeColors.ERROR}; + font-size: 12px; + margin-top: 4px; +`; + +const LoadingMessage = styled.div` + color: ${ThemeColors.ON_SURFACE_VARIANT}; + font-size: 12px; + display: flex; + align-items: center; + gap: 8px; +`; + +interface Tool { + name: string; + description?: string; +} + interface DropdownEditorProps { field: FormField; openSubPanel?: (subPanel: SubPanel) => void; + // Additional props for MCP tools functionality + serviceUrl?: string; + configs?: object; + rpcClient?: any; + onToolsChange?: (selectedTools: string[]) => void; } export function DropdownEditor(props: DropdownEditorProps) { - const { field, openSubPanel } = props; + console.log(">>> DropdownEditor", props); + const { field, openSubPanel, serviceUrl, configs, rpcClient, onToolsChange } = props; const { form } = useFormContext(); - const { register, setValue } = form; + const { register, setValue, watch } = form; + + // Watch the current value of this dropdown + const currentValue = watch(field.key); + + // State for MCP tools functionality + const [mcpTools, setMcpTools] = useState([]); + const [selectedMcpTools, setSelectedMcpTools] = useState>(new Set()); + const [loadingMcpTools, setLoadingMcpTools] = useState(false); + const [mcpToolsError, setMcpToolsError] = useState(""); // HACK: create values for Scope field if (field.key === "scope") { - field.items = ["Global", "Local"]; + field.items = ["All", "Selected"]; } + // Effect to fetch MCP tools when scope is "Selected" and serviceUrl is available + useEffect(() => { + if (field.key === "scope" && currentValue === "Selected" && serviceUrl?.trim()) { + fetchMcpTools(); + } else { + // Clear tools when not in selected mode or no URL + setMcpTools([]); + setSelectedMcpTools(new Set()); + setMcpToolsError(""); + } + }, [currentValue, serviceUrl, field.key]); + + // Notify parent component when selected tools change + useEffect(() => { + if (onToolsChange) { + onToolsChange(Array.from(selectedMcpTools)); + } + }, [selectedMcpTools, onToolsChange]); + + const fetchMcpTools = async () => { + if (!serviceUrl?.trim() || !rpcClient) { + return; + } + + setLoadingMcpTools(true); + setMcpToolsError(""); + setMcpTools([]); + setSelectedMcpTools(new Set()); + + try { + const languageServerClient = rpcClient.getAIAgentRpcClient(); + + if (typeof languageServerClient.getMcpTools === 'function') { + console.log(">>> Fetching MCP tools from server"); + const response = await languageServerClient.getMcpTools({ + serviceUrl: serviceUrl.trim(), + configs: configs || {} + }); + + console.log(">>> MCP tools response", response); + + if (response.tools && Array.isArray(response.tools)) { + setMcpTools(response.tools); + } else { + setMcpToolsError("No tools found in MCP server response"); + } + } + } catch (error) { + console.error(">>> Error fetching MCP tools", error); + setMcpToolsError(`Failed to fetch tools from MCP server: ${error || 'Unknown error'}`); + } finally { + setLoadingMcpTools(false); + } + }; + + const handleToolSelectionChange = (toolName: string, isSelected: boolean) => { + const newSelectedTools = new Set(selectedMcpTools); + if (isSelected) { + newSelectedTools.add(toolName); + } else { + newSelectedTools.delete(toolName); + } + setSelectedMcpTools(newSelectedTools); + }; + + const handleSelectAllTools = () => { + if (selectedMcpTools.size === mcpTools.length) { + // Deselect all + setSelectedMcpTools(new Set()); + } else { + // Select all + setSelectedMcpTools(new Set(mcpTools.map(tool => tool.name))); + } + }; + + const renderToolsSelection = () => { + if (field.key !== "scope" || currentValue !== "Selected") { + return null; + } + + return ( + + + Available Tools + {mcpTools.length > 0 && ( + + )} + + + {loadingMcpTools && ( + + Loading tools from MCP server... + + )} + + {mcpToolsError && ( + {mcpToolsError} + )} + + {mcpTools.length > 0 && ( + + {mcpTools.map((tool) => ( + + !loadingMcpTools && handleToolSelectionChange(tool.name, !selectedMcpTools.has(tool.name))} + > + +
+
{tool.name}
+ {tool.description && ( +
+ {tool.description} +
+ )} +
+
+ ))} +
+ )} + + {!loadingMcpTools && !mcpToolsError && mcpTools.length === 0 && serviceUrl?.trim() && ( +
+ No tools available from this MCP server +
+ )} +
+ ); + }; + return ( - ({ id: item, content: item, value: item }))} - required={!field.optional} - disabled={!field.editable} - onChange={(e) => { - setValue(field.key, e.target.value); - field.onValueChange?.(e.target.value); - }} - sx={{ width: "100%" }} - containerSx={{ width: "100%" }} - addNewBtnClick={field.addNewButton ? () => openSubPanel({ view: SubPanelView.ADD_NEW_FORM }) : undefined} - /> + <> + ({ id: item, content: item, value: item }))} + required={!field.optional} + disabled={!field.editable} + onChange={(e) => { + setValue(field.key, e.target.value); + field.onValueChange?.(e.target.value); + }} + sx={{ width: "100%" }} + containerSx={{ width: "100%" }} + addNewBtnClick={field.addNewButton ? () => openSubPanel({ view: SubPanelView.ADD_NEW_FORM }) : undefined} + /> + + {renderToolsSelection()} + ); } diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx index 9763e2ad4ac..f7c2707f004 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx @@ -110,7 +110,14 @@ export const EditorFactory = (props: FormFieldEditorProps) => { } else if (field.type === "FILE_SELECT" && field.editable) { return ; } else if (field.type === "SINGLE_SELECT" && field.editable) { + // return ; // HACK:Single select field is treat as type editor for now + console.log(">>> Single select field is treated as type editor", field); return ; } else if (!field.items && (field.key === "type" || field.type === "TYPE") && field.editable) { // Type field is a type editor diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index 404e065d6f2..e846bb1c108 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -13,8 +13,11 @@ import { FlowNode } from "@wso2/ballerina-core"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { ActionButtons, Button, Codicon, ThemeColors, Dropdown } from "@wso2/ui-toolkit"; import { RelativeLoader } from "../../../components/RelativeLoader"; +import FormGenerator from "../Forms/FormGenerator"; import { addMcpServerToAgentNode, updateMcpServerToAgentNode, findAgentNodeFromAgentCallNode, getAgentFilePath } from "./utils"; import { TextField, CheckBox } from '@wso2/ui-toolkit'; +import { FormField, FormValues } from "@wso2/ballerina-side-panel"; +import { set } from "lodash"; const NameContainer = styled.div` display: flex; @@ -257,6 +260,12 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { initPanel(); }, [agentCallNode]); + useEffect(() => { + if (mcpToolResponse && mcpToolResponse.properties) { + updateMcpToolResponseWithToolsField(); + } + }, [mcpToolResponse]); + // Effect to fetch MCP tools when serviceUrl changes and toolSelection is "Selected" useEffect(() => { if (toolSelection === "Selected" && serviceUrl.trim()) { @@ -692,6 +701,85 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { width: 100%; `; + const fields: FormField[] = [ + { + key: `name`, + label: "Tool Name", + type: "IDENTIFIER", + valueType: "IDENTIFIER", + optional: false, + editable: true, + documentation: "Enter the name of the tool.", + value: "", + valueTypeConstraint: "Global", + enabled: true, + }, + { + key: `description`, + label: "Description", + type: "TEXTAREA", + optional: true, + editable: true, + documentation: "Enter the description of the tool.", + value: "", + valueType: "STRING", + valueTypeConstraint: "", + enabled: true, + } + ]; + + const fieldVal = { + key: "scope", + advanced: false, + codedata: { + kind: 'REQUIRED', + originalName: 'scope', + }, + editable: true, + hidden: false, + metadata: { + label: "Tools to Include", + description: "Select the tools to include in the MCP server." + }, + optional: false, + placeholder: "", + valueType: "SINGLE_SELECT", + valueTypeConstraint: "string", + typeMembers: [ + { + type: "string", + packageInfo: "", + packageName: "", + kind: "BASIC_TYPE", + selected: false + } + ], + imports: {}, + defaultValue: "" + }; + + const updateMcpToolResponseWithToolsField = () => { + // First check if mcpToolResponse exists + if (!mcpToolResponse) { + console.warn("mcpToolResponse is null or undefined"); + return; + } + + // Create updated properties with safe defaults + const updatedProperties = { + ...(mcpToolResponse.properties || {}), // Fallback to empty object if properties is null/undefined + scope: fieldVal + }; + + // Create the updated response + const updatedMcpToolResponse = { + ...mcpToolResponse, + properties: updatedProperties + }; + console.log(">>> mcp tools after", updatedMcpToolResponse); + setMcpToolResponse(updatedMcpToolResponse); + }; + return ( @@ -701,54 +789,17 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { )} - <> - - - {editMode ? "Edit MCP server configuration." : "Add an MCP server to provide tools to the Agent."} - - - - - - - - - - - - - setToolSelection(value)} - /> - - - {renderToolsSelection()} - + {mcpToolResponse && ( + + )} + {renderToolsSelection()}
{editMode ? ( // Edit mode: Show only Save button @@ -773,7 +824,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { )}
-
); } + From c8122b18d5f3fad21419d4ac1d36df35dd91165e Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Sat, 19 Jul 2025 13:58:20 +0530 Subject: [PATCH 073/349] Remove redundant code lines --- .../src/components/editors/DropdownEditor.tsx | 217 +----------------- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 45 +--- 2 files changed, 10 insertions(+), 252 deletions(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx index 299fabd94f4..7137f090fbd 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx @@ -16,76 +16,16 @@ * under the License. */ -import React, { useState, useEffect } from "react"; +import React from "react"; import styled from "@emotion/styled"; -import { Dropdown, Button, CheckBox, ThemeColors } from "@wso2/ui-toolkit"; +import { Dropdown } from "@wso2/ui-toolkit"; import { FormField } from "../Form/types"; import { capitalize, getValueForDropdown } from "./utils"; import { useFormContext } from "../../context"; import { SubPanel, SubPanelView } from "@wso2/ballerina-core"; -// Styled components for tools selection -const ToolsContainer = styled.div` - display: flex; - flex-direction: column; - gap: 8px; - margin-top: 12px; - padding: 12px; - border: 1px solid ${ThemeColors.OUTLINE_VARIANT}; - border-radius: 8px; -`; - -const ToolsHeader = styled.div` - display: flex; - flex-direction: row; - align-items: center; - justify-content: space-between; - margin-bottom: 8px; -`; - -const ToolsTitle = styled.div` - font-size: 14px; - font-family: GilmerBold; - color: ${ThemeColors.ON_SURFACE}; -`; - -const ToolCheckboxContainer = styled.div` - display: flex; - flex-direction: column; - gap: 6px; - max-height: 200px; - overflow-y: auto; -`; - -const ToolCheckboxItem = styled.div` - display: flex; - flex-direction: row; - align-items: center; - gap: 8px; - padding: 4px 0; -`; - -const ErrorMessage = styled.div` - color: ${ThemeColors.ERROR}; - font-size: 12px; - margin-top: 4px; -`; - -const LoadingMessage = styled.div` - color: ${ThemeColors.ON_SURFACE_VARIANT}; - font-size: 12px; - display: flex; - align-items: center; - gap: 8px; -`; - -interface Tool { - name: string; - description?: string; -} - interface DropdownEditorProps { field: FormField; openSubPanel?: (subPanel: SubPanel) => void; @@ -97,161 +37,10 @@ interface DropdownEditorProps { } export function DropdownEditor(props: DropdownEditorProps) { - console.log(">>> DropdownEditor", props); const { field, openSubPanel, serviceUrl, configs, rpcClient, onToolsChange } = props; const { form } = useFormContext(); const { register, setValue, watch } = form; - - // Watch the current value of this dropdown - const currentValue = watch(field.key); - - // State for MCP tools functionality - const [mcpTools, setMcpTools] = useState([]); - const [selectedMcpTools, setSelectedMcpTools] = useState>(new Set()); - const [loadingMcpTools, setLoadingMcpTools] = useState(false); - const [mcpToolsError, setMcpToolsError] = useState(""); - - // HACK: create values for Scope field - if (field.key === "scope") { - field.items = ["All", "Selected"]; - } - - // Effect to fetch MCP tools when scope is "Selected" and serviceUrl is available - useEffect(() => { - if (field.key === "scope" && currentValue === "Selected" && serviceUrl?.trim()) { - fetchMcpTools(); - } else { - // Clear tools when not in selected mode or no URL - setMcpTools([]); - setSelectedMcpTools(new Set()); - setMcpToolsError(""); - } - }, [currentValue, serviceUrl, field.key]); - // Notify parent component when selected tools change - useEffect(() => { - if (onToolsChange) { - onToolsChange(Array.from(selectedMcpTools)); - } - }, [selectedMcpTools, onToolsChange]); - - const fetchMcpTools = async () => { - if (!serviceUrl?.trim() || !rpcClient) { - return; - } - - setLoadingMcpTools(true); - setMcpToolsError(""); - setMcpTools([]); - setSelectedMcpTools(new Set()); - - try { - const languageServerClient = rpcClient.getAIAgentRpcClient(); - - if (typeof languageServerClient.getMcpTools === 'function') { - console.log(">>> Fetching MCP tools from server"); - const response = await languageServerClient.getMcpTools({ - serviceUrl: serviceUrl.trim(), - configs: configs || {} - }); - - console.log(">>> MCP tools response", response); - - if (response.tools && Array.isArray(response.tools)) { - setMcpTools(response.tools); - } else { - setMcpToolsError("No tools found in MCP server response"); - } - } - } catch (error) { - console.error(">>> Error fetching MCP tools", error); - setMcpToolsError(`Failed to fetch tools from MCP server: ${error || 'Unknown error'}`); - } finally { - setLoadingMcpTools(false); - } - }; - - const handleToolSelectionChange = (toolName: string, isSelected: boolean) => { - const newSelectedTools = new Set(selectedMcpTools); - if (isSelected) { - newSelectedTools.add(toolName); - } else { - newSelectedTools.delete(toolName); - } - setSelectedMcpTools(newSelectedTools); - }; - - const handleSelectAllTools = () => { - if (selectedMcpTools.size === mcpTools.length) { - // Deselect all - setSelectedMcpTools(new Set()); - } else { - // Select all - setSelectedMcpTools(new Set(mcpTools.map(tool => tool.name))); - } - }; - - const renderToolsSelection = () => { - if (field.key !== "scope" || currentValue !== "Selected") { - return null; - } - - return ( - - - Available Tools - {mcpTools.length > 0 && ( - - )} - - - {loadingMcpTools && ( - - Loading tools from MCP server... - - )} - - {mcpToolsError && ( - {mcpToolsError} - )} - - {mcpTools.length > 0 && ( - - {mcpTools.map((tool) => ( - - !loadingMcpTools && handleToolSelectionChange(tool.name, !selectedMcpTools.has(tool.name))} - > - -
-
{tool.name}
- {tool.description && ( -
- {tool.description} -
- )} -
-
- ))} -
- )} - - {!loadingMcpTools && !mcpToolsError && mcpTools.length === 0 && serviceUrl?.trim() && ( -
- No tools available from this MCP server -
- )} -
- ); - }; return ( <> @@ -271,8 +60,6 @@ export function DropdownEditor(props: DropdownEditorProps) { containerSx={{ width: "100%" }} addNewBtnClick={field.addNewButton ? () => openSubPanel({ view: SubPanelView.ADD_NEW_FORM }) : undefined} /> - - {renderToolsSelection()} ); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index e846bb1c108..7c62bbbfb5a 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -247,6 +247,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { const [savingForm, setSavingForm] = useState(false); const agentFilePath = useRef(""); + const hasUpdatedToolsField = useRef(false); const handleAddNewMcpServer = () => { onAddMcpServer(); @@ -261,8 +262,10 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { }, [agentCallNode]); useEffect(() => { - if (mcpToolResponse && mcpToolResponse.properties) { + if (mcpToolResponse && !hasUpdatedToolsField.current) { + console.log("Running updateMcpToolResponseWithToolsField", mcpToolResponse); updateMcpToolResponseWithToolsField(); + hasUpdatedToolsField.current = true; } }, [mcpToolResponse]); @@ -354,6 +357,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { }; const initPanel = async () => { + hasUpdatedToolsField.current = false; // Reset on panel init setLoading(true); // get agent file path agentFilePath.current = await getAgentFilePath(rpcClient); @@ -759,24 +763,16 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { }; const updateMcpToolResponseWithToolsField = () => { - // First check if mcpToolResponse exists - if (!mcpToolResponse) { - console.warn("mcpToolResponse is null or undefined"); - return; - } - - // Create updated properties with safe defaults + const updatedProperties = { - ...(mcpToolResponse.properties || {}), // Fallback to empty object if properties is null/undefined + ...(mcpToolResponse.properties || {}), scope: fieldVal }; - - // Create the updated response + const updatedMcpToolResponse = { ...mcpToolResponse, properties: updatedProperties }; - console.log(">>> mcp tools after", updatedMcpToolResponse); setMcpToolResponse(updatedMcpToolResponse); }; @@ -799,31 +795,6 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { onSubmit={onSave} /> )} - {renderToolsSelection()} -
- {editMode ? ( - // Edit mode: Show only Save button - - {savingForm ? "Saving..." : "Save"} - - ) : ( - // Add mode: Show Back and Add to Agent buttons - <> - - - {savingForm ? "Adding..." : "Add to Agent"} - - - )} -
); } From 0a6e5807b2e63b4333fc1c0a28a9e8f8621aab69 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Sun, 20 Jul 2025 22:41:53 +0530 Subject: [PATCH 074/349] Support for editing mcp toolkits by passing update node --- .../src/rpc-types/ai-agent/interfaces.ts | 2 + .../src/rpc-managers/ai-agent/rpc-manager.ts | 100 ++++++++---------- .../src/components/editors/DropdownEditor.tsx | 3 + .../editors/DynamicDropdownEditor.tsx | 66 ++++++++++++ .../ballerina-visualizer/src/utils/bi.tsx | 1 + .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 93 +++++++++++----- .../views/BI/Forms/FormGenerator/index.tsx | 4 +- 7 files changed, 185 insertions(+), 84 deletions(-) create mode 100644 workspaces/ballerina/ballerina-side-panel/src/components/editors/DynamicDropdownEditor.tsx 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 f9f665f01c5..9c02384a509 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 @@ -71,4 +71,6 @@ export interface McpToolUpdateRequest { serviceUrl: string; serverName: string; selectedTools: string[]; + formValues?: FlowNode; // Optional: form values from AddMcpServer + updatedNode?: FlowNode; // Optional: updated node for toolkit edits } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts index 9ab9ac5a67f..235b836c16e 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts @@ -411,50 +411,55 @@ export class AiAgentRpcManager implements AIAgentAPI { // Generate the variable name from the server name const variableName = this.toCamelCase(params.serverName); - - // 1. Create the MCP ToolKit variable declaration - const nodeTemplate = await StateMachine.langClient().getNodeTemplate({ - position: params.agentFlowNode.codedata.lineRange.endLine, - filePath: filePath, - id: { - node: "CLASS_INIT", - org: "ballerinax", - module: "ai", - packageName: "ai", - version: "1.2.1", - symbol: "init", - object: "McpToolKit" - } - }); - nodeTemplate.flowNode.properties["serverUrl"].value = params.serviceUrl; - nodeTemplate.flowNode.properties["info"].value = - '{' + - 'name: "' + params.serverName.replace(/"/g, '\\"') + '",' + - 'version: "1.0.0"' + - '}'; - if (Array.isArray(params.selectedTools) && params.selectedTools.length === 0) { - nodeTemplate.flowNode.properties["permittedTools"].value = "()"; - } else { - nodeTemplate.flowNode.properties["permittedTools"].value = - "[" + params.selectedTools.map((s: string) => `"${s}"`).join(", ") + "]"; + // 1. Use the updatedNode from params for the MCP ToolKit edits + let mcpEdits: { [filePath: string]: any[] } = {}; + if (params.updatedNode) { + // Get the template node + const nodeTemplate = await StateMachine.langClient().getNodeTemplate({ + position: params.agentFlowNode.codedata.lineRange.endLine, + filePath: filePath, + id: { + node: "CLASS_INIT", + org: "ballerinax", + module: "ai", + packageName: "ai", + version: "1.2.1", + symbol: "init", + object: "McpToolKit" + } + }); + + nodeTemplate.flowNode.properties["serverUrl"] = params.updatedNode.properties["serverUrl"]; + nodeTemplate.flowNode.properties["info"] = params.updatedNode.properties["info"]; + nodeTemplate.flowNode.properties["variable"].value = variableName; + nodeTemplate.flowNode.properties["permittedTools"].value = `()`; + // nodeTemplate.flowNode.properties["permittedTools"].value = "()"; + // Use only the template node for generating text edits + const mcpToolKitEdits = await StateMachine.langClient().getSourceCode({ + filePath: filePath, + flowNode: nodeTemplate.flowNode, + }); + mcpEdits = mcpToolKitEdits.textEdits; + + + for (const key in mcpToolKitEdits.textEdits) { + const filtered = mcpToolKitEdits.textEdits[key] + .filter(edit => !edit.newText.includes("import")) + .map(edit => ({ + ...edit + })); + + if (filtered.length > 0) { + mcpEdits[key] = filtered; + } + } } - nodeTemplate.flowNode.codedata.lineRange = { - fileName: filePath, - startLine: params.agentFlowNode.codedata.lineRange.startLine, - endLine: params.agentFlowNode.codedata.lineRange.endLine - }; - nodeTemplate.flowNode.properties["variable"].value = variableName; - - const mcpToolKitEdits = await StateMachine.langClient().getSourceCode({ - filePath: filePath, - flowNode: nodeTemplate.flowNode, - }); // 2. Update the agent's tools array to include the variable name (following updateAIAgentTools pattern) const agentFlowNode = params.agentFlowNode; let toolsValue = agentFlowNode.properties["tools"].value; - + // Parse existing tools and add the variable name if (typeof toolsValue === "string") { const toolsArray = this.parseToolsString(toolsValue); @@ -469,31 +474,18 @@ export class AiAgentRpcManager implements AIAgentAPI { toolsValue = `[${variableName}]`; } } - + // Set the updated tools value agentFlowNode.properties["tools"].value = toolsValue; - + // Generate source code for the updated agent const agentEdits = await StateMachine.langClient().getSourceCode({ filePath: filePath, flowNode: agentFlowNode }); - // 3. Filter and combine both edits - const mcpEdits: { [filePath: string]: any[] } = {}; - for (const key in mcpToolKitEdits.textEdits) { - const filtered = mcpToolKitEdits.textEdits[key] - .filter(edit => !edit.newText.includes("import")) - .map(edit => ({ - ...edit - })); - - if (filtered.length > 0) { - mcpEdits[key] = filtered; - } - } - // Apply both edits + // 3. Apply both edits await updateSourceCode({ textEdits: mcpEdits }); await updateSourceCode({ textEdits: agentEdits.textEdits }); } diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx index 7137f090fbd..3ca26ce8b68 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx @@ -41,6 +41,9 @@ export function DropdownEditor(props: DropdownEditorProps) { const { form } = useFormContext(); const { register, setValue, watch } = form; + if (field.key === "scope") { + field.items = ["Global", "Local"]; + } return ( <> diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DynamicDropdownEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DynamicDropdownEditor.tsx new file mode 100644 index 00000000000..126560694f3 --- /dev/null +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DynamicDropdownEditor.tsx @@ -0,0 +1,66 @@ +/** + * 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 React from "react"; +import styled from "@emotion/styled"; + +import { Dropdown } from "@wso2/ui-toolkit"; + +import { FormField } from "../Form/types"; +import { capitalize, getValueForDropdown } from "./utils"; +import { useFormContext } from "../../context"; +import { SubPanel, SubPanelView } from "@wso2/ballerina-core"; + +interface DropdownEditorProps { + field: FormField; + openSubPanel?: (subPanel: SubPanel) => void; + // Additional props for MCP tools functionality + serviceUrl?: string; + configs?: object; + rpcClient?: any; + onToolsChange?: (selectedTools: string[]) => void; +} + +export function DynamicDropdownEditor(props: DropdownEditorProps) { + const { field, openSubPanel, serviceUrl, configs, rpcClient, onToolsChange } = props; + const { form } = useFormContext(); + const { register, setValue, watch } = form; + + field.items = ["All", "Selected"]; + + return ( + <> + ({ id: item, content: item, value: item }))} + required={!field.optional} + disabled={!field.editable} + onChange={(e) => { + setValue(field.key, e.target.value); + field.onValueChange?.(e.target.value); + }} + sx={{ width: "100%" }} + containerSx={{ width: "100%" }} + addNewBtnClick={field.addNewButton ? () => openSubPanel({ view: SubPanelView.ADD_NEW_FORM }) : undefined} + /> + + ); +} diff --git a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx index 70f2f16b39c..ac8b9edf795 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx @@ -192,6 +192,7 @@ export function convertNodePropertyToFormField( advanceProps: convertNodePropertiesToFormFields(property.advanceProperties), valueType: property.valueType, items: getFormFieldItems(property, connections), + itemOptions: property.itemOptions, diagnostics: property.diagnostics?.diagnostics || [], valueTypeConstraint: property.valueTypeConstraint, lineRange: property?.codedata?.lineRange, diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index 7c62bbbfb5a..cc4340f23d3 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -182,10 +182,10 @@ const LoadingMessage = styled.div` gap: 8px; `; -const CheckboxIcon = styled.div<{ visible: boolean }>` +const CheckboxIcon = styled.div<{ visible: boolean }>((props: React.PropsWithChildren<{ visible: boolean }>) => ` width: 10px; height: 10px; - opacity: ${props => props.visible ? 1 : 0}; + opacity: ${props.visible ? 1 : 0}; transition: opacity 0.2s ease; display: flex; align-items: center; @@ -201,7 +201,7 @@ const CheckboxIcon = styled.div<{ visible: boolean }>` background-position: center; background-size: contain; } -`; +`); interface Tool { name: string; @@ -533,38 +533,44 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { } }; - const handleOnSave = async () => { - console.log(">>> save value", { selectedTool, selectedMcpTools: Array.from(selectedMcpTools) }); - - let defaultName = "MCP Server"; - if (mcpToolkitCount > 1) { - defaultName += ` 0${mcpToolkitCount}`; + // Update handleOnSave to accept all submitted form values + const handleOnSave = async ( + node?: FlowNode, + isDataMapper?: boolean, + formImports?: any, + rawFormValues?: FormValues + ) => { + console.log("All submitted form values:", rawFormValues); + // Use the same logic as the display to determine the name + let finalName; + if (name.trim() !== "") { + finalName = name.trim(); + } else { + finalName = mcpToolkitCount > 1 ? `MCP Server 0${mcpToolkitCount}` : "MCP Server"; } + const payload = { - name: name.trim() || defaultName, + name: finalName, serviceUrl: serviceUrl.trim(), configs: configs, toolSelection, selectedTools: toolSelection === "Selected" ? Array.from(selectedMcpTools) : [] }; - setMcpToolkitCount(mcpToolkitCount + 1); - console.log(">>> toolkit count", mcpToolkitCount); console.log(">>> Saving with payload:", payload); setSavingForm(true); try { - // update the agent node - const updatedAgentNode = await addMcpServerToAgentNode(agentNode, payload); - // generate the source code - const agentResponse = await rpcClient - .getBIDiagramRpcClient() - .getSourceCode({ filePath: agentFilePath.current, flowNode: updatedAgentNode }); - console.log(">>> response getSourceCode with template ", { agentResponse }); - + await rpcClient.getAIAgentRpcClient().updateMCPToolKit({ + agentFlowNode: agentNode, + serviceUrl: `"${payload.serviceUrl}"`, + serverName: finalName, + selectedTools: payload.selectedTools, + oldVariableName: "", + updatedNode: node + }); onSave?.(); } catch (error) { console.error(">>> Error saving MCP server", error); - // You might want to show an error message to the user here } finally { setSavingForm(false); } @@ -647,7 +653,6 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { Available Tools {mcpTools.length > 0 && ( + )} + + {loadingMcpTools && ( + + + Loading tools from MCP server... + + )} + {mcpToolsError && ( + {mcpToolsError} + )} + {mcpTools.length > 0 && ( + + {mcpTools.map((tool) => ( + + !loadingMcpTools && handleToolSelectionChange(tool.name, !selectedMcpTools.has(tool.name))} + > + +
+
{tool.name}
+ {tool.description && ( +
+ {tool.description} +
+ )} +
+
+ ))} +
+ )} + {!loadingMcpTools && !mcpToolsError && mcpTools.length === 0 && localServiceUrl.trim() && ( +
+ No tools available from this MCP server +
+ )} + + ); + }; + + const showScopeControls = field.key === "scope"; return ( - <> + { setValue(field.key, e.target.value); field.onValueChange?.(e.target.value); + if (field.key === "scope") setToolSelection(e.target.value); }} sx={{ width: "100%" }} containerSx={{ width: "100%" }} addNewBtnClick={field.addNewButton ? () => openSubPanel({ view: SubPanelView.ADD_NEW_FORM }) : undefined} /> - + {showScopeControls && } + {showScopeControls && toolSelection === "Selected" && ( +
+ setLocalServiceUrl(e.target.value)} + placeholder="Enter MCP server URL" + sx={{ width: "100%" }} + /> +
+ )} + {showScopeControls && renderToolsSelection()} +
); } diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx index f7c2707f004..91384624a13 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx @@ -55,6 +55,7 @@ interface FormFieldEditorProps { recordTypeFields?: RecordTypeField[]; onIdentifierEditingStateChange?: (isEditing: boolean) => void; setSubComponentEnabled?: (isAdding: boolean) => void; + scopeFieldAddon?: React.ReactNode; } export const EditorFactory = (props: FormFieldEditorProps) => { @@ -70,7 +71,8 @@ export const EditorFactory = (props: FormFieldEditorProps) => { visualizableFields, recordTypeFields, onIdentifierEditingStateChange, - setSubComponentEnabled + setSubComponentEnabled, + scopeFieldAddon } = props; if (!field.enabled || field.hidden) { return <>; @@ -118,7 +120,7 @@ export const EditorFactory = (props: FormFieldEditorProps) => { // />; // HACK:Single select field is treat as type editor for now console.log(">>> Single select field is treated as type editor", field); - return ; + return ; } else if (!field.items && (field.key === "type" || field.type === "TYPE") && field.editable) { // Type field is a type editor return ( diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/RelativeLoader/index.d.ts b/workspaces/ballerina/ballerina-visualizer/src/components/RelativeLoader/index.d.ts new file mode 100644 index 00000000000..cb7cb507d91 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/components/RelativeLoader/index.d.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. + */ +interface LoadingRingProps { + message?: string; +} +export declare const RelativeLoader: ({ message }: LoadingRingProps) => JSX.Element; +export {}; diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/RelativeLoader/index.js b/workspaces/ballerina/ballerina-visualizer/src/components/RelativeLoader/index.js new file mode 100644 index 00000000000..d693463bc62 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/components/RelativeLoader/index.js @@ -0,0 +1,38 @@ +/** + * 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 React from "react"; +import styled from "@emotion/styled"; +import { ProgressRing, ThemeColors } from "@wso2/ui-toolkit"; +import { Typography } from "@wso2/ui-toolkit"; +export const RelativeLoader = ({ message }) => { + const ProgressContainer = styled.div ` + display: flex; + flex-direction: column; + align-items: center; + gap: 16px; + `; + const LoadingText = styled(Typography) ` + margin-top: 16px; + color: var(--vscode-descriptionForeground); + font-size: 14px; + `; + return (React.createElement(ProgressContainer, null, + React.createElement(ProgressRing, { color: ThemeColors.PRIMARY }), + message && (React.createElement(LoadingText, { variant: "body2" }, message)))); +}; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/RelativeLoader/index.js.map b/workspaces/ballerina/ballerina-visualizer/src/components/RelativeLoader/index.js.map new file mode 100644 index 00000000000..462a61d9621 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/components/RelativeLoader/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAK9C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAE,OAAO,EAAoB,EAAE,EAAE;IAC5D,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;KAKnC,CAAC;IAEF,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;;;;KAIrC,CAAC;IAEF,OAAO,CACH,oBAAC,iBAAiB;QACd,oBAAC,YAAY,IAAC,KAAK,EAAE,WAAW,CAAC,OAAO,GAAG;QAC1C,OAAO,IAAI,CACR,oBAAC,WAAW,IAAC,OAAO,EAAC,OAAO,IACvB,OAAO,CACE,CACjB,CACe,CACvB,CAAC;AACN,CAAC,CAAC"} \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index cc4340f23d3..317a87030a9 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -568,6 +568,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { oldVariableName: "", updatedNode: node }); + setServiceUrl(payload.serviceUrl); onSave?.(); } catch (error) { console.error(">>> Error saving MCP server", error); @@ -779,38 +780,32 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { }; const updateMcpToolResponseWithToolsField = () => { - // Extract current values for edit mode - let currentName = name; - let currentDescription = ""; - let currentScope = toolSelection; // "All" or "Selected" - - // Try to extract description from agentNode or toolsStringList if available - if (editMode && agentNode && agentNode.properties && agentNode.properties.description) { - currentDescription = agentNode.properties.description.value || ""; - } + if (mcpToolResponse) { + // Clone properties to avoid mutating state directly + const updatedProperties = { ...(mcpToolResponse.properties || {}) }; - // Update the properties with current values - const updatedProperties = { - ...(mcpToolResponse.properties || {}), - name: { - ...fields[0], - value: currentName, - }, - description: { - ...fields[1], - value: currentDescription, - }, - scope: { - ...fieldVal, - value: currentScope, - }, - }; + if (editMode) { + if ("serverUrl" in updatedProperties && updatedProperties["serverUrl"]) { + (updatedProperties["serverUrl"] as { value: string }).value = serviceUrl; + } + if ("info" in updatedProperties && updatedProperties["info"]) { + (updatedProperties["info"] as { value: string }).value = `{ name: "${name}", version: "" }`; + } + if ("variable" in updatedProperties && updatedProperties["variable"]) { + (updatedProperties["variable"] as { value: string }).value = "mcpServer"; + } + } - const updatedMcpToolResponse = { - ...mcpToolResponse, - properties: updatedProperties - }; - setMcpToolResponse(updatedMcpToolResponse); + // Add fieldVal as a property named 'scope', wrapped as a Property object + updatedProperties["scope"] = fieldVal; + + const updatedMcpToolResponse = { + ...mcpToolResponse, + properties: updatedProperties, + }; + + setMcpToolResponse(updatedMcpToolResponse); + } }; return ( @@ -830,6 +825,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { submitText={"Save Tool"} node={mcpToolResponse} onSubmit={handleOnSave} + scopeFieldAddon={renderToolsSelection()} /> )} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx index a2e0434c2ab..076fb647259 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx @@ -113,6 +113,7 @@ interface FormProps { description?: string; // Optional description explaining what the action button does callback: () => void; }; + scopeFieldAddon?: React.ReactNode; } // Styled component for the action button description @@ -158,6 +159,7 @@ export function FormGenerator(props: FormProps) { disableSaveButton, actionButtonConfig, submitText, + scopeFieldAddon, } = props; const { rpcClient } = useRpcContext(); @@ -826,6 +828,7 @@ export function FormGenerator(props: FormProps) { isInferredReturnType={!!node.codedata?.inferredReturnType} formImports={formImports} preserveOrder={node.codedata.node === "VARIABLE" || node.codedata.node === "CONFIG_VARIABLE"} + scopeFieldAddon={scopeFieldAddon} /> )} {typeEditorState.isOpen && ( From 63ba4c2aeba2225fc70f8507b3635c58242dc2fa Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Mon, 21 Jul 2025 03:40:02 +0530 Subject: [PATCH 076/349] Fix updating the mcp toolkit using the selected tools --- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 1 + .../views/BI/Forms/FormGenerator/index.tsx | 1 + .../src/rpc-types/ai-agent/interfaces.ts | 1 + .../src/rpc-managers/ai-agent/rpc-manager.ts | 6 +- .../src/components/Form/index.tsx | 25 +++ .../src/components/editors/DropdownEditor.tsx | 134 +++++++-------- .../src/components/editors/EditorFactory.tsx | 10 +- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 152 ++++++++++-------- .../views/BI/Forms/FormGenerator/index.tsx | 18 ++- 9 files changed, 197 insertions(+), 151 deletions(-) create mode 100644 workspaces/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx create mode 100644 workspaces/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx diff --git a/workspaces/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx new file mode 100644 index 00000000000..0519ecba6ea --- /dev/null +++ b/workspaces/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/workspaces/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx b/workspaces/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx new file mode 100644 index 00000000000..0519ecba6ea --- /dev/null +++ b/workspaces/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx @@ -0,0 +1 @@ + \ No newline at end of file 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 9c02384a509..7150644260c 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 @@ -73,4 +73,5 @@ export interface McpToolUpdateRequest { selectedTools: string[]; formValues?: FlowNode; // Optional: form values from AddMcpServer updatedNode?: FlowNode; // Optional: updated node for toolkit edits + mcpTools?: any[]; // Optional: list of MCP tools } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts index 235b836c16e..d1d16e78efd 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts @@ -410,7 +410,7 @@ export class AiAgentRpcManager implements AIAgentAPI { const filePath = Utils.joinPath(URI.file(projectUri), "agents.bal").fsPath; // Generate the variable name from the server name - const variableName = this.toCamelCase(params.serverName); + const variableName = params.updatedNode.properties["variable"].value; // 1. Use the updatedNode from params for the MCP ToolKit edits let mcpEdits: { [filePath: string]: any[] } = {}; @@ -432,8 +432,8 @@ export class AiAgentRpcManager implements AIAgentAPI { nodeTemplate.flowNode.properties["serverUrl"] = params.updatedNode.properties["serverUrl"]; nodeTemplate.flowNode.properties["info"] = params.updatedNode.properties["info"]; - nodeTemplate.flowNode.properties["variable"].value = variableName; - nodeTemplate.flowNode.properties["permittedTools"].value = `()`; + nodeTemplate.flowNode.properties["variable"].value = params.updatedNode.properties["variable"].value; + nodeTemplate.flowNode.properties["permittedTools"].value = params.selectedTools.map(tool => `"${tool}"`); // nodeTemplate.flowNode.properties["permittedTools"].value = "()"; // Use only the template node for generating text edits const mcpToolKitEdits = await StateMachine.langClient().getSourceCode({ 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 833dcf24c5f..3ab41028fa1 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx @@ -346,6 +346,10 @@ export interface FormProps { formImports?: FormImports; preserveOrder?: boolean; scopeFieldAddon?: React.ReactNode; + newServerUrl?: string; + onChange?: (fieldKey: string, value: any, allValues: FormValues) => void; + mcpTools?: { name: string; description?: string }[]; + onToolsChange?: (selectedTools: string[]) => void; } export const Form = forwardRef((props: FormProps, ref) => { @@ -382,6 +386,9 @@ export const Form = forwardRef((props: FormProps, ref) => { formImports, preserveOrder = false, scopeFieldAddon, + newServerUrl, + mcpTools, + onToolsChange, } = props; const { @@ -501,6 +508,7 @@ export const Form = forwardRef((props: FormProps, ref) => { // Expose a method to trigger the save useImperativeHandle(ref, () => ({ triggerSave: () => handleSubmit(handleOnSave)(), // Call handleSubmit with the save function + resetForm: (values) => reset(values), })); const handleOpenRecordEditor = (open: boolean, typeField?: FormField) => { @@ -670,6 +678,20 @@ export const Form = forwardRef((props: FormProps, ref) => { } }; + const prevValuesRef = useRef({}); + const watchedValues = watch(); + useEffect(() => { + if (props.onChange) { + const prevValues = prevValuesRef.current; + Object.entries(watchedValues).forEach(([key, value]) => { + if (prevValues[key] !== value) { + props.onChange?.(key, value, watchedValues); + } + }); + prevValuesRef.current = { ...watchedValues }; + } + }, [watchedValues]); + return ( @@ -737,6 +759,9 @@ export const Form = forwardRef((props: FormProps, ref) => { recordTypeFields={recordTypeFields} onIdentifierEditingStateChange={handleIdentifierEditingStateChange} setSubComponentEnabled={setIsSubComponentEnabled} + newServerUrl={newServerUrl} + mcpTools={mcpTools} + onToolsChange={onToolsChange} /> {updatedField.key === "scope" && scopeFieldAddon} diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx index 1ee3fd82bdb..23e8bf874c2 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx @@ -35,6 +35,8 @@ interface DropdownEditorProps { rpcClient?: any; onToolsChange?: (selectedTools: string[]) => void; renderToolsSelection?: () => React.ReactNode; + newServerUrl?: string; + mcpTools?: { name: string; description?: string }[]; // <-- add this line } const ToolsContainer = styled.div` @@ -110,77 +112,55 @@ const DropdownSpacer = styled.div` `; export function DropdownEditor(props: DropdownEditorProps) { - const { field, openSubPanel, serviceUrl, configs, rpcClient, onToolsChange } = props; + const { field, openSubPanel, serviceUrl, configs, rpcClient, onToolsChange, newServerUrl } = props; const { form } = useFormContext(); const { register, setValue, watch } = form; + console.log(">>> DropdownEditor props:", props); // MCP tools selection state (self-contained) - const [mcpTools, setMcpTools] = useState<{ name: string; description?: string }[]>([]); + const DUMMY_TOOLS = [ + { name: "single-greet", description: "Greet a user with a single message" }, + { name: "multi-greet", description: "Greet a user with multiple messages" } + ]; + + const [mcpTools, setMcpTools] = useState<{ name: string; description?: string }[]>(props.mcpTools || DUMMY_TOOLS); + + // Sync mcpTools state with props.mcpTools + useEffect(() => { + if (props.mcpTools) { + setMcpTools(props.mcpTools); + } + }, [props.mcpTools]); const [selectedMcpTools, setSelectedMcpTools] = useState>(new Set()); const [loadingMcpTools, setLoadingMcpTools] = useState(false); const [mcpToolsError, setMcpToolsError] = useState(""); - const [toolSelection, setToolSelection] = useState("All"); + const toolSelection = watch(field.key); const [localServiceUrl, setLocalServiceUrl] = useState(""); const [localConfigs, setLocalConfigs] = useState({}); const [editMode] = useState(false); // You can set this based on your logic if needed // Debounce logic for serverUrl input const debounceTimeout = useRef | null>(null); - useEffect(() => { - if (field.key === "scope" && toolSelection === "Selected" && localServiceUrl.trim()) { - if (debounceTimeout.current) clearTimeout(debounceTimeout.current); - debounceTimeout.current = setTimeout(() => { - fetchMcpTools(); - }, 500); // 500ms debounce - } else { - setMcpTools([]); - setSelectedMcpTools(new Set()); - setMcpToolsError(""); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [toolSelection, localServiceUrl]); - - // Use the provided fetchMcpTools logic - const fetchMcpTools = async () => { - if (!localServiceUrl.trim() || !rpcClient) { - return; - } - - setLoadingMcpTools(true); - setMcpToolsError(""); - setMcpTools([]); - // Don't clear selected tools in edit mode - if (!editMode) { - setSelectedMcpTools(new Set()); - } - - try { - // Check if getMcpTools method exists in the RPC client - const languageServerClient = rpcClient.getAIAgentRpcClient?.(); - - if (typeof languageServerClient?.getMcpTools === 'function') { - // Use the actual RPC method if it exists - console.log(">>> Fetching MCP tools from server"); - const response = await languageServerClient.getMcpTools({ - serviceUrl: localServiceUrl.trim(), - configs: localConfigs - }); + // useEffect(() => { + // if (field.key === "scope" && toolSelection === "Selected" && localServiceUrl.trim()) { + // if (debounceTimeout.current) clearTimeout(debounceTimeout.current); + // debounceTimeout.current = setTimeout(() => { + // fetchMcpTools(); + // }, 500); // 500ms debounce + // } else { + // setMcpTools(mcpTools); + // setSelectedMcpTools(new Set()); + // setMcpToolsError(""); + // } + // // eslint-disable-next-line react-hooks/exhaustive-deps + // }, [toolSelection, localServiceUrl]); - console.log(">>> MCP tools response", response); - - if (response.tools && Array.isArray(response.tools)) { - setMcpTools(response.tools); - } else { - setMcpToolsError("No tools found in MCP server response"); - } - } - } catch (error) { - console.error(">>> Error fetching MCP tools", error); - setMcpToolsError(`Failed to fetch tools from MCP server: ${error || 'Unknown error'}`); - } finally { - setLoadingMcpTools(false); + useEffect(() => { + if (newServerUrl && newServerUrl !== localServiceUrl) { + setLocalServiceUrl(newServerUrl); + console.log(">>> New server URL set:", newServerUrl); } - }; + }, [newServerUrl]); const handleToolSelectionChange = (toolName: string, isSelected: boolean) => { const newSelectedTools = new Set(selectedMcpTools); @@ -190,17 +170,31 @@ export function DropdownEditor(props: DropdownEditorProps) { newSelectedTools.delete(toolName); } setSelectedMcpTools(newSelectedTools); + // Call the callback with the updated selection + props.onToolsChange?.(Array.from(newSelectedTools)); }; const handleSelectAllTools = () => { + let newSelectedTools: Set; if (selectedMcpTools.size === mcpTools.length) { - setSelectedMcpTools(new Set()); + newSelectedTools = new Set(); } else { - setSelectedMcpTools(new Set(mcpTools.map(tool => tool.name))); + newSelectedTools = new Set(mcpTools.map(tool => tool.name)); } + setSelectedMcpTools(newSelectedTools); + // Call the callback with the updated selection + props.onToolsChange?.(Array.from(newSelectedTools)); }; + // Call onToolsChange whenever selectedMcpTools changes + useEffect(() => { + props.onToolsChange?.(Array.from(selectedMcpTools)); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [selectedMcpTools]); + + // Update renderToolsSelection to use props.mcpTools if provided const renderToolsSelection = () => { + const tools = props.mcpTools ?? mcpTools; if (toolSelection !== "Selected") { return null; } @@ -209,12 +203,12 @@ export function DropdownEditor(props: DropdownEditorProps) { Available Tools - {mcpTools.length > 0 && ( + {tools.length > 0 && ( )} @@ -227,9 +221,9 @@ export function DropdownEditor(props: DropdownEditorProps) { {mcpToolsError && ( {mcpToolsError} )} - {mcpTools.length > 0 && ( + {tools.length > 0 && ( - {mcpTools.map((tool) => ( + {tools.map((tool) => ( )} - {!loadingMcpTools && !mcpToolsError && mcpTools.length === 0 && localServiceUrl.trim() && ( + {!loadingMcpTools && !mcpToolsError && tools.length === 0 && localServiceUrl.trim() && (
No tools available from this MCP server
@@ -259,7 +253,7 @@ export function DropdownEditor(props: DropdownEditorProps) { ); }; - const showScopeControls = field.key === "scope"; + const showScopeControls = field.key === "toolsToInclude"; return ( @@ -274,24 +268,12 @@ export function DropdownEditor(props: DropdownEditorProps) { onChange={(e) => { setValue(field.key, e.target.value); field.onValueChange?.(e.target.value); - if (field.key === "scope") setToolSelection(e.target.value); }} sx={{ width: "100%" }} containerSx={{ width: "100%" }} addNewBtnClick={field.addNewButton ? () => openSubPanel({ view: SubPanelView.ADD_NEW_FORM }) : undefined} /> {showScopeControls && } - {showScopeControls && toolSelection === "Selected" && ( -
- setLocalServiceUrl(e.target.value)} - placeholder="Enter MCP server URL" - sx={{ width: "100%" }} - /> -
- )} {showScopeControls && renderToolsSelection()}
); diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx index 91384624a13..499e7ddb650 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx @@ -56,6 +56,9 @@ interface FormFieldEditorProps { onIdentifierEditingStateChange?: (isEditing: boolean) => void; setSubComponentEnabled?: (isAdding: boolean) => void; scopeFieldAddon?: React.ReactNode; + newServerUrl?: string; + mcpTools?: { name: string; description?: string }[]; + onToolsChange?: (selectedTools: string[]) => void; } export const EditorFactory = (props: FormFieldEditorProps) => { @@ -72,7 +75,8 @@ export const EditorFactory = (props: FormFieldEditorProps) => { recordTypeFields, onIdentifierEditingStateChange, setSubComponentEnabled, - scopeFieldAddon + scopeFieldAddon, + newServerUrl } = props; if (!field.enabled || field.hidden) { return <>; @@ -108,7 +112,7 @@ export const EditorFactory = (props: FormFieldEditorProps) => { return ; } else if (field.type.toUpperCase() === "ENUM") { // Enum is a dropdown field - return ; + return ; } else if (field.type === "FILE_SELECT" && field.editable) { return ; } else if (field.type === "SINGLE_SELECT" && field.editable) { @@ -120,7 +124,7 @@ export const EditorFactory = (props: FormFieldEditorProps) => { // />; // HACK:Single select field is treat as type editor for now console.log(">>> Single select field is treated as type editor", field); - return ; + return ; } else if (!field.items && (field.key === "type" || field.type === "TYPE") && field.editable) { // Type field is a type editor return ( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index 317a87030a9..cc3f2e9e022 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -231,6 +231,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { const [mcpToolResponse, setMcpToolResponse] = useState(null); const [serviceUrl, setServiceUrl] = useState(""); + const [pendingServiceUrl, setPendingServiceUrl] = useState(""); const [errorInputs, setErrorInputs] = useState(false); const [configs, setConfigs] = useState({}); const [toolSelection, setToolSelection] = useState("All"); @@ -248,6 +249,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { const agentFilePath = useRef(""); const hasUpdatedToolsField = useRef(false); + const formRef = useRef(null); const handleAddNewMcpServer = () => { onAddMcpServer(); @@ -272,7 +274,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { // Effect to fetch MCP tools when serviceUrl changes and toolSelection is "Selected" useEffect(() => { if (toolSelection === "Selected" && serviceUrl.trim()) { - fetchMcpTools(); + fetchMcpTools(serviceUrl); } else { // Clear tools when not in selected mode or no URL setMcpTools([]); @@ -281,6 +283,15 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { } }, [toolSelection, serviceUrl]); + // Effect to fetch MCP tools when mcpToolResponse serviceUrl changes + useEffect(() => { + console.log(">>> mcpToolResponse serverUrl changed", (mcpToolResponse?.properties as any)?.['serverUrl']?.value); + const serverUrlProp = (mcpToolResponse?.properties as any)?.['serverUrl']?.value; + if (typeof serverUrlProp === "string" && serverUrlProp.trim() !== "") { + fetchMcpTools(serverUrlProp); + } + }, [(mcpToolResponse?.properties as any)?.['serverUrl']?.value]); + const fetchAgentNode = async () => { const agentNode = await findAgentNodeFromAgentCallNode(agentCallNode, rpcClient); setAgentNode(agentNode); @@ -302,13 +313,14 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { }); setMcpToolResponse(mcpToolResponse.flowNode) console.log(">>> response getSourceCode with template ", { mcpToolResponse }); + console.log(">>> agent node ", { agentNode }); if (agentNode?.properties?.tools?.value) { const toolsString = agentNode.properties.tools.value.toString(); const mcpToolkits = extractMcpToolkits(toolsString); console.log(">>> toolsString", toolsString); console.log(">>> mcpToolkits", mcpToolkits); if (mcpToolkits.length > 0) { - setMcpToolkitCount(mcpToolkits.length + 1); + setMcpToolkitCount(mcpToolkits.length); } setToolsStringList(toolsString); @@ -372,15 +384,11 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { }, [name, props.agentCallNode?.metadata?.data?.tools, toolsStringList]); const extractMcpToolkits = (toolsString: string): string[] => { - const mcpToolkits: string[] = []; - const regex = /check new ai:McpToolKit/g; - const matches = toolsString.match(regex); - - if (matches) { - mcpToolkits.push(...Array(matches.length).fill("MCP Server")); - } - - return mcpToolkits; + // Remove brackets and whitespace, then split by comma + return toolsString + .replace(/[\[\]\s]/g, '') // Remove [ ] and whitespace + .split(',') + .filter(Boolean); // Remove empty strings }; const fetchExistingTools = async () => { @@ -389,33 +397,25 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { setExistingTools(existingTools.tools); }; - const fetchMcpTools = async () => { - if (!serviceUrl.trim()) { + const fetchMcpTools = async (url: string) => { + // Remove leading/trailing double quotes if present + const cleanUrl = url.replace(/^"|"$/g, ''); + if (!cleanUrl.trim()) { return; } - setLoadingMcpTools(true); setMcpToolsError(""); setMcpTools([]); - // Don't clear selected tools in edit mode if (!editMode) { setSelectedMcpTools(new Set()); } - try { - // Check if getMcpTools method exists in the RPC client const languageServerClient = rpcClient.getAIAgentRpcClient(); - if (typeof languageServerClient.getMcpTools === 'function') { - // Use the actual RPC method if it exists - console.log(">>> Fetching MCP tools from server"); const response = await languageServerClient.getMcpTools({ - serviceUrl: serviceUrl.trim(), + serviceUrl: cleanUrl.trim(), configs: configs }); - - console.log(">>> MCP tools response", response); - if (response.tools && Array.isArray(response.tools)) { setMcpTools(response.tools); } else { @@ -423,13 +423,19 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { } } } catch (error) { - console.error(">>> Error fetching MCP tools", error); setMcpToolsError(`Failed to fetch tools from MCP server: ${error || 'Unknown error'}`); } finally { setLoadingMcpTools(false); } }; + // useEffect to fetch tools when pendingServiceUrl changes + useEffect(() => { + if (pendingServiceUrl.trim()) { + fetchMcpTools(pendingServiceUrl); + } + }, [pendingServiceUrl]); + const handleToolSelectionChange = (toolName: string, isSelected: boolean) => { const newSelectedTools = new Set(selectedMcpTools); if (isSelected) { @@ -540,6 +546,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { formImports?: any, rawFormValues?: FormValues ) => { + console.log(">>> selected tools", selectedTools) console.log("All submitted form values:", rawFormValues); // Use the same logic as the display to determine the name let finalName; @@ -554,7 +561,8 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { serviceUrl: serviceUrl.trim(), configs: configs, toolSelection, - selectedTools: toolSelection === "Selected" ? Array.from(selectedMcpTools) : [] + selectedTools: selectedTools, + mcpTools }; console.log(">>> Saving with payload:", payload); @@ -564,9 +572,10 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { agentFlowNode: agentNode, serviceUrl: `"${payload.serviceUrl}"`, serverName: finalName, - selectedTools: payload.selectedTools, + selectedTools: selectedTools, oldVariableName: "", - updatedNode: node + updatedNode: node, + mcpTools: payload.mcpTools // <-- pass mcpTools to the method }); setServiceUrl(payload.serviceUrl); onSave?.(); @@ -585,7 +594,8 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { serviceUrl: serviceUrl.trim(), configs: configs, toolSelection, - selectedTools: toolSelection === "Selected" ? Array.from(selectedMcpTools) : [] + selectedTools: toolSelection === "Selected" ? Array.from(selectedMcpTools) : [], + mcpTools // <-- pass mcpTools in the payload for edit as well }; console.log(">>> Updating with payload:", payload); @@ -635,6 +645,23 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { return candidateValue; }; + + const generateUniqueVariable = () => { + if (hasUserTyped || editMode) { + return name; + } + + let counter = mcpToolkitCount; + let candidateValue = counter >= 1 ? `mcpServer${counter}` : "mcpServer"; + while (existingMcpToolkits.some(existingName => + existingName.toLowerCase() === candidateValue.trim().toLowerCase() + )) { + counter++; + candidateValue = `mcpServer${counter}`; + } + return candidateValue; + }; + const computedValue = generateUniqueValue(); const hasExistingTools = existingTools.length > 0; @@ -643,7 +670,8 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { console.log(">>> rendering conditions", { hasExistingTools, isToolSelected, canSave, editMode }); - const renderToolsSelection = () => { + // Change renderToolsSelection to accept mcpTools as a parameter + const renderToolsSelection = (tools = mcpTools) => { if (toolSelection !== "Selected") { return null; } @@ -652,12 +680,12 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { Available Tools - {mcpTools.length > 0 && ( + {tools.length > 0 && ( )} @@ -673,9 +701,9 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { {mcpToolsError} )} - {mcpTools.length > 0 && ( + {tools.length > 0 && ( - {mcpTools.map((tool) => ( + {tools.map((tool) => ( )} - {!loadingMcpTools && !mcpToolsError && mcpTools.length === 0 && serviceUrl.trim() && ( + {!loadingMcpTools && !mcpToolsError && tools.length === 0 && serviceUrl.trim() && (
No tools available from this MCP server
@@ -711,32 +739,6 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { width: 100%; `; - const fields: FormField[] = [ - { - key: `name`, - label: "Tool Name", - type: "IDENTIFIER", - valueType: "IDENTIFIER", - optional: false, - editable: true, - documentation: "Enter the name of the tool.", - value: "", - valueTypeConstraint: "Global", - enabled: true, - }, - { - key: `description`, - label: "Description", - type: "TEXTAREA", - optional: true, - editable: true, - documentation: "Enter the description of the tool.", - value: "", - valueType: "STRING", - valueTypeConstraint: "", - enabled: true, - } - ]; const fieldVal = { key: "scope", @@ -791,13 +793,13 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { if ("info" in updatedProperties && updatedProperties["info"]) { (updatedProperties["info"] as { value: string }).value = `{ name: "${name}", version: "" }`; } - if ("variable" in updatedProperties && updatedProperties["variable"]) { - (updatedProperties["variable"] as { value: string }).value = "mcpServer"; - } } + if ("variable" in updatedProperties && updatedProperties["variable"]) { + (updatedProperties["variable"] as { value: string }).value = generateUniqueVariable(); + } // Add fieldVal as a property named 'scope', wrapped as a Property object - updatedProperties["scope"] = fieldVal; + (updatedProperties as any)["toolsToInclude"] = fieldVal; const updatedMcpToolResponse = { ...mcpToolResponse, @@ -808,6 +810,13 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { } }; + const [selectedTools, setSelectedTools] = useState([]); + + const handleToolsChange = (tools: string[]) => { + setSelectedTools(tools); + // You can do other things here as needed + }; + return ( @@ -819,13 +828,24 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { {mcpToolResponse && ( { + if (fieldKey === "serverUrl") { + setPendingServiceUrl(value); + setServiceUrl(value); + } + }} + mcpTools={mcpTools} + // Pass the handler to FormGenerator + onToolsChange={handleToolsChange} /> )} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx index 076fb647259..aede06c81d2 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx @@ -16,7 +16,7 @@ * under the License. */ -import { RefObject, useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { RefObject, useCallback, useEffect, useMemo, useRef, useState, forwardRef, useImperativeHandle } from "react"; import { EVENT_TYPE, ColorThemeKind, @@ -114,6 +114,10 @@ interface FormProps { callback: () => void; }; scopeFieldAddon?: React.ReactNode; + newServerUrl?: string; + onChange?: (fieldKey: string, value: any, allValues: FormValues) => void; + mcpTools?: { name: string; description?: string }[]; + onToolsChange?: (selectedTools: string[]) => void; } // Styled component for the action button description @@ -139,7 +143,7 @@ const StyledActionButton = styled(Button)` } `; -export function FormGenerator(props: FormProps) { +export const FormGenerator = forwardRef(function FormGenerator(props: FormProps, ref) { const { fileName, node, @@ -160,6 +164,9 @@ export function FormGenerator(props: FormProps) { actionButtonConfig, submitText, scopeFieldAddon, + newServerUrl, + onChange, + mcpTools, } = props; const { rpcClient } = useRpcContext(); @@ -803,6 +810,7 @@ export function FormGenerator(props: FormProps) { <> {fields && fields.length > 0 && ( )} {typeEditorState.isOpen && ( @@ -844,6 +856,6 @@ export function FormGenerator(props: FormProps) { )} ); -} +}); export default FormGenerator; From 7bae4983503ce2c480d04f190553d8c29d1bd4af Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Mon, 21 Jul 2025 09:54:47 +0530 Subject: [PATCH 077/349] Fix type casting issues --- .../src/rpc-managers/ai-agent/rpc-manager.ts | 4 ++-- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts index d1d16e78efd..a685ab46fb4 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts @@ -461,7 +461,7 @@ export class AiAgentRpcManager implements AIAgentAPI { let toolsValue = agentFlowNode.properties["tools"].value; // Parse existing tools and add the variable name - if (typeof toolsValue === "string") { + if (typeof toolsValue === "string" && typeof variableName === "string") { const toolsArray = this.parseToolsString(toolsValue); if (toolsArray.length > 0) { // Add the variable name if not exists @@ -469,7 +469,7 @@ export class AiAgentRpcManager implements AIAgentAPI { toolsArray.push(variableName); } // Update the tools value - toolsValue = toolsArray.length === 1 ? `[${toolsArray[0]}]` : `[${toolsArray.join(", ")}]`; + toolsValue = `[${toolsArray.join(", ")}]`; } else { toolsValue = `[${variableName}]`; } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index cc3f2e9e022..6a62db35523 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -573,7 +573,6 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { serviceUrl: `"${payload.serviceUrl}"`, serverName: finalName, selectedTools: selectedTools, - oldVariableName: "", updatedNode: node, mcpTools: payload.mcpTools // <-- pass mcpTools to the method }); From c3692b9916c07de1c8871c81b519206840fefc7b Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Mon, 21 Jul 2025 17:12:10 +0530 Subject: [PATCH 078/349] Use codedata to update the exact mcp toolkit variable --- .../src/rpc-types/ai-agent/interfaces.ts | 1 + .../src/rpc-managers/ai-agent/rpc-manager.ts | 28 +++++++++++++++++-- .../src/components/editors/EditorFactory.tsx | 2 +- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 23 ++++++++++++++- .../src/views/BI/FlowDiagram/PanelManager.tsx | 13 ++++++++- .../src/views/BI/FlowDiagram/index.tsx | 3 ++ 6 files changed, 64 insertions(+), 6 deletions(-) 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 7150644260c..4b3d3d03c18 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 @@ -74,4 +74,5 @@ export interface McpToolUpdateRequest { formValues?: FlowNode; // Optional: form values from AddMcpServer updatedNode?: FlowNode; // Optional: updated node for toolkit edits mcpTools?: any[]; // Optional: list of MCP tools + codedata?: CodeData; // Optional: code data for MCP toolkit } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts index a685ab46fb4..6c0d592cce9 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts @@ -434,7 +434,10 @@ export class AiAgentRpcManager implements AIAgentAPI { nodeTemplate.flowNode.properties["info"] = params.updatedNode.properties["info"]; nodeTemplate.flowNode.properties["variable"].value = params.updatedNode.properties["variable"].value; nodeTemplate.flowNode.properties["permittedTools"].value = params.selectedTools.map(tool => `"${tool}"`); - // nodeTemplate.flowNode.properties["permittedTools"].value = "()"; + // Pass codedata if present + if (params.codedata) { + nodeTemplate.flowNode.codedata.lineRange = params.codedata.lineRange; + } // Use only the template node for generating text edits const mcpToolKitEdits = await StateMachine.langClient().getSourceCode({ filePath: filePath, @@ -454,8 +457,27 @@ export class AiAgentRpcManager implements AIAgentAPI { mcpEdits[key] = filtered; } } + // Update the range fields using params.codedata.lineRange + if (params.codedata && params.codedata.lineRange) { + const { startLine, endLine } = params.codedata.lineRange; + for (const file in mcpEdits) { + mcpEdits[file] = mcpEdits[file].map(edit => ({ + ...edit, + range: { + start: { + line: startLine.line, + character: startLine.offset, + }, + end: { + line: endLine.line, + character: endLine.offset, + }, + } + })); + } + } } - + // 2. Update the agent's tools array to include the variable name (following updateAIAgentTools pattern) const agentFlowNode = params.agentFlowNode; let toolsValue = agentFlowNode.properties["tools"].value; @@ -469,7 +491,7 @@ export class AiAgentRpcManager implements AIAgentAPI { toolsArray.push(variableName); } // Update the tools value - toolsValue = `[${toolsArray.join(", ")}]`; + toolsValue = `[${toolsArray.join(", ")} ]`; } else { toolsValue = `[${variableName}]`; } diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx index 499e7ddb650..04a5e761451 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx @@ -124,7 +124,7 @@ export const EditorFactory = (props: FormFieldEditorProps) => { // />; // HACK:Single select field is treat as type editor for now console.log(">>> Single select field is treated as type editor", field); - return ; + return ; } else if (!field.items && (field.key === "type" || field.type === "TYPE") && field.editable) { // Type field is a type editor return ( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index 6a62db35523..de1f245c712 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -314,6 +314,26 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { setMcpToolResponse(mcpToolResponse.flowNode) console.log(">>> response getSourceCode with template ", { mcpToolResponse }); console.log(">>> agent node ", { agentNode }); + const variableNodes = await rpcClient.getBIDiagramRpcClient().getModuleNodes(); + console.log(">>> variableNodes", variableNodes); + if (editMode) { + // Find the variable with type 'ai:McpToolKit' + const mcpVariable = variableNodes.flowModel?.variables?.find( + (v) => v.properties?.type?.value === "ai:McpToolKit" && v.properties.variable?.value === name + ); + console.log(">>> mcpVariable", mcpVariable); + // Properly add toolsToInclude to the properties object + const updatedProperties = { ...(mcpVariable.properties || {}) }; + (updatedProperties as any)["toolsToInclude"] = fieldVal; + + const updatedMcpToolResponse = { + ...mcpVariable, + properties: updatedProperties, + codedata: mcpVariable.codedata, + }; + + setMcpToolResponse(updatedMcpToolResponse); + } if (agentNode?.properties?.tools?.value) { const toolsString = agentNode.properties.tools.value.toString(); const mcpToolkits = extractMcpToolkits(toolsString); @@ -574,7 +594,8 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { serverName: finalName, selectedTools: selectedTools, updatedNode: node, - mcpTools: payload.mcpTools // <-- pass mcpTools to the method + codedata: mcpToolResponse.codedata, + mcpTools: payload.mcpTools }); setServiceUrl(payload.serviceUrl); onSave?.(); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx index 754fff32181..51aa7ee2055 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx @@ -72,6 +72,7 @@ interface PanelManagerProps { editForm?: boolean; updatedExpressionField?: ExpressionFormField; showProgressIndicator?: boolean; + selectedMcpToolkitName?: string; // Action handlers onClose: () => void; @@ -115,6 +116,7 @@ export function PanelManager(props: PanelManagerProps) { editForm, updatedExpressionField, showProgressIndicator, + selectedMcpToolkitName, onClose, onBack, onSelectNode, @@ -204,7 +206,16 @@ export function PanelManager(props: PanelManagerProps) { return ; case SidePanelView.ADD_MCP_SERVER: - return ; + return ( + + ); case SidePanelView.EDIT_MCP_SERVER: return ; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index 36b22509f58..56ba03b4926 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -99,6 +99,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { const [subPanel, setSubPanel] = useState({ view: SubPanelView.UNDEFINED }); const [updatedExpressionField, setUpdatedExpressionField] = useState(undefined); const [breakpointInfo, setBreakpointInfo] = useState(); + const [selectedMcpToolkitName, setSelectedMcpToolkitName] = useState(undefined); const selectedNodeRef = useRef(); const nodeTemplateRef = useRef(); @@ -1065,6 +1066,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { selectedNodeRef.current = node; selectedClientName.current = tool.name; showEditForm.current = true; + setSelectedMcpToolkitName(tool.name); setShowProgressIndicator(true); // get project components to find the function @@ -1244,6 +1246,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { onDeleteTool={handleOnDeleteTool} onAddTool={handleOnAddTool} onAddMcpServer={handleOnAddMcpServer} + selectedMcpToolkitName={selectedMcpToolkitName} /> ); From 644ca3418bfeac5e219c24e282b7c51fe6ac3a0a Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Mon, 21 Jul 2025 19:35:56 +0530 Subject: [PATCH 079/349] Use proper variables for mcp toolkits --- .../src/rpc-managers/ai-agent/rpc-manager.ts | 8 +++++++- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 10 ++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts index 6c0d592cce9..95ee0ab9c06 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts @@ -433,7 +433,13 @@ export class AiAgentRpcManager implements AIAgentAPI { nodeTemplate.flowNode.properties["serverUrl"] = params.updatedNode.properties["serverUrl"]; nodeTemplate.flowNode.properties["info"] = params.updatedNode.properties["info"]; nodeTemplate.flowNode.properties["variable"].value = params.updatedNode.properties["variable"].value; - nodeTemplate.flowNode.properties["permittedTools"].value = params.selectedTools.map(tool => `"${tool}"`); + if (params.selectedTools.length === 0) { + (nodeTemplate.flowNode.properties["permittedTools"] as { value: any }).value = `()`; + } else { + if ("permittedTools" in nodeTemplate.flowNode.properties) { + (nodeTemplate.flowNode.properties["permittedTools"] as { value: any }).value = params.selectedTools.map(tool => `"${tool}"`); + } + } // Pass codedata if present if (params.codedata) { nodeTemplate.flowNode.codedata.lineRange = params.codedata.lineRange; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index de1f245c712..4ab1a36b5ec 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -229,6 +229,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { const [urlError, setUrlError] = useState(""); const [nameError, setNameError] = useState(""); const [mcpToolResponse, setMcpToolResponse] = useState(null); + const [allVariables, setAllVariables] = useState(null); const [serviceUrl, setServiceUrl] = useState(""); const [pendingServiceUrl, setPendingServiceUrl] = useState(""); @@ -316,6 +317,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { console.log(">>> agent node ", { agentNode }); const variableNodes = await rpcClient.getBIDiagramRpcClient().getModuleNodes(); console.log(">>> variableNodes", variableNodes); + setAllVariables(variableNodes.flowModel.variables); if (editMode) { // Find the variable with type 'ai:McpToolKit' const mcpVariable = variableNodes.flowModel?.variables?.find( @@ -324,6 +326,8 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { console.log(">>> mcpVariable", mcpVariable); // Properly add toolsToInclude to the properties object const updatedProperties = { ...(mcpVariable.properties || {}) }; + const permittedToolsValue = (mcpVariable.properties as any)?.permittedTools?.value; + fieldVal.value = permittedToolsValue === "()" ? "All" : "Selected"; (updatedProperties as any)["toolsToInclude"] = fieldVal; const updatedMcpToolResponse = { @@ -670,8 +674,9 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { if (hasUserTyped || editMode) { return name; } - + let counter = mcpToolkitCount; + console.log(">>> all variables", allVariables); let candidateValue = counter >= 1 ? `mcpServer${counter}` : "mcpServer"; while (existingMcpToolkits.some(existingName => existingName.toLowerCase() === candidateValue.trim().toLowerCase() @@ -816,7 +821,8 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { } if ("variable" in updatedProperties && updatedProperties["variable"]) { - (updatedProperties["variable"] as { value: string }).value = generateUniqueVariable(); + const uniqueVar = generateUniqueVariable(); + (updatedProperties["variable"] as { value: string }).value = uniqueVar; } // Add fieldVal as a property named 'scope', wrapped as a Property object (updatedProperties as any)["toolsToInclude"] = fieldVal; From d9af59a77ea6b2b9763defa6e03adb14e1e4e6ae Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Mon, 21 Jul 2025 19:54:02 +0530 Subject: [PATCH 080/349] Remove unused files --- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 1 - .../src/views/BI/Forms/FormGenerator/index.tsx | 1 - 2 files changed, 2 deletions(-) delete mode 100644 workspaces/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx delete mode 100644 workspaces/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx diff --git a/workspaces/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx deleted file mode 100644 index 0519ecba6ea..00000000000 --- a/workspaces/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/workspaces/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx b/workspaces/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx deleted file mode 100644 index 0519ecba6ea..00000000000 --- a/workspaces/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From e8dbd9ad4a18f1c2677b5fc6d00ddeb4cff356b2 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Mon, 21 Jul 2025 20:00:07 +0530 Subject: [PATCH 081/349] Remove unused lines --- .../src/components/editors/DropdownEditor.tsx | 15 +---- .../editors/DynamicDropdownEditor.tsx | 66 ------------------- .../src/components/editors/EditorFactory.tsx | 6 -- 3 files changed, 1 insertion(+), 86 deletions(-) delete mode 100644 workspaces/ballerina/ballerina-side-panel/src/components/editors/DynamicDropdownEditor.tsx diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx index 23e8bf874c2..c5e06470621 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx @@ -137,23 +137,10 @@ export function DropdownEditor(props: DropdownEditorProps) { const toolSelection = watch(field.key); const [localServiceUrl, setLocalServiceUrl] = useState(""); const [localConfigs, setLocalConfigs] = useState({}); - const [editMode] = useState(false); // You can set this based on your logic if needed + const [editMode] = useState(false); // Debounce logic for serverUrl input const debounceTimeout = useRef | null>(null); - // useEffect(() => { - // if (field.key === "scope" && toolSelection === "Selected" && localServiceUrl.trim()) { - // if (debounceTimeout.current) clearTimeout(debounceTimeout.current); - // debounceTimeout.current = setTimeout(() => { - // fetchMcpTools(); - // }, 500); // 500ms debounce - // } else { - // setMcpTools(mcpTools); - // setSelectedMcpTools(new Set()); - // setMcpToolsError(""); - // } - // // eslint-disable-next-line react-hooks/exhaustive-deps - // }, [toolSelection, localServiceUrl]); useEffect(() => { if (newServerUrl && newServerUrl !== localServiceUrl) { diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DynamicDropdownEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DynamicDropdownEditor.tsx deleted file mode 100644 index 126560694f3..00000000000 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DynamicDropdownEditor.tsx +++ /dev/null @@ -1,66 +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 React from "react"; -import styled from "@emotion/styled"; - -import { Dropdown } from "@wso2/ui-toolkit"; - -import { FormField } from "../Form/types"; -import { capitalize, getValueForDropdown } from "./utils"; -import { useFormContext } from "../../context"; -import { SubPanel, SubPanelView } from "@wso2/ballerina-core"; - -interface DropdownEditorProps { - field: FormField; - openSubPanel?: (subPanel: SubPanel) => void; - // Additional props for MCP tools functionality - serviceUrl?: string; - configs?: object; - rpcClient?: any; - onToolsChange?: (selectedTools: string[]) => void; -} - -export function DynamicDropdownEditor(props: DropdownEditorProps) { - const { field, openSubPanel, serviceUrl, configs, rpcClient, onToolsChange } = props; - const { form } = useFormContext(); - const { register, setValue, watch } = form; - - field.items = ["All", "Selected"]; - - return ( - <> - ({ id: item, content: item, value: item }))} - required={!field.optional} - disabled={!field.editable} - onChange={(e) => { - setValue(field.key, e.target.value); - field.onValueChange?.(e.target.value); - }} - sx={{ width: "100%" }} - containerSx={{ width: "100%" }} - addNewBtnClick={field.addNewButton ? () => openSubPanel({ view: SubPanelView.ADD_NEW_FORM }) : undefined} - /> - - ); -} diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx index 04a5e761451..8cf805a190b 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/EditorFactory.tsx @@ -116,12 +116,6 @@ export const EditorFactory = (props: FormFieldEditorProps) => { } else if (field.type === "FILE_SELECT" && field.editable) { return ; } else if (field.type === "SINGLE_SELECT" && field.editable) { - // return ; // HACK:Single select field is treat as type editor for now console.log(">>> Single select field is treated as type editor", field); return ; From 56ff75229b72862bd51f418242ca87b761d69867 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Tue, 22 Jul 2025 16:05:27 +0530 Subject: [PATCH 082/349] Remove redundant lines --- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 157 ++++-------------- 1 file changed, 35 insertions(+), 122 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index 4ab1a36b5ec..c0f1525ffc1 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -326,8 +326,12 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { console.log(">>> mcpVariable", mcpVariable); // Properly add toolsToInclude to the properties object const updatedProperties = { ...(mcpVariable.properties || {}) }; - const permittedToolsValue = (mcpVariable.properties as any)?.permittedTools?.value; - fieldVal.value = permittedToolsValue === "()" ? "All" : "Selected"; + let permittedToolsValue = (mcpVariable.properties as any)?.permittedTools?.value; + if (!permittedToolsValue) { + fieldVal.value = "All"; + } else { + fieldVal.value = permittedToolsValue === "()" ? "All" : "Selected"; + } (updatedProperties as any)["toolsToInclude"] = fieldVal; const updatedMcpToolResponse = { @@ -401,6 +405,8 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { await fetchExistingTools(); await fetchAgentNode(); setLoading(false); + // const configVariableNodes = await rpcClient.getBIDiagramRpcClient().getConfigVariablesV2(); + // console.log(">>> configVariableNodes", configVariableNodes); }; useEffect(() => { @@ -470,75 +476,6 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { setSelectedMcpTools(newSelectedTools); }; - const validateUrl = (url: string): string => { - if (!url.trim()) { - return ''; - } - - try { - const urlObj = new URL(url); - // Check if protocol is http or https - if (!['http:', 'https:'].includes(urlObj.protocol)) { - return 'URL must use HTTP or HTTPS protocol'; - } - return ''; - } catch (error) { - return 'Please enter a valid URL (e.g., http://example.com)'; - } - }; - - const handleServiceUrlChange = (e: React.ChangeEvent) => { - const newUrl = e.target.value; - setServiceUrl(newUrl); - const errorMessage = validateUrl(newUrl); - if (errorMessage == '') { - setErrorInputs(false); - setUrlError(''); - } else { - setErrorInputs(true); - setUrlError(errorMessage); - } - }; - - const handleNameChange = (e: React.ChangeEvent) => { - const newName = e.target.value; - setName(newName); - setHasUserTyped(true); - const errorMessage = validateName(newName); - if (errorMessage == '') { - setErrorInputs(false); - setNameError(''); - } else { - setErrorInputs(true); - setNameError(errorMessage); - } - }; - - const validateName = (name: string): string => { - if (!name.trim()) { - return ''; - } - - // Extract existing MCP toolkit names from the tools string - const existingMcpToolkits = extractMcpToolkitNames(toolsStringList); - - // Check if the name already exists (case-insensitive comparison) - const nameExists = existingMcpToolkits.some( - existingName => existingName.toLowerCase() === name.trim().toLowerCase() - ); - - if (nameExists && !editMode) { - return 'An MCP server with this name already exists'; - } - - // In edit mode, allow the current name but not other existing names - if (nameExists && editMode && props.name && name.trim().toLowerCase() !== props.name.toLowerCase()) { - return 'An MCP server with this name already exists'; - } - - return ''; - }; - const extractMcpToolkitNames = (toolsString: string): string[] => { const names: string[] = []; @@ -610,47 +547,6 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { } }; - const handleOnEdit = async () => { - console.log(">>> edit value", { selectedTool, selectedMcpTools: Array.from(selectedMcpTools) }); - - const payload = { - name: name.trim(), - serviceUrl: serviceUrl.trim(), - configs: configs, - toolSelection, - selectedTools: toolSelection === "Selected" ? Array.from(selectedMcpTools) : [], - mcpTools // <-- pass mcpTools in the payload for edit as well - }; - - console.log(">>> Updating with payload:", payload); - - setSavingForm(true); - try { - // Use the original name (from props) to identify which MCP server to update - const originalToolName = props.name || ""; - - // Update the existing MCP server configuration - const updatedAgentNode = await updateMcpServerToAgentNode(agentNode, payload, originalToolName); - - if (updatedAgentNode) { - // generate the source code - const agentResponse = await rpcClient - .getBIDiagramRpcClient() - .getSourceCode({ filePath: agentFilePath.current, flowNode: updatedAgentNode }); - console.log(">>> response getSourceCode with template ", { agentResponse }); - - onSave?.(); - } else { - console.error(">>> Failed to update MCP server - updatedAgentNode is null"); - } - } catch (error) { - console.error(">>> Error updating MCP server", error); - // You might want to show an error message to the user here - } finally { - setSavingForm(false); - } - }; - const existingMcpToolkits = extractMcpToolkitNames(toolsStringList); const generateUniqueValue = () => { @@ -670,17 +566,19 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { return candidateValue; }; - const generateUniqueVariable = () => { + // Refactored: Accept variables as parameter + const generateUniqueVariable = (variables: FlowNode[] = allVariables) => { if (hasUserTyped || editMode) { return name; } let counter = mcpToolkitCount; - console.log(">>> all variables", allVariables); let candidateValue = counter >= 1 ? `mcpServer${counter}` : "mcpServer"; - while (existingMcpToolkits.some(existingName => - existingName.toLowerCase() === candidateValue.trim().toLowerCase() - )) { + // Loop until candidateValue is unique among variables + while ((variables || []).some(v => { + const val = v.properties?.variable?.value; + return typeof val === 'string' && val.trim().toLowerCase() === candidateValue.trim().toLowerCase(); + })) { counter++; candidateValue = `mcpServer${counter}`; } @@ -806,7 +704,8 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { }] }; - const updateMcpToolResponseWithToolsField = () => { + // Refactor to accept variableName as parameter + const updateMcpToolResponseWithToolsField = (variableName?: string) => { if (mcpToolResponse) { // Clone properties to avoid mutating state directly const updatedProperties = { ...(mcpToolResponse.properties || {}) }; @@ -815,14 +714,20 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { if ("serverUrl" in updatedProperties && updatedProperties["serverUrl"]) { (updatedProperties["serverUrl"] as { value: string }).value = serviceUrl; } - if ("info" in updatedProperties && updatedProperties["info"]) { - (updatedProperties["info"] as { value: string }).value = `{ name: "${name}", version: "" }`; + // Only update 'info' if it exists in updatedProperties and has a 'value' property + if ("info" in updatedProperties && typeof (updatedProperties["info"] as any)?.value === "string") { + (updatedProperties["info"] as { value: string }).value = ((mcpToolResponse.properties as any)?.info?.value) || ""; } } if ("variable" in updatedProperties && updatedProperties["variable"]) { - const uniqueVar = generateUniqueVariable(); - (updatedProperties["variable"] as { value: string }).value = uniqueVar; + (updatedProperties["variable"] as { value: string }).value = variableName || generateUniqueVariable(allVariables); + } + let permittedToolsValue = (mcpToolResponse.properties as any)?.permittedTools?.value; + if (!permittedToolsValue) { + fieldVal.value = "All"; + } else { + fieldVal.value = permittedToolsValue === "()" ? "All" : "Selected"; } // Add fieldVal as a property named 'scope', wrapped as a Property object (updatedProperties as any)["toolsToInclude"] = fieldVal; @@ -843,6 +748,14 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { // You can do other things here as needed }; + useEffect(() => { + if (allVariables && Array.isArray(allVariables)) { + const uniqueVar = generateUniqueVariable(allVariables); + updateMcpToolResponseWithToolsField(uniqueVar); + console.log('Generated unique variable:', uniqueVar); + } + }, [allVariables]); + return ( From b66ae9e861fa82ff68600d71c7e336cab846311c Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Tue, 22 Jul 2025 17:12:37 +0530 Subject: [PATCH 083/349] Update extracting mcp toolkit variables --- .../src/views/BI/AIChatAgent/AddTool.tsx | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx index 2d63ce869ae..59a70ff1bb2 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx @@ -162,7 +162,7 @@ export function AddTool(props: AddToolProps): JSX.Element { if (agentNode?.properties?.tools?.value) { const toolsString = agentNode.properties.tools.value.toString(); - const mcpToolkits = extractMcpToolkits(toolsString); + const mcpToolkits = await extractMcpToolkits(toolsString); setExistingMcpToolkits(mcpToolkits); console.log("existingMcpToolkits", existingMcpToolkits); } @@ -177,16 +177,14 @@ export function AddTool(props: AddToolProps): JSX.Element { }; - const extractMcpToolkits = (toolsString: string): string[] => { - const mcpToolkits: string[] = []; - const regex = /check new ai:McpToolKit\([^}]*name:\s*"([^"]*)"[^}]*\}\)/g; - - let match; - while ((match = regex.exec(toolsString)) !== null) { - mcpToolkits.push(match[1]); - } - - return mcpToolkits; + const extractMcpToolkits = async (toolsString: string): Promise => { + const variableNodes = await rpcClient.getBIDiagramRpcClient().getModuleNodes(); + // Defensive: check for array + const variables = variableNodes.flowModel?.variables || []; + return variables + .filter((v: any) => v?.properties?.type?.value === "ai:McpToolKit") + .map((v: any) => v?.properties?.variable?.value) + .filter(Boolean); }; const fetchExistingTools = async () => { From 4a3bed822082c5d8df067b11d89e59bfcb303ec5 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Tue, 22 Jul 2025 17:19:22 +0530 Subject: [PATCH 084/349] Fix DropDownEditor to wrap with DropdownStack only with McpToolKit forms --- .../src/components/editors/DropdownEditor.tsx | 61 +++++++++++++------ 1 file changed, 41 insertions(+), 20 deletions(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx index c5e06470621..a746aa5b977 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx @@ -242,26 +242,47 @@ export function DropdownEditor(props: DropdownEditorProps) { const showScopeControls = field.key === "toolsToInclude"; + if (showScopeControls) { + return ( + + ({ id: item, content: item, value: item }))} + required={!field.optional} + disabled={!field.editable} + onChange={(e) => { + setValue(field.key, e.target.value); + field.onValueChange?.(e.target.value); + }} + sx={{ width: "100%" }} + containerSx={{ width: "100%" }} + addNewBtnClick={field.addNewButton ? () => openSubPanel({ view: SubPanelView.ADD_NEW_FORM }) : undefined} + /> + + {renderToolsSelection()} + + ); + } + return ( - - ({ id: item, content: item, value: item }))} - required={!field.optional} - disabled={!field.editable} - onChange={(e) => { - setValue(field.key, e.target.value); - field.onValueChange?.(e.target.value); - }} - sx={{ width: "100%" }} - containerSx={{ width: "100%" }} - addNewBtnClick={field.addNewButton ? () => openSubPanel({ view: SubPanelView.ADD_NEW_FORM }) : undefined} - /> - {showScopeControls && } - {showScopeControls && renderToolsSelection()} - + ({ id: item, content: item, value: item }))} + required={!field.optional} + disabled={!field.editable} + onChange={(e) => { + setValue(field.key, e.target.value); + field.onValueChange?.(e.target.value); + }} + sx={{ width: "100%" }} + containerSx={{ width: "100%" }} + addNewBtnClick={field.addNewButton ? () => openSubPanel({ view: SubPanelView.ADD_NEW_FORM }) : undefined} + /> ); } From ae2f80dced5446a0e831ca59eb84231195e85d25 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Wed, 23 Jul 2025 09:36:06 +0530 Subject: [PATCH 085/349] Remove unnecessary files --- .../src/components/RelativeLoader/index.js | 38 ------------------- .../components/RelativeLoader/index.js.map | 1 - 2 files changed, 39 deletions(-) delete mode 100644 workspaces/ballerina/ballerina-visualizer/src/components/RelativeLoader/index.js delete mode 100644 workspaces/ballerina/ballerina-visualizer/src/components/RelativeLoader/index.js.map diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/RelativeLoader/index.js b/workspaces/ballerina/ballerina-visualizer/src/components/RelativeLoader/index.js deleted file mode 100644 index d693463bc62..00000000000 --- a/workspaces/ballerina/ballerina-visualizer/src/components/RelativeLoader/index.js +++ /dev/null @@ -1,38 +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 React from "react"; -import styled from "@emotion/styled"; -import { ProgressRing, ThemeColors } from "@wso2/ui-toolkit"; -import { Typography } from "@wso2/ui-toolkit"; -export const RelativeLoader = ({ message }) => { - const ProgressContainer = styled.div ` - display: flex; - flex-direction: column; - align-items: center; - gap: 16px; - `; - const LoadingText = styled(Typography) ` - margin-top: 16px; - color: var(--vscode-descriptionForeground); - font-size: 14px; - `; - return (React.createElement(ProgressContainer, null, - React.createElement(ProgressRing, { color: ThemeColors.PRIMARY }), - message && (React.createElement(LoadingText, { variant: "body2" }, message)))); -}; -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/RelativeLoader/index.js.map b/workspaces/ballerina/ballerina-visualizer/src/components/RelativeLoader/index.js.map deleted file mode 100644 index 462a61d9621..00000000000 --- a/workspaces/ballerina/ballerina-visualizer/src/components/RelativeLoader/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAK9C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAE,OAAO,EAAoB,EAAE,EAAE;IAC5D,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;KAKnC,CAAC;IAEF,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;;;;KAIrC,CAAC;IAEF,OAAO,CACH,oBAAC,iBAAiB;QACd,oBAAC,YAAY,IAAC,KAAK,EAAE,WAAW,CAAC,OAAO,GAAG;QAC1C,OAAO,IAAI,CACR,oBAAC,WAAW,IAAC,OAAO,EAAC,OAAO,IACvB,OAAO,CACE,CACjB,CACe,CACvB,CAAC;AACN,CAAC,CAAC"} \ No newline at end of file From 40349aa711f64e46e31bdd053b47fbd880deb94d Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Wed, 23 Jul 2025 09:36:50 +0530 Subject: [PATCH 086/349] Remove redundant lines --- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index c0f1525ffc1..36288519026 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -405,8 +405,6 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { await fetchExistingTools(); await fetchAgentNode(); setLoading(false); - // const configVariableNodes = await rpcClient.getBIDiagramRpcClient().getConfigVariablesV2(); - // console.log(">>> configVariableNodes", configVariableNodes); }; useEffect(() => { From cbb3821d7d44fd4d02f9e065e7975542126a14cb Mon Sep 17 00:00:00 2001 From: Azeem Muzammil <33729295+AzeemMuzammil@users.noreply.github.com> Date: Wed, 23 Jul 2025 12:07:02 +0530 Subject: [PATCH 087/349] Update workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts --- .../ballerina-extension/src/features/ai/service/connection.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts index a39b6ce9993..00d091adb02 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts @@ -60,7 +60,7 @@ export async function fetchWithAuth(input: string | URL | Request, options: Requ } export const anthropic = createAnthropic({ - baseURL: BACKEND_URL+ "/intelligence-api/v1.0/claude", + baseURL: BACKEND_URL + "/intelligence-api/v1.0/claude", apiKey: "xx", //TODO: Gives error without this. see if we can remove, fetch: fetchWithAuth, }); From 62dda9bda92aca1145b382004dcc85492f1c86cd Mon Sep 17 00:00:00 2001 From: Azeem Muzammil Date: Wed, 23 Jul 2025 15:54:39 +0530 Subject: [PATCH 088/349] Implement state machine changes to support multi auth --- .../ballerina-core/src/state-machine-types.ts | 86 +++-- .../ballerina-extension/src/RPCLayer.ts | 4 +- .../src/features/ai/service/ask/ask.ts | 6 +- .../src/features/ai/service/code/code.ts | 6 +- .../src/features/ai/service/connection.ts | 60 ++- .../ai/service/datamapper/context_api.ts | 8 +- .../ai/service/datamapper/datamapper.ts | 4 +- .../ai/service/healthcare/healthcare.ts | 6 +- .../src/features/ai/service/libs/funcs.ts | 4 +- .../src/features/ai/service/libs/libs.ts | 4 +- .../features/ai/service/openapi/openapi.ts | 4 +- .../src/features/ai/service/test/test.ts | 4 +- .../src/features/ai/service/test/test_plan.ts | 4 +- .../src/rpc-managers/ai-panel/rpc-manager.ts | 6 +- .../src/rpc-managers/ai-panel/utils.ts | 346 +++++++++--------- .../ballerina-extension/src/utils/ai/auth.ts | 112 ++++-- .../src/views/ai-panel/aiMachine.ts | 229 +++++++++--- .../src/views/ai-panel/auth.ts | 25 +- .../src/views/ai-panel/utils.ts | 130 +++++++ .../src/BallerinaRpcClient.ts | 5 +- .../src/views/AIPanel/AIPanel.tsx | 103 ++++-- .../src/views/AIPanel/LoginPanel/index.tsx | 35 ++ .../AIPanel/WaitingForLoginSection/index.tsx | 232 +++++++++++- 23 files changed, 1042 insertions(+), 381 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/src/views/ai-panel/utils.ts diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index 69638f959f9..d7e60ed3e7f 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -161,9 +161,9 @@ export interface DownloadProgress { step?: number; } -export type ChatNotify = +export type ChatNotify = | ChatStart - | IntermidaryState + | IntermidaryState | ChatContent | CodeDiagnostics | CodeMessages @@ -171,37 +171,37 @@ export type ChatNotify = | ChatError; export interface ChatStart { - type : "start"; + type: "start"; } export interface IntermidaryState { - type : "intermediary_state"; - state : TestGeneratorIntermediaryState; // Smells off. Must revist later. + type: "intermediary_state"; + state: TestGeneratorIntermediaryState; // Smells off. Must revist later. } //TODO: Maybe rename content_block to content_append? export interface ChatContent { - type : "content_block" | "content_replace"; + type: "content_block" | "content_replace"; content: string; } export interface CodeDiagnostics { - type : "diagnostics"; + type: "diagnostics"; diagnostics: DiagnosticEntry[]; } //TODO: I'm not sure about messages, maybe revisit later. export interface CodeMessages { - type : "messages"; + type: "messages"; messages: any[]; } export interface ChatStop { - type : "stop"; + type: "stop"; } export interface ChatError { - type : "error"; + type: "error"; content: string; } @@ -227,42 +227,72 @@ export const breakpointChanged: NotificationType = { method: 'breakpoin export type AIMachineStateValue = | 'Initialize' // (checking auth, first load) | 'Unauthenticated' // (show login window) - | 'Authenticating' // (waiting for SSO login result after redirect) + | { Authenticating: 'determineFlow' | 'ssoFlow' | 'apiKeyFlow' | 'validatingApiKey' } // hierarchical substates | 'Authenticated' // (ready, main view) | 'Disabled'; // (optional: if AI Chat is globally unavailable) export enum AIMachineEventType { CHECK_AUTH = 'CHECK_AUTH', LOGIN = 'LOGIN', + AUTH_WITH_API_KEY = 'AUTH_WITH_API_KEY', + SUBMIT_API_KEY = 'SUBMIT_API_KEY', LOGOUT = 'LOGOUT', SILENT_LOGOUT = "SILENT_LOGOUT", - LOGIN_SUCCESS = 'LOGIN_SUCCESS', + COMPLETE_AUTH = 'COMPLETE_AUTH', CANCEL_LOGIN = 'CANCEL_LOGIN', RETRY = 'RETRY', DISPOSE = 'DISPOSE', } -export type AIMachineEventValue = - | { type: AIMachineEventType.CHECK_AUTH } - | { type: AIMachineEventType.LOGIN } - | { type: AIMachineEventType.LOGOUT } - | { type: AIMachineEventType.SILENT_LOGOUT } - | { type: AIMachineEventType.LOGIN_SUCCESS } - | { type: AIMachineEventType.CANCEL_LOGIN } - | { type: AIMachineEventType.RETRY } - | { type: AIMachineEventType.DISPOSE }; - -interface AIUsageTokens { - maxUsage: number; - remainingTokens: number; +export type AIMachineEventMap = { + [AIMachineEventType.CHECK_AUTH]: undefined; + [AIMachineEventType.LOGIN]: undefined; + [AIMachineEventType.AUTH_WITH_API_KEY]: undefined; + [AIMachineEventType.SUBMIT_API_KEY]: { apiKey: string }; + [AIMachineEventType.LOGOUT]: undefined; + [AIMachineEventType.SILENT_LOGOUT]: undefined; + [AIMachineEventType.COMPLETE_AUTH]: undefined; + [AIMachineEventType.CANCEL_LOGIN]: undefined; + [AIMachineEventType.RETRY]: undefined; + [AIMachineEventType.DISPOSE]: undefined; +}; + +export type AIMachineSendableEvent = + | { [K in keyof AIMachineEventMap]: AIMachineEventMap[K] extends undefined + ? { type: K } + : { type: K; payload: AIMachineEventMap[K] } + }[keyof AIMachineEventMap]; + +export enum LoginMethod { + BI_INTEL = 'biIntel', + ANTHROPIC_KEY = 'anthropic_key' } -export interface AIUserToken { +interface BIIntelSecrets { accessToken: string; - usageTokens?: AIUsageTokens; + refreshToken: string; +} + +interface AnthropicKeySecrets { + apiKey: string; +} + +export type AuthCredentials = + | { + loginMethod: LoginMethod.BI_INTEL; + secrets: BIIntelSecrets; + } + | { + loginMethod: LoginMethod.ANTHROPIC_KEY; + secrets: AnthropicKeySecrets; + }; + +export interface AIUserToken { + token: string; // For BI Intel, this is the access token and for Anthropic, this is the API key } export interface AIMachineContext { + loginMethod?: LoginMethod; userToken?: AIUserToken; errorMessage?: string; } @@ -275,5 +305,5 @@ export enum ColorThemeKind { } export const aiStateChanged: NotificationType = { method: 'aiStateChanged' }; -export const sendAIStateEvent: RequestType = { method: 'sendAIStateEvent' }; +export const sendAIStateEvent: RequestType = { method: 'sendAIStateEvent' }; export const currentThemeChanged: NotificationType = { method: 'currentThemeChanged' }; diff --git a/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts b/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts index 6326f6c0cc3..52ddaee05da 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 } from '@wso2/ballerina-core'; +import { stateChanged, getVisualizerLocation, VisualizerLocation, projectContentUpdated, aiStateChanged, sendAIStateEvent, popupStateChanged, getPopupVisualizerState, PopupVisualizerLocation, breakpointChanged, AIMachineEventType, ArtifactData, onArtifactUpdatedNotification, onArtifactUpdatedRequest, currentThemeChanged, AIMachineSendableEvent } 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'; @@ -94,7 +94,7 @@ export class RPCLayer { // ----- AI Webview RPC Methods registerAiPanelRpcHandlers(RPCLayer._messenger); - RPCLayer._messenger.onRequest(sendAIStateEvent, (event: AIMachineEventType) => AIStateMachine.sendEvent(event)); + RPCLayer._messenger.onRequest(sendAIStateEvent, (event: AIMachineEventType | AIMachineSendableEvent) => AIStateMachine.sendEvent(event)); // ----- Inline Data Mapper Webview RPC Methods registerInlineDataMapperRpcHandlers(RPCLayer._messenger); diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts index e3c64712224..e9009e71d00 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts @@ -19,7 +19,7 @@ import { BACKEND_URL } from "../../utils"; import { selectRequiredFunctions } from "../libs/funcs"; import { GenerationType, getSelectedLibraries } from "../libs/libs"; import { Library, LibraryWithUrl } from "../libs/libs_types"; -import { anthropic, ANTHROPIC_HAIKU, fetchWithAuth } from "../connection"; +import { getAnthropicClient, ANTHROPIC_HAIKU, fetchWithAuth } from "../connection"; import { z } from 'zod'; import { tool } from 'ai'; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; @@ -219,7 +219,7 @@ export async function getAskResponse(question: string): Promise async function getToolCallsFromClaude(question: string): Promise { const { text, toolCalls } = await generateText({ - model: anthropic(ANTHROPIC_HAIKU), + model: await getAnthropicClient(ANTHROPIC_HAIKU), maxTokens: 8192, tools: tools, messages: [ @@ -244,7 +244,7 @@ async function getToolCallsFromClaude(question: string): Promise { async function getFinalResponseFromClaude(systemMessage: string, question: string): Promise { const { text } = await generateText({ - model: anthropic(ANTHROPIC_HAIKU), + model: await getAnthropicClient(ANTHROPIC_HAIKU), maxTokens: 8192, system: systemMessage, messages: [ diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index b51776a3ff7..09a163efb64 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -15,7 +15,7 @@ // under the License. import { CoreMessage, generateText, streamText } from "ai"; -import { anthropic, ANTHROPIC_SONNET_4 } from "../connection"; +import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; import { GenerationType, getRelevantLibrariesAndFunctions } from "../libs/libs"; import { getRewrittenPrompt, populateHistory, transformProjectSource, getErrorMessage, extractResourceDocumentContent } from "../utils"; import { getMaximizedSelectedLibs, selectRequiredFunctions, toMaximizedLibrariesFromLibJson } from "./../libs/funcs"; @@ -75,7 +75,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler ]; const { fullStream } = streamText({ - model: anthropic(ANTHROPIC_SONNET_4), + model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxTokens: 4096*4, temperature: 0, messages: allMessages, @@ -329,7 +329,7 @@ export async function repairCode(params: RepairParams): Promise ]; const { text, usage, providerMetadata } = await generateText({ - model: anthropic(ANTHROPIC_SONNET_4), + model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxTokens: 4096 * 4, temperature: 0, messages: allMessages, diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts index 00d091adb02..67894d9867c 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts @@ -17,8 +17,20 @@ import { createAnthropic } from "@ai-sdk/anthropic"; import { getAccessToken, getRefreshedAccessToken } from "../../../utils/ai/auth"; import { AIStateMachine } from "../../../views/ai-panel/aiMachine"; -import { AIMachineEventType } from "@wso2/ballerina-core"; import { BACKEND_URL } from "../utils"; +import { AIMachineEventType, LoginMethod } from "@wso2/ballerina-core"; + +export const ANTHROPIC_HAIKU = "claude-3-5-haiku-20241022"; +export const ANTHROPIC_SONNET_4 = "claude-sonnet-4-20250514"; +export const ANTHROPIC_SONNET_3_5 = "claude-3-5-sonnet-20241022"; + +type AnthropicModel = + | typeof ANTHROPIC_HAIKU + | typeof ANTHROPIC_SONNET_4 + | typeof ANTHROPIC_SONNET_3_5; + +let cachedAnthropic: ReturnType | null = null; +let cachedAuthMethod: LoginMethod | null = null; /** * Reusable fetch function that handles authentication with token refresh @@ -28,18 +40,18 @@ import { BACKEND_URL } from "../utils"; */ export async function fetchWithAuth(input: string | URL | Request, options: RequestInit = {}): Promise { const accessToken = await getAccessToken(); - + // Ensure headers object exists options.headers = { ...options.headers, - 'Authorization': `Bearer ${accessToken}`, + 'Authorization': `Bearer ${accessToken.token}`, 'User-Agent': 'Ballerina-VSCode-Plugin', 'Connection': 'keep-alive', }; - + let response = await fetch(input, options); console.log("Response status: ", response.status); - + // Handle token expiration if (response.status === 401) { console.log("Token expired. Refreshing token..."); @@ -55,16 +67,36 @@ export async function fetchWithAuth(input: string | URL | Request, options: Requ throw new Error('Authentication failed: Unable to refresh token'); } } - + return response; } -export const anthropic = createAnthropic({ - baseURL: BACKEND_URL + "/intelligence-api/v1.0/claude", - apiKey: "xx", //TODO: Gives error without this. see if we can remove, - fetch: fetchWithAuth, -}); +/** + * Returns a singleton Anthropic client instance. + * Re-initializes the client if the login method has changed. + */ +export const getAnthropicClient = async (model: AnthropicModel) => { + const { token, loginMethod } = await getAccessToken(); -export const ANTHROPIC_HAIKU = "claude-3-5-haiku-20241022"; -export const ANTHROPIC_SONNET_4 = "claude-sonnet-4-20250514"; -export const ANTHROPIC_SONNET_3_5 = "claude-3-5-sonnet-20241022"; + // Recreate client if login method has changed or no cached instance + if (!cachedAnthropic || cachedAuthMethod !== loginMethod) { + if (loginMethod === LoginMethod.BI_INTEL) { + cachedAnthropic = createAnthropic({ + baseURL: BACKEND_URL + "/intelligence-api/v1.0/claude", + apiKey: "xx", // dummy value; real auth is via fetchWithAuth + fetch: fetchWithAuth, + }); + } else if (loginMethod === LoginMethod.ANTHROPIC_KEY) { + cachedAnthropic = createAnthropic({ + baseURL: "https://api.anthropic.com/v1", + apiKey: token, + }); + } else { + throw new Error(`Unsupported login method: ${loginMethod}`); + } + + cachedAuthMethod = loginMethod; + } + + return cachedAnthropic(model); +}; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts index 764516f5546..fdbbc67a4ec 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts @@ -15,7 +15,7 @@ // under the License. import { generateText, CoreMessage } from "ai"; -import { anthropic, ANTHROPIC_SONNET_4 } from "../connection"; +import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; // Types @@ -425,7 +425,7 @@ async function extractionUsingClaude({ pdfData, processType }: { pdfData: string ]; const { text } = await generateText({ - model: anthropic(ANTHROPIC_SONNET_4), + model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxTokens: 8192, temperature: 0, messages: messages, @@ -467,7 +467,7 @@ async function imageExtractionUsingClaude({ ]; const { text } = await generateText({ - model: anthropic(ANTHROPIC_SONNET_4), + model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxTokens: 8192, temperature: 0, messages: messages, @@ -494,7 +494,7 @@ async function textExtractionUsingClaude({ ]; const { text } = await generateText({ - model: anthropic(ANTHROPIC_SONNET_4), + model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxTokens: 8192, temperature: 0, messages: messages, 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 index 8cc63533652..3567ba8ff5b 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts @@ -16,7 +16,7 @@ import { generateText, CoreMessage, generateObject } from "ai"; import { getDataMappingPrompt } from "./prompt"; -import { anthropic, ANTHROPIC_SONNET_4 } from "../connection"; +import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; import { Payload, DatamapperResponse, @@ -293,7 +293,7 @@ async function getAutoMappings( try { const { object } = await generateObject({ - model: anthropic(ANTHROPIC_SONNET_4), + model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxTokens: 4096, temperature: 0, messages: messages, 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 index 973fdd53a16..f847e51efd3 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts @@ -15,7 +15,7 @@ // under the License. import { CoreMessage, generateObject, generateText, streamText } from "ai"; -import { anthropic, ANTHROPIC_HAIKU, ANTHROPIC_SONNET_3_5, ANTHROPIC_SONNET_4 } from "../connection"; +import { getAnthropicClient, ANTHROPIC_HAIKU, ANTHROPIC_SONNET_3_5, ANTHROPIC_SONNET_4 } from "../connection"; import { GenerationType, getRelevantLibrariesAndFunctions } from "../libs/libs"; import { getRewrittenPrompt, populateHistory, transformProjectSource, getErrorMessage } from "../utils"; import { @@ -89,7 +89,7 @@ export async function generateHealthcareCodeCore( ]; const { fullStream } = streamText({ - model: anthropic(ANTHROPIC_SONNET_3_5), + model: await getAnthropicClient(ANTHROPIC_SONNET_3_5), maxTokens: 4096*2, temperature: 0, messages: allMessages, @@ -370,7 +370,7 @@ Think step-by-step to choose the required types in order to solve the given ques ]; try { const { object } = await generateObject({ - model: anthropic(ANTHROPIC_HAIKU), + model: await getAnthropicClient(ANTHROPIC_HAIKU), maxTokens: 8192, temperature: 0, messages: messages, diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts index 860ba6bf94f..d898a0b36b4 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts @@ -19,7 +19,7 @@ import { generateObject, CoreMessage } from "ai"; import { GetFunctionResponse, GetFunctionsRequest, GetFunctionsResponse, getFunctionsResponseSchema, MinifiedClient, MinifiedRemoteFunction, MinifiedResourceFunction } from "./funcs_inter_types"; import { Client, GetTypeResponse, Library, RemoteFunction, ResourceFunction } from "./libs_types"; import { TypeDefinition, AbstractFunction, Type, RecordTypeDefinition } from "./libs_types"; -import { anthropic, ANTHROPIC_HAIKU } from "../connection"; +import { getAnthropicClient, ANTHROPIC_HAIKU } from "../connection"; import { GenerationType } from "./libs"; import { getRequiredTypesFromLibJson } from "../healthcare/healthcare"; import { langClient } from "../../activator"; @@ -199,7 +199,7 @@ Now, based on the provided libraries, clients, and functions, and the user query ]; try { const { object } = await generateObject({ - model: anthropic(ANTHROPIC_HAIKU), + model: await getAnthropicClient(ANTHROPIC_HAIKU), maxTokens: 8192, temperature: 0, messages: messages, 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 index 66a0f048db8..a112345fb33 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts @@ -23,7 +23,7 @@ import { } from "@wso2/ballerina-core"; import { Library } from "./libs_types"; import { selectRequiredFunctions } from "./funcs"; -import { anthropic, ANTHROPIC_HAIKU } from "../connection"; +import { getAnthropicClient, ANTHROPIC_HAIKU } from "../connection"; import { langClient } from "../../activator"; import { getGenerationMode } from "../utils"; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; @@ -80,7 +80,7 @@ export async function getSelectedLibraries(prompt: string, generationType: Gener //TODO: Add thinking and test with claude haiku const startTime = Date.now(); const { object } = await generateObject({ - model: anthropic(ANTHROPIC_HAIKU), + model: await getAnthropicClient(ANTHROPIC_HAIKU), maxTokens: 4096, temperature: 0, messages: messages, diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts index 56dd43dd820..f14f35266c8 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts @@ -16,7 +16,7 @@ import { GenerateOpenAPIRequest } from "@wso2/ballerina-core"; import { streamText } from "ai"; -import { anthropic, ANTHROPIC_HAIKU } from "../connection"; +import { getAnthropicClient, ANTHROPIC_HAIKU } from "../connection"; import { getErrorMessage, populateHistory } from "../utils"; import { CopilotEventHandler, createWebviewEventHandler } from "../event"; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; @@ -29,7 +29,7 @@ export async function generateOpenAPISpecCore( // Populate chat history and add user message const historyMessages = populateHistory(params.chatHistory); const { fullStream } = streamText({ - model: anthropic(ANTHROPIC_HAIKU), + model: await getAnthropicClient(ANTHROPIC_HAIKU), maxTokens: 8192, temperature: 0, messages: [ 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 index c7deeede90d..823ca0e19ba 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts @@ -15,7 +15,7 @@ // under the License. import { generateText, CoreMessage } from "ai"; -import { anthropic } from "../connection"; +import { getAnthropicClient } from "../connection"; import { getServiceTestGenerationSystemPrompt, getServiceTestDiagnosticsSystemPrompt, @@ -103,7 +103,7 @@ async function getStreamedTestResponse(request: TestGenerationRequest1): Promise } const { text } = await generateText({ - model: anthropic("claude-sonnet-4-20250514"), + model: await getAnthropicClient("claude-sonnet-4-20250514"), maxTokens: 16384, temperature: 0, system: systemPrompt, 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 index bb01764a329..9c224e4f22c 100644 --- 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 @@ -15,7 +15,7 @@ // under the License. import { CoreMessage, streamText } from "ai"; -import { anthropic, ANTHROPIC_SONNET_4 } from "../connection"; +import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; import { getErrorMessage } from "../utils"; import { TestGenerationTarget, TestPlanGenerationRequest } from "@wso2/ballerina-core"; import { generateTest, getDiagnostics } from "../../testGenerator"; @@ -122,7 +122,7 @@ export async function generateTestPlanCore( }, ]; const { fullStream } = streamText({ - model: anthropic(ANTHROPIC_SONNET_4), + model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxTokens: 8192, temperature: 0, messages: allMessages, 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 1e42c7dcf88..c3e1df1079f 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 @@ -142,12 +142,12 @@ export class AiPanelRpcManager implements AIPanelAPI { async getAccessToken(): Promise { return new Promise(async (resolve, reject) => { try { - const accessToken = getAccessToken(); + const accessToken = await getAccessToken(); if (!accessToken) { reject(new Error("Access Token is undefined")); return; } - resolve(accessToken); + resolve(accessToken.token); } catch (error) { reject(error); } @@ -729,7 +729,7 @@ export class AiPanelRpcManager implements AIPanelAPI { }, body: JSON.stringify(payload) }); - + if (response.ok) { resolve(true); } else { 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 66903577579..d063e0003e1 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 @@ -80,7 +80,7 @@ export function handleStop() { export async function getParamDefinitions( fnSt: FunctionDefinition, fileUri: string -): Promise { +): Promise { let inputs: { [key: string]: any } = {}; let inputMetadata: { [key: string]: any } = {}; let output: { [key: string]: any } = {}; @@ -139,7 +139,7 @@ export async function getParamDefinitions( if ('types' in inputTypeDefinition && !inputTypeDefinition.types[0].hasOwnProperty('type')) { if (STKindChecker.isQualifiedNameReference(parameter.typeName)) { throw new Error(`"${parameter.typeName["identifier"].value}" does not exist in the package "${parameter.typeName["modulePrefix"].value}". Please verify the record name or ensure that the correct package is imported.`); - } + } return INVALID_PARAMETER_TYPE; } @@ -175,7 +175,7 @@ export async function getParamDefinitions( if (isErrorCode(inputDefinition)) { return inputDefinition as ErrorCode; } - + inputs = { ...inputs, [paramName]: (inputDefinition as RecordDefinitonObject).recordFields }; inputMetadata = { ...inputMetadata, @@ -232,9 +232,9 @@ export async function getParamDefinitions( } else { if (!STKindChecker.isSimpleNameReference(fnSt.functionSignature.returnTypeDesc.type) && !STKindChecker.isQualifiedNameReference(fnSt.functionSignature.returnTypeDesc.type)) { - return INVALID_PARAMETER_TYPE; + return INVALID_PARAMETER_TYPE; } - } + } let returnType = fnSt.functionSignature.returnTypeDesc.type; @@ -272,7 +272,7 @@ export async function getParamDefinitions( if ('types' in outputTypeDefinition && !outputTypeDefinition.types[0].hasOwnProperty('type')) { if (STKindChecker.isQualifiedNameReference(returnType)) { throw new Error(`"${returnType["identifier"].value}" does not exist in the package "${returnType["modulePrefix"].value}". Please verify the record name or ensure that the correct package is imported.`); - } + } return INVALID_PARAMETER_TYPE; } @@ -325,7 +325,7 @@ export async function processMappings( if (isErrorCode(mappedResult)) { return mappedResult as ErrorCode; } - parameterDefinitions = mappedResult as ParameterMetadata; + parameterDefinitions = mappedResult as ParameterMetadata; } const codeObject = await getDatamapperCode(parameterDefinitions); @@ -380,7 +380,7 @@ export async function processMappings( } -export async function generateBallerinaCode(response: object, parameterDefinitions: ParameterMetadata | ErrorCode, nestedKey: string = "", nestedKeyArray: string[]): Promise { +export async function generateBallerinaCode(response: object, parameterDefinitions: ParameterMetadata | ErrorCode, nestedKey: string = "", nestedKeyArray: string[]): Promise { let recordFields: { [key: string]: any } = {}; const arrayRecords = [ "record[]", "record[]|()", "(readonly&record)[]", "(readonly&record)[]|()", @@ -393,7 +393,7 @@ export async function generateBallerinaCode(response: object, parameterDefinitio "(record|())[]", "(record|())[]|()", "(readonly&record|())[]", "(readonly&record|())[]|()", ]; const unionEnumIntersectionTypes = [ - "enum", "union", "intersection", "enum[]", + "enum", "union", "intersection", "enum[]", "enum[]|()", "union[]", "union[]|()", "intersection[]", "intersection[]|()"]; if (response.hasOwnProperty("code") && response.hasOwnProperty("message")) { @@ -404,7 +404,7 @@ export async function generateBallerinaCode(response: object, parameterDefinitio let path = await getMappingString(response, parameterDefinitions, nestedKey, recordTypes, unionEnumIntersectionTypes, arrayRecords, arrayEnumUnion, nestedKeyArray); if (isErrorCode(path)) { return {}; - } + } if (path === "") { return {}; } @@ -418,7 +418,7 @@ export async function generateBallerinaCode(response: object, parameterDefinitio for (let index = 0; index < objectKeys.length; index++) { let key = objectKeys[index]; let subRecord = response[key]; - + if (!subRecord.hasOwnProperty("operation") && !subRecord.hasOwnProperty("parameters") && !subRecord.hasOwnProperty("targetType")) { nestedKeyArray.push(key); let responseRecord = await generateBallerinaCode(subRecord, parameterDefinitions, key, nestedKeyArray); @@ -466,11 +466,11 @@ function isUnionType(type: string): boolean { return validUnionTypes.includes(sortedType); // Check against Set } -async function getMappingString(mapping: object, parameterDefinitions: ParameterMetadata | ErrorCode, nestedKey:string, recordTypes: string[], unionEnumIntersectionTypes: string[], arrayRecords: string[], arrayEnumUnion: string[], nestedKeyArray: string[]): Promise { +async function getMappingString(mapping: object, parameterDefinitions: ParameterMetadata | ErrorCode, nestedKey: string, recordTypes: string[], unionEnumIntersectionTypes: string[], arrayRecords: string[], arrayEnumUnion: string[], nestedKeyArray: string[]): Promise { let operation: string = mapping["operation"]; let targetType: string = mapping["targetType"]; let parameters: string[] = mapping["parameters"]; - + let path: string = ""; let modifiedPaths: string[] = []; let inputTypeName: string = ""; @@ -505,7 +505,7 @@ async function getMappingString(mapping: object, parameterDefinitions: Parameter outputObject = parameterDefinitions["outputMetadata"][nestedKey]; } - baseTargetType= targetType.replace(/\|\(\)$/, ""); + baseTargetType = targetType.replace(/\|\(\)$/, ""); inputTypeName = modifiedInput["typeName"]; baseType = inputTypeName.replace(/\|\(\)$/, ""); @@ -525,21 +525,21 @@ async function getMappingString(mapping: object, parameterDefinitions: Parameter if (recordTypes.includes(baseType)) { // Both baseType and baseTargetType either contain "[]" or do not if (!(hasArrayNotation(baseType) === hasArrayNotation(baseTargetType)) && !(baseTargetType === "int")) { - return ""; - } + return ""; + } } else if (unionEnumIntersectionTypes.includes(baseOutputType)) { // Both baseInputType and baseOutputType either contain "[]" or do not if (!(hasArrayNotation(baseInputType) === hasArrayNotation(baseOutputType))) { return ""; - } + } } modifiedPaths = await accessMetadata( - paths, - parameterDefinitions, - outputObject, - baseType, + paths, + parameterDefinitions, + outputObject, + baseType, baseTargetType, - nestedKey, + nestedKey, operation, unionEnumIntersectionTypes, recordTypes, @@ -590,19 +590,19 @@ async function getMappingString(mapping: object, parameterDefinitions: Parameter function convertUnionTypes(inputType: string, targetType: string, variablePath: string) { const inputTypes = inputType.split("|").filter(type => primitiveTypes.includes(type)); - + if (targetType === "string") { return `(${variablePath}).toString()`; } - + if (inputTypes.includes("string") && ["int", "float", "decimal", "boolean"].includes(targetType)) { return `(${variablePath}) is string ? check ${targetType}:fromString((${variablePath}).toString()) : check (${variablePath}).ensureType()`; } - + if (["int", "float", "decimal", "boolean"].includes(targetType)) { return `check (${variablePath}).ensureType()`; } - + return `${variablePath}`; } @@ -650,12 +650,12 @@ async function getMappingString(mapping: object, parameterDefinitions: Parameter return ""; } modifiedPaths = await accessMetadata( - paths, - parameterDefinitions, - outputObject, - baseType, + paths, + parameterDefinitions, + outputObject, + baseType, baseTargetType, - nestedKey, + nestedKey, operation, unionEnumIntersectionTypes, recordTypes, @@ -674,12 +674,12 @@ async function getMappingString(mapping: object, parameterDefinitions: Parameter return ""; } modifiedPaths = await accessMetadata( - paths, - parameterDefinitions, - outputObject, - baseType, + paths, + parameterDefinitions, + outputObject, + baseType, baseTargetType, - nestedKey, + nestedKey, operation, unionEnumIntersectionTypes, recordTypes, @@ -728,19 +728,19 @@ interface VisitorContext { // Implementation of the visitor class TypeInfoVisitorImpl implements TypeInfoVisitor { - constructor() {} + constructor() { } visitField(field: FormField, context: VisitorContext): void { // Reset state for each field this.resetContext(context); - + const typeName = field.typeName; - + if (!typeName) { this.handleTypeInfo(field, context); return; } - + switch (typeName) { case "record": this.visitRecord(field, context); @@ -760,7 +760,7 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { break; } } - + visitMember(member: any, context: VisitorContext): { typeName: string, member: any } { let typeName: string; if (member.typeName === "record" && member.fields) { @@ -778,11 +778,11 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { } return { typeName, member }; } - + visitRecord(field: FormField, context: VisitorContext): void { const temporaryRecord = navigateTypeInfo(field.fields, false); context.isRecord = true; - + const fieldName = getBalRecFieldName(field.name); context.recordFields[fieldName] = (temporaryRecord as RecordDefinitonObject).recordFields; context.recordFieldsMetadata[fieldName] = { @@ -794,14 +794,14 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { fields: (temporaryRecord as RecordDefinitonObject).recordFieldsMetadata }; } - + visitUnionOrIntersection(field: FormField, context: VisitorContext): void { let memberTypeNames: string[] = []; let resolvedTypeName: string = ""; - + // Check for record fields in union members and handle appropriately this.processUnionMembers(field.members, context); - + for (const member of field.members) { const result = this.visitMember(member, context); memberTypeNames.push(result.typeName); @@ -816,26 +816,26 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { context.memberFieldsMetadata = {}; return; } - + resolvedTypeName = this.getResolvedTypeName(field.typeName, memberTypeNames); - + this.buildFieldMetadata(field, resolvedTypeName, context); this.setFieldAndMetadata(field, resolvedTypeName, context); } - + visitArray(field: FormField, context: VisitorContext): void { - if (field.memberType.hasOwnProperty("members") && + if (field.memberType.hasOwnProperty("members") && ["union", "intersection", "enum"].includes(field.memberType.typeName)) { - + // Handle array with union/intersection/enum member type this.processUnionMembers(field.memberType.members, context); - + if (field.memberType.members.length === 0) { context.memberRecordFields = {}; context.memberFieldsMetadata = {}; return; } - + this.handleArrayWithCompositeType(field, context); } else if (field.memberType.hasOwnProperty("fields") && field.memberType.typeName === "record") { this.handleArrayWithRecordType(field, context); @@ -843,24 +843,24 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { this.handleSimpleArray(field, context); } } - + visitEnum(field: FormField, context: VisitorContext): void { let memberTypeNames: string[] = []; - + for (const member of field.members) { const result = this.visitMember(member, context); memberTypeNames.push(result.typeName); } - + const resolvedTypeName = memberTypeNames.join("|"); - + this.buildFieldMetadata(field, resolvedTypeName, context); this.setFieldAndMetadata(field, resolvedTypeName, context); } - + visitPrimitive(field: FormField, context: VisitorContext): void { const typeName = field.typeName; - + if (field.hasOwnProperty("name")) { const fieldName = getBalRecFieldName(field.name); context.recordFields[fieldName] = { type: typeName, comment: "" }; @@ -882,7 +882,7 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { }; } } - + private handleTypeInfo(field: FormField, context: VisitorContext): void { const fieldName = getBalRecFieldName(field.name); context.recordFields[fieldName] = { type: field.typeInfo.name, comment: "" }; @@ -894,12 +894,12 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { optional: field.optional }; } - + private handleRecordMember(member: any, context: VisitorContext): string { const temporaryRecord = navigateTypeInfo(member.fields, false); context.isRecord = true; let memberName: string; - + if (context.isUnion && member.hasOwnProperty("name")) { memberName = member.name; const fieldName = getBalRecFieldName(memberName); @@ -910,7 +910,7 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { type: "record", typeInstance: fieldName, typeName: member.typeName, - fields: (temporaryRecord as RecordDefinitonObject).recordFieldsMetadata + fields: (temporaryRecord as RecordDefinitonObject).recordFieldsMetadata }; } else { memberName = "record"; @@ -923,14 +923,14 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { ...((temporaryRecord as RecordDefinitonObject).recordFieldsMetadata) }; } - + return memberName; } - + private handleArrayMember(member: any, context: VisitorContext): { typeName: string, member: any } { context.isArray = true; let memberName: string; - + if (member.memberType.hasOwnProperty("fields") && member.memberType.typeName === "record") { const temporaryRecord = navigateTypeInfo(member.memberType.fields, false); memberName = `${member.memberType.typeName}[]`; @@ -942,12 +942,12 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { ...context.memberFieldsMetadata, ...((temporaryRecord as RecordDefinitonObject).recordFieldsMetadata) }; - } else if (member.memberType.hasOwnProperty("members") && - ["union", "intersection", "enum"].includes(member.memberType.typeName)) { - + } else if (member.memberType.hasOwnProperty("members") && + ["union", "intersection", "enum"].includes(member.memberType.typeName)) { + // Process union members to handle records appropriately this.processUnionMembers(member.memberType.members, context); - + if (member.memberType.members.length === 0) { memberName = ""; member = []; @@ -958,73 +958,73 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { if (member.memberType.hasOwnProperty("name") && !member.memberType.hasOwnProperty("typeName")) { memberName = `${member.memberType.name}[]`; } else { - memberName = "record[]"; + memberName = "record[]"; } } else { memberName = `${member.memberType.typeName}[]`; } - + return { typeName: memberName, member }; } - + private handleArrayWithCompositeTypeMember(member: any, context: VisitorContext): string { let memberTypes: string[] = []; const members = member.memberType.members; - + this.determineIfUnion(members, context); - + for (const innerMember of members) { const result = this.visitMember(innerMember, context); memberTypes.push(result.typeName); } - + context.isSimple = false; - + if (member.memberType.typeName === "intersection") { return `(${memberTypes.join("&")})[]`; } else { return `(${memberTypes.join("|")})[]`; } } - + private handleCompositeMember(member: any, context: VisitorContext): string { let memberTypeNames: string[] = []; - + for (const innerMember of member.members) { const result = this.visitMember(innerMember, context); memberTypeNames.push(result.typeName); } - + if (member.typeName === "intersection") { return `${memberTypeNames.join("&")}`; } else { return `${memberTypeNames.join("|")}`; } } - + private handleNullMember(member: any, context: VisitorContext): string { const memberName = member.typeName; - + if (context.isArray) { context.isArrayNullable = true; - } + } if (context.isRecord) { context.isRecordNullable = true; - } - if (context.isSimple) { + } + if (context.isSimple) { context.isNullable = true; } - + return memberName; } - + private handleSimpleMember(member: any, context: VisitorContext): string { context.isSimple = true; let memberName: string; - + if (member.hasOwnProperty("typeName")) { memberName = member.typeName; - + if (member.hasOwnProperty("name")) { this.addNamedSimpleMember(member, memberName, context); } else { @@ -1033,10 +1033,10 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { } else { memberName = member.name; } - + return memberName; } - + private addNamedSimpleMember(member: any, memberName: string, context: VisitorContext): void { const fieldName = getBalRecFieldName(member.name); context.memberRecordFields = { @@ -1057,7 +1057,7 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { } }; } - + private addUnnamedSimpleMember(memberName: string, member: any, context: VisitorContext): void { // Check if typeName is not one of the BasicTypes types const BasicTypes = ["int", "string", "float", "boolean", "decimal", "readonly"]; @@ -1075,18 +1075,18 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { }; } } - + private handleArrayWithCompositeType(field: FormField, context: VisitorContext): void { let memberTypeNames: string[] = []; - + for (const member of field.memberType.members) { const result = this.visitMember(member, context); memberTypeNames.push(result.typeName); } - + context.isArray = true; let resolvedTypeName: string = ""; - + if (field.memberType.typeName === "intersection") { resolvedTypeName = `${memberTypeNames.join("&")}`; } else { @@ -1094,20 +1094,20 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { } const fieldName = getBalRecFieldName(field.name); - context.recordFields[fieldName] = Object.keys(context.memberRecordFields).length > 0 - ? context.memberRecordFields - : { type: `(${resolvedTypeName})[]`, comment: "" }; - + context.recordFields[fieldName] = Object.keys(context.memberRecordFields).length > 0 + ? context.memberRecordFields + : { type: `(${resolvedTypeName})[]`, comment: "" }; + this.buildArrayFieldMetadata(field, resolvedTypeName, context); } - + private handleArrayWithRecordType(field: FormField, context: VisitorContext): void { const temporaryRecord = navigateTypeInfo(field.memberType.fields, false); const fieldName = getBalRecFieldName(field.name); context.recordFields[fieldName] = (temporaryRecord as RecordDefinitonObject).recordFields; context.isArray = true; context.isRecord = true; - + context.fieldMetadata = { optional: field.optional, typeName: "record[]", @@ -1115,20 +1115,20 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { typeInstance: fieldName, fields: (temporaryRecord as RecordDefinitonObject).recordFieldsMetadata }; - + this.applyNullabilityToFieldMetadata(context); context.recordFieldsMetadata[field.name] = context.fieldMetadata; } - + private handleSimpleArray(field: FormField, context: VisitorContext): void { let typeName: string; - + if (field.memberType.hasOwnProperty("typeInfo")) { typeName = "record[]"; } else { typeName = `${field.memberType.typeName}[]`; } - + if (field.memberType.members && field.memberType.members.length === 0) { context.memberRecordFields = {}; context.memberFieldsMetadata = {}; @@ -1144,10 +1144,10 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { }; } } - + private processUnionMembers(members: any[], context: VisitorContext): void { this.determineIfUnion(members, context); - + if (members.length > 2) { // If at least one member has fields, remove that field for (let i = members.length - 1; i >= 0; i--) { @@ -1166,7 +1166,7 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { } } } - + private determineIfUnion(members: any[], context: VisitorContext): void { if (members.length > 2) { context.isUnion = members.some((member) => member.typeName === "()"); @@ -1176,7 +1176,7 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { context.isUnion = false; } } - + private getResolvedTypeName(typeName: string, memberTypeNames: string[]): string { if (typeName === "intersection") { return `${memberTypeNames.join("&")}`; @@ -1184,7 +1184,7 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { return `${memberTypeNames.join("|")}`; } } - + private buildFieldMetadata(field: FormField, resolvedTypeName: string, context: VisitorContext): void { context.fieldMetadata = { optional: field.optional, @@ -1196,10 +1196,10 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { typeInstance: field.name, ...(Object.keys(context.memberFieldsMetadata).length > 0 && { members: context.memberFieldsMetadata }) }; - + this.applyNullabilityToFieldMetadata(context); } - + private buildArrayFieldMetadata(field: FormField, resolvedTypeName: string, context: VisitorContext): void { context.fieldMetadata = { optional: field.optional, @@ -1208,12 +1208,12 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { typeInstance: field.name, ...(Object.keys(context.memberFieldsMetadata).length > 0 && { members: context.memberFieldsMetadata }) }; - + this.applyNullabilityToFieldMetadata(context); const fieldName = getBalRecFieldName(field.name); context.recordFieldsMetadata[fieldName] = context.fieldMetadata; } - + private applyNullabilityToFieldMetadata(context: VisitorContext): void { // Apply nullableArray property if (context.isArray) { @@ -1223,7 +1223,7 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { context.fieldMetadata.nullableArray = context.isNullable; } } - + // Apply nullable property if (context.isArray) { context.fieldMetadata.nullable = context.isArrayNullable; @@ -1233,15 +1233,15 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { context.fieldMetadata.nullable = context.isNullable; } } - + private setFieldAndMetadata(field: FormField, resolvedTypeName: string, context: VisitorContext): void { const fieldName = getBalRecFieldName(field.name); - context.recordFields[fieldName] = Object.keys(context.memberRecordFields).length > 0 - ? context.memberRecordFields - : { type: resolvedTypeName, comment: "" }; + context.recordFields[fieldName] = Object.keys(context.memberRecordFields).length > 0 + ? context.memberRecordFields + : { type: resolvedTypeName, comment: "" }; context.recordFieldsMetadata[fieldName] = context.fieldMetadata; } - + private resetContext(context: VisitorContext): void { context.memberRecordFields = {}; context.memberFieldsMetadata = {}; @@ -1276,16 +1276,16 @@ function navigateTypeInfo( isSimple: false, isUnion: false }; - + const visitor = new TypeInfoVisitorImpl(); for (const field of typeInfos) { visitor.visitField(field, context); } - - return { - "recordFields": context.recordFields, - "recordFieldsMetadata": context.recordFieldsMetadata + + return { + "recordFields": context.recordFields, + "recordFieldsMetadata": context.recordFieldsMetadata }; } @@ -1300,11 +1300,15 @@ export async function getDatamapperCode(parameterDefinitions: ErrorCode | Parame console.error(error); return NOT_LOGGED_IN; }); - let response: DatamapperResponse = await sendDatamapperRequest(parameterDefinitions, accessToken); + const tokenOrError: string | ErrorCode = + typeof accessToken === 'object' && 'token' in accessToken + ? accessToken.token + : accessToken; + let response: DatamapperResponse = await sendDatamapperRequest(parameterDefinitions, tokenOrError); let intermediateMapping = response.mappings; - let finalCode = await generateBallerinaCode(intermediateMapping, parameterDefinitions, "", nestedKeyArray); - return finalCode; + let finalCode = await generateBallerinaCode(intermediateMapping, parameterDefinitions, "", nestedKeyArray); + return finalCode; } catch (error) { console.error(error); return TIMEOUT; @@ -1312,7 +1316,7 @@ export async function getDatamapperCode(parameterDefinitions: ErrorCode | Parame } export async function constructRecord(codeObject: object): Promise<{ recordString: string; isCheckError: boolean; }> { - let recordString: string = ""; + let recordString: string = ""; let isCheckError: boolean = false; let objectKeys = Object.keys(codeObject); for (let index = 0; index < objectKeys.length; index++) { @@ -1320,7 +1324,7 @@ export async function constructRecord(codeObject: object): Promise<{ recordStrin let mapping = codeObject[key]; if (typeof mapping === "string") { if (mapping.includes("check ")) { - isCheckError = true; + isCheckError = true; } if (recordString !== "") { recordString += ",\n"; @@ -1329,7 +1333,7 @@ export async function constructRecord(codeObject: object): Promise<{ recordStrin } else { let subRecordResult = await constructRecord(mapping); if (subRecordResult.isCheckError) { - isCheckError = true; + isCheckError = true; } if (recordString !== "") { recordString += ",\n"; @@ -1354,7 +1358,7 @@ export function notifyNoGeneratedMappings() { } async function sendDatamapperRequest(parameterDefinitions: ParameterMetadata | ErrorCode, accessToken: string | ErrorCode): Promise { - const response : DatamapperResponse= await generateAutoMappings(parameterDefinitions as Payload); + const response: DatamapperResponse = await generateAutoMappings(parameterDefinitions as Payload); return response; } @@ -1365,7 +1369,7 @@ export async function searchDocumentation(message: string): Promise { let responseContent: string; if (referenceSources.length > 0) { responseContent = `${finalResponse} \nreference sources: \n${referenceSources.join(' \n')}`; - }else{ + } else { responseContent = finalResponse; } @@ -1376,12 +1380,12 @@ export async function filterDocumentation(resp: Response): Promise { let responseContent: string; if (resp.status == 200 || resp.status == 201) { const data = (await resp.json()) as any; - console.log("data",data.response); + console.log("data", data.response); const finalResponse = await (data.response.content).replace(/[\s\S]*?<\/thinking>/g, ''); const referenceSources = data.response.references; if (referenceSources.length > 0) { responseContent = `${finalResponse} \nreference sources: \n${referenceSources.join(' \n')}`; - }else{ + } else { responseContent = finalResponse; } @@ -1390,7 +1394,7 @@ export async function filterDocumentation(resp: Response): Promise { throw new Error(AIChatError.UNKNOWN_CONNECTION_ERROR); } -async function filterMappingResponse(resp: Response): Promise { +async function filterMappingResponse(resp: Response): Promise { if (resp.status == 200 || resp.status == 201) { const data = (await resp.json()) as any; return data.file_content; @@ -1404,7 +1408,7 @@ async function filterMappingResponse(resp: Response): Promise return PARSING_ERROR; } if (resp.status == 429) { return TOO_MANY_REQUESTS; - } + } if (resp.status == 500) { return SERVER_ERROR; } else { @@ -1534,7 +1538,7 @@ async function accessMetadata( if (!["enum", "enum|()"].includes(inputMetadataType)) { isUsingDefault = false; } - + if (arrayRecords.includes(metadataTypeName) || arrayEnumUnion.includes(inputMetadataType)) { if (isInputRecordNullableArray) { isUsingArray = true; @@ -1563,23 +1567,23 @@ async function accessMetadata( if (isInputRecordNullable && isInputRecordOptional) { newPath[index - 1] = `${paths[index - 1]}?`; } - // Handle enum, union, and intersection types + // Handle enum, union, and intersection types } else if (unionEnumIntersectionTypes.includes(inputMetadataType)) { if (isInputRecordNullable && isInputRecordOptional) { newPath[index - 1] = `${paths[index - 1]}?`; - } + } if (inputMetadataType.includes("[]") && operation === "LENGTH") { let lastInputObject = await resolveMetadata(parameterDefinitions, paths, paths[paths.length - 1], "inputMetadata"); let inputDataType = lastInputObject["type"].replace(/\|\(\)$/, ""); defaultValue = await getDefaultValue(inputDataType); newPath[paths.length - 1] = `${paths[paths.length - 1]}?:${defaultValue}`; - } else if (!isOutputNullable && !isOutputOptional) { + } else if (!isOutputNullable && !isOutputOptional) { if (unionEnumIntersectionTypes.includes(inputObject["type"]) && inputObject["members"]) { - if (!isInputRecordNullableArray || isOutputRecordNullable){ + if (!isInputRecordNullableArray || isOutputRecordNullable) { let typeName = inputMetadataType.includes("[]") ? inputMetadataType.replace(/\|\(\)$/, "") : (inputObject as any).members[Object.keys((inputObject as any).members)[0]].typeName; - + let defaultValue = await getDefaultValue(typeName); newPath[paths.length - 1] = `${paths[paths.length - 1]}?:${defaultValue !== "void" ? defaultValue : JSON.stringify(typeName)}`; } @@ -1590,10 +1594,10 @@ async function accessMetadata( } else { if (isUsingDefault && unionEnumIntersectionTypes.includes(inputObject["type"]) && inputObject["members"]) { if (!isOutputNullable && !isOutputOptional) { - let typeName = inputMetadataType.includes("[]") - ? inputMetadataType.replace("|()", "") + let typeName = inputMetadataType.includes("[]") + ? inputMetadataType.replace("|()", "") : (inputObject as any).members[Object.keys((inputObject as any).members)[0]].typeName; - + let defaultValue = await getDefaultValue(typeName); newPath[paths.length - 1] = `${paths[paths.length - 1]}?:${defaultValue !== "void" ? defaultValue : JSON.stringify(typeName)}`; } @@ -1605,11 +1609,11 @@ async function accessMetadata( } if (!primitiveTypes.includes(baseType)) { if (baseType.includes("[]")) { - if (!isInputNullableArray || isOutputRecordNullable){ + if (!isInputNullableArray || isOutputRecordNullable) { defaultValue = `[]`; } } else { - let cleanedBaseType = baseType.replace(/[\[\]()]*/g, ""); + let cleanedBaseType = baseType.replace(/[\[\]()]*/g, ""); if (cleanedBaseType.includes("|")) { modifiedBaseType = cleanedBaseType.split("|")[0].trim(); } else { @@ -1619,7 +1623,7 @@ async function accessMetadata( } } else { defaultValue = await getDefaultValue(baseType); - } + } if (isUsingArray) { newPath[index] = `${pathIndex}?:${defaultValue}`; @@ -1627,7 +1631,7 @@ async function accessMetadata( if (isUsingDefault && !isOutputNullable && !isOutputOptional) { newPath[index] = `${pathIndex}?:${defaultValue}`; - } else if ((isInputNullable || isInputOptional)) { + } else if ((isInputNullable || isInputOptional)) { if (!isOutputNullable && !isOutputOptional) { if (!isInputNullableArray && isOutputRecordNullable) { newPath[index] = `${pathIndex}?:${defaultValue}`; @@ -1695,11 +1699,11 @@ async function getNestedType(paths: string[], metadata: object): Promise return currentMetadata; } -async function resolveMetadata(parameterDefinitions: ParameterMetadata | ErrorCode, nestedKeyArray: string[], key: string, metadataKey: "inputMetadata" | "outputMetadata"): Promise { +async function resolveMetadata(parameterDefinitions: ParameterMetadata | ErrorCode, nestedKeyArray: string[], key: string, metadataKey: "inputMetadata" | "outputMetadata"): Promise { let metadata = parameterDefinitions[metadataKey]; for (let nk of nestedKeyArray) { if (metadata[nk] && (metadata[nk]["fields"] || metadata[nk]["members"])) { - if (nk === key){ + if (nk === key) { return metadata[nk]; } metadata = metadata[nk]["fields"] || metadata[nk]["members"]; @@ -1734,7 +1738,7 @@ async function handleRecordArrays(key: string, nestedKey: string, responseRecord outputMetadataType = modifiedOutput["type"]; let isDeeplyNested = (arrayRecords.includes(outputMetadataTypeName) || arrayEnumUnion.includes(outputMetadataType)); - let { itemKey: currentItemKey, combinedKey: currentCombinedKey, inputArrayNullable:currentArrayNullable } = await extractKeys(responseRecord[subObjectKey], parameterDefinitions, arrayRecords, arrayEnumUnion); + let { itemKey: currentItemKey, combinedKey: currentCombinedKey, inputArrayNullable: currentArrayNullable } = await extractKeys(responseRecord[subObjectKey], parameterDefinitions, arrayRecords, arrayEnumUnion); if (currentItemKey.includes('?')) { currentItemKey = currentItemKey.replace('?', ''); } @@ -1742,14 +1746,14 @@ async function handleRecordArrays(key: string, nestedKey: string, responseRecord if (isDeeplyNested) { const subArrayRecord = responseRecord[subObjectKey]; const isCombinedKeyModified = currentCombinedKey.endsWith('?'); - const replacementKey = currentArrayNullable || isCombinedKeyModified - ? `${currentItemKey}Item?.` + const replacementKey = currentArrayNullable || isCombinedKeyModified + ? `${currentItemKey}Item?.` : `${currentItemKey}Item.`; - + const regex = new RegExp( currentCombinedKey.replace(/\?/g, '\\?').replace(/\./g, '\\.') + '\\.', 'g' ); - + formattedRecordsArray.push( `${subObjectKey}: ${subArrayRecord.replace(regex, replacementKey)}` ); @@ -1792,10 +1796,10 @@ async function filterResponse(resp: Response): Promise { const data = (await resp.json()) as any; console.log(data); return PARSING_ERROR; - } + } if (resp.status == 429) { return TOO_MANY_REQUESTS; - } + } if (resp.status == 500) { return SERVER_ERROR; } else { @@ -1862,13 +1866,13 @@ async function extractKeys( } async function processParentKey( - innerKey: string, - parameterDefinitions: ParameterMetadata | ErrorCode, + innerKey: string, + parameterDefinitions: ParameterMetadata | ErrorCode, arrayRecords: string[], arrayEnumUnion: string[] -): Promise<{ - itemKey: string; - combinedKey: string; +): Promise<{ + itemKey: string; + combinedKey: string; inputArrayNullable: boolean; }> { let inputMetadataType: string = ""; @@ -1988,7 +1992,7 @@ async function processCombinedKey( if (nextOptional) { isinputArrayOptional = true; } } else { if (arrayRecords.includes(nextMetadataTypeName) || arrayEnumUnion.includes(nextMetadataType)) { - if (nextNullableArray && (nextIndex === (index - 1))) {isinputNullableArray = true;} + if (nextNullableArray && (nextIndex === (index - 1))) { isinputNullableArray = true; } } return { isinputRecordArrayNullable, isinputRecordArrayOptional, isinputArrayNullable, isinputArrayOptional, isinputNullableArray }; } @@ -1998,11 +2002,13 @@ async function processCombinedKey( } export async function requirementsSpecification(filepath: string): Promise { - if (!filepath) { - throw new Error("File is undefined"); + if (!filepath) { + throw new Error("File is undefined"); } - const fileData = await attatchmentToFileData({name: path.basename(filepath), - content: getBase64FromFile(filepath), status: AttachmentStatus.UnknownError}); + const fileData = await attatchmentToFileData({ + name: path.basename(filepath), + content: getBase64FromFile(filepath), status: AttachmentStatus.UnknownError + }); const params: DataMapperRequest = { file: fileData, processType: "requirements", diff --git a/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts b/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts index 0623e186f3b..06d32e5f2fa 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts @@ -21,11 +21,10 @@ import { extension } from "../../BalExtensionContext"; import { AUTH_CLIENT_ID, AUTH_ORG } from '../../features/ai/utils'; import axios from 'axios'; import { jwtDecode, JwtPayload } from 'jwt-decode'; -// import { StateMachineAI } from '../../../src/views/ai-panel/aiMachine'; +import { AuthCredentials, LoginMethod } from '@wso2/ballerina-core'; -export const ACCESS_TOKEN_SECRET_KEY = 'BallerinaAIUser'; -export const REFRESH_TOKEN_SECRET_KEY = 'BallerinaAIRefreshToken'; export const REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE = "Refresh token is not available."; +export const AUTH_CREDENTIALS_SECRET_KEY = 'BallerinaAuthCredentials'; //TODO: What if user doesnt have github copilot. //TODO: Where does auth git get triggered @@ -118,40 +117,79 @@ async function copilotTokenExists() { return copilotToken !== undefined && copilotToken !== ''; } +// ================================== +// Structured Auth Credentials Utils +// ================================== +export const storeAuthCredentials = async (credentials: AuthCredentials): Promise => { + const credentialsJson = JSON.stringify(credentials); + await extension.context.secrets.store(AUTH_CREDENTIALS_SECRET_KEY, credentialsJson); +}; + +export const getAuthCredentials = async (): Promise => { + const credentialsJson = await extension.context.secrets.get(AUTH_CREDENTIALS_SECRET_KEY); + if (!credentialsJson) { + return undefined; + } + + try { + return JSON.parse(credentialsJson) as AuthCredentials; + } catch (error) { + console.error('Error parsing auth credentials:', error); + return undefined; + } +}; + +export const clearAuthCredentials = async (): Promise => { + await extension.context.secrets.delete(AUTH_CREDENTIALS_SECRET_KEY); +}; + // ================================== // BI Copilot Auth Utils // ================================== -export const getAccessToken = async (): Promise => { +export const getAccessToken = async (): Promise<{ token: string, loginMethod: LoginMethod } | undefined> => { return new Promise(async (resolve, reject) => { try { - const token = await extension.context.secrets.get(ACCESS_TOKEN_SECRET_KEY); - if (!token) { - resolve(undefined); - return; - } - - let finalToken = token; + const credentials = await getAuthCredentials(); + + if (credentials) { + switch (credentials.loginMethod) { + case LoginMethod.BI_INTEL: + try { + const { accessToken } = credentials.secrets; + let finalToken = accessToken; + + // Decode token and check expiration + const decoded = jwtDecode(accessToken); + const now = Math.floor(Date.now() / 1000); + if (decoded.exp && decoded.exp < now) { + finalToken = await getRefreshedAccessToken(); + } + resolve({ token: finalToken, loginMethod: LoginMethod.BI_INTEL }); + return; + } catch (err) { + if (axios.isAxiosError(err)) { + const status = err.response?.status; + if (status === 400) { + reject(new Error("TOKEN_EXPIRED")); + return; + } + } + reject(err); + return; + } + + case LoginMethod.ANTHROPIC_KEY: + resolve({ token: credentials.secrets.apiKey, loginMethod: LoginMethod.ANTHROPIC_KEY }); + return; - // Decode token and check expiration - try { - const decoded = jwtDecode(token); - const now = Math.floor(Date.now() / 1000); - if (decoded.exp && decoded.exp < now) { - finalToken = await getRefreshedAccessToken(); - } - } catch (err) { - if (axios.isAxiosError(err)) { - const status = err.response?.status; - if (status === 400) { - reject(new Error("TOKEN_EXPIRED")); + default: + const { loginMethod }: AuthCredentials = credentials; + reject(new Error(`Unsupported login method: ${loginMethod}`)); return; - } + } - reject(err); - return; } - - resolve(finalToken); + resolve(undefined); } catch (error: any) { reject(error); } @@ -166,7 +204,12 @@ export const getRefreshedAccessToken = async (): Promise => { }; try { - const refreshToken = await extension.context.secrets.get(REFRESH_TOKEN_SECRET_KEY); + const credentials = await getAuthCredentials(); + if (!credentials || credentials.loginMethod !== LoginMethod.BI_INTEL) { + throw new Error('Token refresh is only supported for BI Intel authentication'); + } + + const { refreshToken } = credentials.secrets; if (!refreshToken) { reject(new Error(REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE)); return; @@ -184,8 +227,15 @@ export const getRefreshedAccessToken = async (): Promise => { const newAccessToken = response.data.access_token; const newRefreshToken = response.data.refresh_token; - await extension.context.secrets.store(ACCESS_TOKEN_SECRET_KEY, newAccessToken); - await extension.context.secrets.store(REFRESH_TOKEN_SECRET_KEY, newRefreshToken); + // Update stored credentials + const updatedCredentials: AuthCredentials = { + ...credentials, + secrets: { + accessToken: newAccessToken, + refreshToken: newRefreshToken + } + }; + await storeAuthCredentials(updatedCredentials); resolve(newAccessToken); } catch (error: any) { 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 21d1d989afd..fb185e9b5a8 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/aiMachine.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/aiMachine.ts @@ -18,12 +18,11 @@ /* eslint-disable @typescript-eslint/naming-convention */ import { createMachine, assign, interpret } from 'xstate'; -import * as vscode from 'vscode'; -import { AIMachineStateValue, AIPanelPrompt, AIMachineEventValue, AIMachineEventType, AIMachineContext, AIUserToken } from '@wso2/ballerina-core'; +import { AIMachineStateValue, AIPanelPrompt, AIMachineEventType, AIMachineContext, AIUserToken, AIMachineSendableEvent, LoginMethod } from '@wso2/ballerina-core'; import { AiPanelWebview } from './webview'; -import { getAuthUrl, getLogoutUrl } from './auth'; import { extension } from '../../BalExtensionContext'; -import { ACCESS_TOKEN_SECRET_KEY, getAccessToken, REFRESH_TOKEN_SECRET_KEY } from '../../utils/ai/auth'; +import { getAccessToken } from '../../utils/ai/auth'; +import { checkToken, initiateInbuiltAuth, logout, validateApiKey } from './utils'; export const USER_CHECK_BACKEND_URL = '/user/usage'; @@ -43,17 +42,23 @@ export const closeAIWebview = () => { } }; -const aiMachine = createMachine({ +const aiMachine = createMachine({ id: 'ballerina-ai', initial: 'Initialize', predictableActionArguments: true, context: { + loginMethod: undefined, userToken: undefined, errorMessage: undefined, }, on: { DISPOSE: { target: 'Initialize', + actions: assign({ + loginMethod: (_ctx) => undefined, + userToken: (_ctx) => undefined, + errorMessage: (_ctx) => undefined, + }) } }, states: { @@ -66,11 +71,18 @@ const aiMachine = createMachine({ cond: (_ctx, event) => !!event.data, target: 'Authenticated', actions: assign({ - userToken: (_ctx, event) => event.data as AIUserToken, + loginMethod: (_ctx, event) => event.data.loginMethod, + userToken: (_ctx, event) => ({ token: event.data.token }), + errorMessage: (_ctx) => undefined, }) }, { target: 'Unauthenticated', + actions: assign({ + loginMethod: (_ctx) => undefined, + userToken: (_ctx) => undefined, + errorMessage: (_ctx) => undefined, + }) } ], onError: [ @@ -78,12 +90,19 @@ const aiMachine = createMachine({ cond: (_ctx, event) => event.data?.message === 'TOKEN_EXPIRED', target: 'Unauthenticated', actions: [ - 'silentLogout' + 'silentLogout', + assign({ + loginMethod: (_ctx) => undefined, + userToken: (_ctx) => undefined, + errorMessage: (_ctx) => undefined, + }) ] }, { target: 'Disabled', actions: assign({ + loginMethod: (_ctx) => undefined, + userToken: (_ctx) => undefined, errorMessage: (_ctx, event) => event.data?.message || 'Unknown error' }) } @@ -92,33 +111,130 @@ const aiMachine = createMachine({ }, Unauthenticated: { on: { - LOGIN: 'Authenticating' + [AIMachineEventType.LOGIN]: { + target: 'Authenticating', + actions: assign({ + loginMethod: (_ctx) => LoginMethod.BI_INTEL + }) + }, + [AIMachineEventType.AUTH_WITH_API_KEY]: { + target: 'Authenticating', + actions: assign({ + loginMethod: (_ctx) => LoginMethod.ANTHROPIC_KEY + }) + } } }, Authenticating: { - invoke: { - id: 'openLogin', - src: 'openLogin', - onError: { - target: 'Unauthenticated' - } - }, - on: { - [AIMachineEventType.LOGIN_SUCCESS]: { - target: 'Authenticated', + initial: 'determineFlow', + states: { + determineFlow: { + always: [ + { + cond: (context) => context.loginMethod === LoginMethod.BI_INTEL, + target: 'ssoFlow' + }, + { + cond: (context) => context.loginMethod === LoginMethod.ANTHROPIC_KEY, + target: 'apiKeyFlow' + }, + { + target: 'ssoFlow' // default + } + ] }, - [AIMachineEventType.CANCEL_LOGIN]: { - target: 'Unauthenticated' + ssoFlow: { + invoke: { + id: 'openLogin', + src: 'openLogin', + onError: { + target: '#ballerina-ai.Unauthenticated', + actions: assign({ + loginMethod: (_ctx) => undefined, + errorMessage: (_ctx, event) => event.data?.message || 'SSO authentication failed' + }) + } + }, + on: { + [AIMachineEventType.COMPLETE_AUTH]: { + target: '#ballerina-ai.Authenticated', + actions: assign({ + errorMessage: (_ctx) => undefined, + }) + }, + [AIMachineEventType.CANCEL_LOGIN]: { + target: '#ballerina-ai.Unauthenticated', + actions: assign({ + loginMethod: (_ctx) => undefined, + errorMessage: (_ctx) => undefined, + }) + } + } + }, + apiKeyFlow: { + on: { + [AIMachineEventType.SUBMIT_API_KEY]: { + target: 'validatingApiKey', + actions: assign({ + errorMessage: (_ctx) => undefined + }) + }, + [AIMachineEventType.CANCEL_LOGIN]: { + target: '#ballerina-ai.Unauthenticated', + actions: assign({ + loginMethod: (_ctx) => undefined, + errorMessage: (_ctx) => undefined, + }) + } + } + }, + validatingApiKey: { + invoke: { + id: 'validateApiKey', + src: 'validateApiKey', + onDone: { + target: '#ballerina-ai.Authenticated', + actions: assign({ + errorMessage: (_ctx) => undefined, + }) + }, + onError: { + target: 'apiKeyFlow', + actions: assign({ + errorMessage: (_ctx, event) => event.data?.message || 'API key validation failed' + }) + } + } } } }, Authenticated: { + invoke: { + id: 'getTokenAfterAuth', + src: 'getTokenAfterAuth', + onDone: { + actions: assign({ + userToken: (_ctx, event) => ({ token: event.data.token }), + loginMethod: (_ctx, event) => event.data.loginMethod, + errorMessage: (_ctx) => undefined, + }) + }, + onError: { + target: 'Unauthenticated', + actions: assign({ + userToken: (_ctx) => undefined, + loginMethod: (_ctx) => undefined, + errorMessage: (_ctx, event) => event.data?.message || 'Failed to retrieve authentication credentials', + }) + } + }, on: { [AIMachineEventType.LOGOUT]: { target: 'Unauthenticated', actions: [ 'logout', assign({ + loginMethod: (_) => undefined, userToken: (_) => undefined, errorMessage: (_) => undefined, }) @@ -129,6 +245,7 @@ const aiMachine = createMachine({ actions: [ 'silentLogout', assign({ + loginMethod: (_) => undefined, userToken: (_) => undefined, errorMessage: (_) => undefined, }) @@ -139,62 +256,54 @@ const aiMachine = createMachine({ Disabled: { on: { RETRY: { - target: 'Initialize' + target: 'Initialize', + actions: assign({ + userToken: (_ctx) => undefined, + loginMethod: (_ctx) => undefined, + errorMessage: (_ctx) => undefined, + }) } } }, } }); -const checkToken = async (context, event): Promise => { - return new Promise(async (resolve, reject) => { - try { - const accessToken = await getAccessToken(); - if (!accessToken) { - resolve(undefined); - return; - } - resolve({ accessToken, usageTokens: undefined }); - } catch (error) { - reject(error); - } - }); -}; - -const logout = async (isUserLogout: boolean = true) => { - if (isUserLogout) { - const logoutURL = await getLogoutUrl(); - vscode.env.openExternal(vscode.Uri.parse(logoutURL)); - } - await extension.context.secrets.delete(ACCESS_TOKEN_SECRET_KEY); - await extension.context.secrets.delete(REFRESH_TOKEN_SECRET_KEY); -}; - -const openLogin = async (context, event) => { +const openLogin = async () => { return new Promise(async (resolve, reject) => { try { const status = await initiateInbuiltAuth(); if (!status) { aiStateService.send(AIMachineEventType.CANCEL_LOGIN); } + resolve(status); } catch (error) { reject(error); } }); }; -async function initiateInbuiltAuth() { - const callbackUri = await vscode.env.asExternalUri( - vscode.Uri.parse(`${vscode.env.uriScheme}://wso2.ballerina/signin`) - ); - const oauthURL = await getAuthUrl(callbackUri.toString()); - return vscode.env.openExternal(vscode.Uri.parse(oauthURL)); +const validateApiKeyService = async (_context: AIMachineContext, event: any) => { + const apiKey = event.payload?.apiKey; + if (!apiKey) { + throw new Error('API key is required'); + } + return await validateApiKey(apiKey, LoginMethod.ANTHROPIC_KEY); +}; + +const getTokenAfterAuth = async () => { + const result = await getAccessToken(); + if (!result) { + throw new Error('No authentication credentials found'); + } + return { token: result, loginMethod: LoginMethod.BI_INTEL }; } const aiStateService = interpret(aiMachine.withConfig({ services: { checkToken: checkToken, openLogin: openLogin, + validateApiKey: validateApiKeyService, + getTokenAfterAuth: getTokenAfterAuth, }, actions: { logout: () => { @@ -206,10 +315,24 @@ const aiStateService = interpret(aiMachine.withConfig({ } })); +const isExtendedEvent = ( + arg: K | AIMachineSendableEvent +): arg is Extract => { + return typeof arg !== "string"; +}; + export const AIStateMachine = { initialize: () => aiStateService.start(), service: () => { return aiStateService; }, context: () => { return aiStateService.getSnapshot().context; }, state: () => { return aiStateService.getSnapshot().value as AIMachineStateValue; }, - sendEvent: (eventType: AIMachineEventType) => { aiStateService.send({ type: eventType }); } + sendEvent: ( + event: K | Extract + ) => { + if (isExtendedEvent(event)) { + aiStateService.send(event as AIMachineSendableEvent); + } else { + aiStateService.send({ type: event } as AIMachineSendableEvent); + } + } }; diff --git a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/auth.ts b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/auth.ts index d49b28d93dc..f1be64ab87d 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/auth.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/auth.ts @@ -17,10 +17,10 @@ */ import axios from 'axios'; -import { extension } from '../../BalExtensionContext'; import { AUTH_CLIENT_ID, AUTH_ORG, AUTH_REDIRECT_URL } from '../../features/ai/utils'; import { AIStateMachine } from './aiMachine'; -import { AIMachineEventType } from '@wso2/ballerina-core'; +import { AIMachineEventType, AuthCredentials, LoginMethod } from '@wso2/ballerina-core'; +import { storeAuthCredentials } from '../../utils/ai/auth'; export interface AccessToken { accessToken: string; @@ -42,7 +42,7 @@ export async function getAuthUrl(callbackUri: string): Promise { return `https://api.asgardeo.io/t/${AUTH_ORG}/oauth2/authorize?response_type=code&redirect_uri=${AUTH_REDIRECT_URL}&client_id=${AUTH_CLIENT_ID}&scope=openid%20email&state=${state}`; } -export function getLogoutUrl() : string { +export function getLogoutUrl(): string { return `https://api.asgardeo.io/t/${AUTH_ORG}/oidc/logout`; } @@ -67,24 +67,27 @@ export async function exchangeAuthCodeNew(authCode: string): Promise => { + return new Promise(async (resolve, reject) => { + try { + // Clean up any legacy tokens on initialization + await cleanupLegacyTokens(); + + const result = await getAccessToken(); + if (!result) { + resolve(undefined); + return; + } + resolve({ token: result.token, loginMethod: result.loginMethod }); + } catch (error) { + reject(error); + } + }); +}; + +const cleanupLegacyTokens = async (): Promise => { + try { + const legacyToken = await extension.context.secrets.get(LEGACY_ACCESS_TOKEN_SECRET_KEY); + const legacyRefreshToken = await extension.context.secrets.get(LEGACY_REFRESH_TOKEN_SECRET_KEY); + + if (legacyToken || legacyRefreshToken) { + await extension.context.secrets.delete(LEGACY_ACCESS_TOKEN_SECRET_KEY); + await extension.context.secrets.delete(LEGACY_REFRESH_TOKEN_SECRET_KEY); + } + } catch (error) { + console.error('Error cleaning up legacy tokens:', error); + } +}; + +export const logout = async (isUserLogout: boolean = true) => { + // For user-initiated logout, check if we need to redirect to SSO logout + if (isUserLogout) { + const result = await getAccessToken(); + if (result && result.loginMethod === LoginMethod.BI_INTEL) { + const logoutURL = getLogoutUrl(); + vscode.env.openExternal(vscode.Uri.parse(logoutURL)); + } + } + + // Always clear stored credentials + await clearAuthCredentials(); +}; + +export async function initiateInbuiltAuth() { + const callbackUri = await vscode.env.asExternalUri( + vscode.Uri.parse(`${vscode.env.uriScheme}://wso2.ballerina/signin`) + ); + const oauthURL = await getAuthUrl(callbackUri.toString()); + return vscode.env.openExternal(vscode.Uri.parse(oauthURL)); +} + +export const validateApiKey = async (apiKey: string, loginMethod: LoginMethod): Promise => { + if (loginMethod !== LoginMethod.ANTHROPIC_KEY) { + throw new Error('This login method is not supported. Please use SSO login instead.'); + } + + if (!apiKey || !apiKey.startsWith('sk-') || apiKey.length < 20) { + throw new Error('Please enter a valid Anthropic API key.'); + } + + try { + const directAnthropic = createAnthropic({ + apiKey: apiKey, + baseURL: 'https://api.anthropic.com/v1' + }); + + await generateText({ + model: directAnthropic('claude-3-haiku-20240307'), + maxTokens: 1, + messages: [{ role: 'user', content: 'Hi' }] + }); + + // Store credentials + const credentials: AuthCredentials = { + loginMethod: LoginMethod.ANTHROPIC_KEY, + secrets: { + apiKey: apiKey + } + }; + await storeAuthCredentials(credentials); + + return { token: apiKey }; + + } catch (error) { + console.error('API key validation failed:', error); + if (error instanceof Error) { + if (error.message.includes('401') || error.message.includes('authentication')) { + throw new Error('Invalid API key. Please check your key and try again.'); + } else if (error.message.includes('403')) { + throw new Error('Your API key does not have access to Claude. Please check your Anthropic account.'); + } else if (error.message.includes('rate_limit')) { + throw new Error('Too many requests. Please wait a moment and try again.'); + } + throw new Error('Connection failed. Please check your internet connection and ensure your API key is valid.'); + } + throw new Error('Validation failed. Please try again.'); + } +}; diff --git a/workspaces/ballerina/ballerina-rpc-client/src/BallerinaRpcClient.ts b/workspaces/ballerina/ballerina-rpc-client/src/BallerinaRpcClient.ts index 6719b9c9839..96ac9561a9a 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/BallerinaRpcClient.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/BallerinaRpcClient.ts @@ -48,7 +48,8 @@ import { ColorThemeKind, currentThemeChanged, ChatNotify, - onChatNotify + onChatNotify, + AIMachineSendableEvent } from "@wso2/ballerina-core"; import { LangClientRpcClient } from "./rpc-clients/lang-client/rpc-client"; import { LibraryBrowserRpcClient } from "./rpc-clients/library-browser/rpc-client"; @@ -182,7 +183,7 @@ export class BallerinaRpcClient { this.messenger.onNotification(aiStateChanged, callback); } - sendAIStateEvent(event: AIMachineEventType) { + sendAIStateEvent(event: AIMachineEventType | AIMachineSendableEvent) { this.messenger.sendRequest(sendAIStateEvent, HOST_EXTENSION, event); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/AIPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/AIPanel.tsx index 699369b2cc4..5bf1f5a2383 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/AIPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/AIPanel.tsx @@ -16,16 +16,16 @@ * under the License. */ -import React, { useEffect, useState } from 'react'; -import { AIMachineStateValue } from '@wso2/ballerina-core'; -import { useRpcContext } from '@wso2/ballerina-rpc-client'; -import { VSCodeProgressRing } from '@vscode/webview-ui-toolkit/react'; -import styled from '@emotion/styled'; -import AIChat from './components/AIChat'; -import { DisabledWindow } from './DisabledSection'; -import LoginPanel from './LoginPanel'; -import { LoadingRing } from '../../components/Loader'; -import WaitingForLogin from './WaitingForLoginSection'; +import React, { useEffect, useState } from "react"; +import { AIMachineStateValue } from "@wso2/ballerina-core"; +import { useRpcContext } from "@wso2/ballerina-rpc-client"; +import { VSCodeProgressRing } from "@vscode/webview-ui-toolkit/react"; +import styled from "@emotion/styled"; +import AIChat from "./components/AIChat"; +import { DisabledWindow } from "./DisabledSection"; +import LoginPanel from "./LoginPanel"; +import { LoadingRing } from "../../components/Loader"; +import WaitingForLogin from "./WaitingForLoginSection"; const LoaderWrapper = styled.div` display: flex; @@ -50,43 +50,68 @@ const AIPanel = (props: { state: AIMachineStateValue }) => { fetchContext(); }, [props.state]); + const renderUnknownState = (state: any) => { + console.warn("Unknown AI Machine State:", state); + return

Unknown state: {JSON.stringify(state)}

; + }; + const fetchContext = () => { - rpcClient.getAiPanelRpcClient().getAIMachineSnapshot().then((snapshot) => { - switch (snapshot.state) { - case "Initialize": - setViewComponent(); - break; - case "Unauthenticated": - setViewComponent(); - break; - case "Authenticating": - setViewComponent(); - break; - case "Authenticated": - setViewComponent(); - break; - case "Disabled": - setViewComponent(); - break; - default: - setViewComponent(

{snapshot.state}

); - } - }); - } + rpcClient + .getAiPanelRpcClient() + .getAIMachineSnapshot() + .then((snapshot) => { + console.log("AI Machine Snapshot:", snapshot); + let component: React.ReactNode; + + if (typeof snapshot.state === "string") { + // Handle primary states + const primaryStateComponents = { + Initialize: , + Unauthenticated: , + Authenticated: , + Disabled: , + }; + component = primaryStateComponents[snapshot.state] || renderUnknownState(snapshot.state); + } else if (typeof snapshot.state === "object" && snapshot.state.Authenticating) { + // Handle hierarchical Authenticating substates + const subState = snapshot.state.Authenticating; + + if (subState === "determineFlow") { + component = ; + } else if (["ssoFlow", "apiKeyFlow", "validatingApiKey"].includes(subState)) { + component = ( + + ); + } else { + component = renderUnknownState(snapshot.state); + } + } else { + component = renderUnknownState(snapshot.state); + } + + setViewComponent(component); + }); + }; return ( -
+
{!viewComponent ? ( - ) :
- {viewComponent} -
} + ) : ( +
{viewComponent}
+ )}
); }; -export default AIPanel; +export default AIPanel; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/LoginPanel/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/LoginPanel/index.tsx index ff9170a53a6..93c958d653e 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/LoginPanel/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/LoginPanel/index.tsx @@ -75,6 +75,35 @@ const PostLoginSection = styled.div` display: flex; flex-direction: column; gap: 8px; + margin-bottom: 16px; +`; + +const Divider = styled.div` + display: flex; + align-items: center; + color: var(--vscode-widget-border); + font-size: 12px; + width: 100%; + &::before, + &::after { + content: ""; + flex: 1; + border-bottom: 1px solid var(--vscode-widget-border); + margin: 0 8px; + } +`; + +const TextButton = styled.button` + background: none; + border: none; + color: var(--vscode-textLink-foreground); + font-size: 13px; + cursor: pointer; + padding: 0; + margin-top: -6px; + &:hover { + text-decoration: underline; + } `; const LegalNotice: React.FC = () => { @@ -106,6 +135,10 @@ const LoginPanel: React.FC = () => { rpcClient.sendAIStateEvent(AIMachineEventType.LOGIN); }; + const handleAnthropicKeyClick = () => { + rpcClient.sendAIStateEvent(AIMachineEventType.AUTH_WITH_API_KEY); + }; + return ( @@ -132,6 +165,8 @@ const LoginPanel: React.FC = () => { Login to BI Copilot + or + Enter your Anthropic API Key ); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/WaitingForLoginSection/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/WaitingForLoginSection/index.tsx index aae74f8704f..07b56294e50 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/WaitingForLoginSection/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/WaitingForLoginSection/index.tsx @@ -17,10 +17,13 @@ */ import styled from "@emotion/styled"; -import { AIMachineEventType } from '@wso2/ballerina-core'; -import { useRpcContext } from '@wso2/ballerina-rpc-client'; +import { AIMachineEventType, LoginMethod } from "@wso2/ballerina-core"; +import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { AlertBox } from "../AlertBox"; +import { useState } from "react"; +import { Codicon } from "@wso2/ui-toolkit"; +import { VSCodeButton, VSCodeTextField } from "@vscode/webview-ui-toolkit/react"; const Container = styled.div` display: flex; @@ -30,13 +33,236 @@ const Container = styled.div` gap: 8px; `; -const WaitingForLogin = () => { +// AlertBox-style container for consistency +const AlertContainer = styled.div<{ variant: "primary" | "secondary" }>` + border-left: 0.3rem solid + var( + ${(props: { variant: string }) => + props.variant === "secondary" ? "--vscode-editorWidget-border" : "--vscode-focusBorder"} + ); + background: var( + ${(props: { variant: string }) => + props.variant === "secondary" ? "transparent" : "--vscode-inputValidation-infoBackground"} + ); + display: flex; + flex-direction: column; + align-items: flex-start; + padding: 1rem; + gap: 12px; + margin-bottom: 15px; + width: -webkit-fill-available; +`; + +const Title = styled.div` + color: var(--vscode-foreground); + font-weight: 500; +`; + +const SubTitle = styled.div` + color: var(--vscode-descriptionForeground); + font-size: 12px; + font-weight: 400; + line-height: 1.5; +`; + +const InputContainer = styled.div` + display: flex; + flex-direction: column; + gap: 4px; + padding: 2px 4px; + border: 1px solid var(--vscode-editorWidget-border); + border-radius: 4px; + background-color: var(--vscode-editor-background); + color: var(--vscode-editor-foreground); + width: 100%; + box-sizing: border-box; + min-height: 32px; + &:focus-within { + border-color: var(--vscode-button-background); + } +`; + +const InputRow = styled.div` + display: flex; + align-items: center; + width: 100%; + min-height: 28px; + gap: 8px; +`; + +const StyledTextField = styled(VSCodeTextField)` + flex: 1; + border: none; + background: transparent; + height: 28px; + min-height: 28px; + display: flex; + align-items: center; + width: 100%; + &::part(control) { + border: none !important; + background: transparent !important; + padding: 0 4px; + outline: none !important; + box-shadow: none !important; + height: 28px !important; + min-height: 28px !important; + line-height: 28px !important; + display: flex !important; + align-items: center !important; + width: 100% !important; + flex: 1 !important; + } + &::part(control):focus { + outline: none !important; + box-shadow: none !important; + border: none !important; + } + &::part(root) { + border: none !important; + background: transparent !important; + height: 28px !important; + min-height: 28px !important; + display: flex !important; + align-items: center !important; + width: 100% !important; + flex: 1 !important; + } +`; + +const EyeButton = styled.button` + width: 24px; + height: 24px; + background-color: transparent; + color: var(--vscode-icon-foreground); + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 16px; + display: flex; + align-items: center; + justify-content: center; + transition: background-color 0.2s; + box-sizing: border-box; + flex-shrink: 0; + &:hover { + background-color: var(--vscode-toolbar-hoverBackground); + } + &:active { + background-color: var(--vscode-toolbar-activeBackground); + } +`; + +const ButtonContainer = styled.div` + display: flex; + gap: 8px; + align-self: flex-start; +`; + +const ErrorMessage = styled.div` + display: flex; + align-items: flex-start; + gap: 8px; + color: var(--vscode-errorForeground); + font-size: 12px; + font-weight: 400; + line-height: 1.5; + width: 100%; +`; + +interface WaitingForLoginProps { + loginMethod?: LoginMethod; + isValidating?: boolean; + errorMessage?: string; +} + +const WaitingForLogin = ({ loginMethod, isValidating = false, errorMessage }: WaitingForLoginProps) => { const { rpcClient } = useRpcContext(); + const [apiKey, setApiKey] = useState(""); + const [showApiKey, setShowApiKey] = useState(false); const cancelLogin = () => { rpcClient.sendAIStateEvent(AIMachineEventType.CANCEL_LOGIN); }; + const connectWithKey = () => { + if (apiKey.trim()) { + // Send the API key to the state machine for validation + rpcClient.sendAIStateEvent({ + type: AIMachineEventType.SUBMIT_API_KEY, + payload: { apiKey: apiKey.trim() }, + }); + } + }; + + const handleApiKeyChange = (e: any) => { + setApiKey(e.target.value); + }; + + const toggleApiKeyVisibility = () => { + setShowApiKey(!showApiKey); + }; + + if (loginMethod === LoginMethod.ANTHROPIC_KEY) { + return ( + + + Connect with Anthropic API Key + + Enter your Anthropic API key to connect to the AI service. Your API key will be securely stored + and used for authentication. + + + + + + + + + + + + {errorMessage && ( + + + {errorMessage} + + )} + + + + {isValidating ? "Validating..." : "Connect with Key"} + + + Cancel + + + + + ); + } + + // Default: BI_INTEL login method + return ( Date: Tue, 22 Jul 2025 13:48:49 +0530 Subject: [PATCH 089/349] Rename `getAgentOrg` API to `getAIModuleOrg` --- .../src/interfaces/extended-lang-client.ts | 4 ++-- .../src/rpc-types/ai-agent/index.ts | 4 ++-- .../src/rpc-types/ai-agent/rpc-type.ts | 4 ++-- .../src/core/extended-language-client.ts | 10 ++++----- .../src/rpc-managers/ai-agent/rpc-handler.ts | 6 ++--- .../src/rpc-managers/ai-agent/rpc-manager.ts | 14 ++++++------ .../src/utils/project-artifacts.ts | 4 ++-- .../src/rpc-clients/ai-agent/rpc-client.ts | 10 ++++----- .../BI/AIChatAgent/AIChatAgentWizard.tsx | 14 ++++++------ .../BI/AIChatAgent/MemoryManagerConfig.tsx | 8 +++---- .../src/views/BI/AIChatAgent/ModelConfig.tsx | 22 +++++++++---------- .../src/views/BI/AIChatAgent/NewAgent.tsx | 12 +++++----- .../src/views/BI/AIChatAgent/utils.ts | 10 ++++----- 13 files changed, 61 insertions(+), 61 deletions(-) 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 6ccd11a0f8e..9ddf90bd613 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -1422,11 +1422,11 @@ export interface FunctionNodeResponse { // <-------- AI Agent Related -------> -export interface AIAgentOrgRequest { +export interface AiModuleOrgRequest { projectPath: string; } -export interface AIAgentOrgResponse { +export interface AiModuleOrgResponse { orgName: string; } diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts index 15a227f1e15..1c93a7ae60f 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts @@ -16,11 +16,11 @@ * under the License. */ -import { AIAgentOrgRequest, AIAgentOrgResponse, AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest, McpToolsRequest, McpToolsResponse } from "../../interfaces/extended-lang-client"; +import { AiModuleOrgRequest, AiModuleOrgResponse, AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest, McpToolsRequest, McpToolsResponse } from "../../interfaces/extended-lang-client"; import { AIAgentRequest, AIAgentResponse, AIAgentToolsUpdateRequest, McpToolUpdateRequest } from "./interfaces"; export interface AIAgentAPI { - getAgentOrg: (params: AIAgentOrgRequest) => Promise; + getAiModuleOrg: (params: AiModuleOrgRequest) => Promise; getAllAgents: (params: AINodesRequest) => Promise; getAllModels: (params: AIModelsRequest) => Promise; getAllMemoryManagers: (params: MemoryManagersRequest) => Promise; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts index 945c8d65476..d23d1998849 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts @@ -17,12 +17,12 @@ * * THIS FILE INCLUDES AUTO GENERATED CODE */ -import { AIAgentOrgRequest, AIAgentOrgResponse, AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest, McpToolsRequest, McpToolsResponse } from "../../interfaces/extended-lang-client"; +import { AiModuleOrgRequest, AiModuleOrgResponse, AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest, McpToolsRequest, McpToolsResponse } from "../../interfaces/extended-lang-client"; import { AIAgentRequest, AIAgentResponse, AIAgentToolsUpdateRequest, McpToolUpdateRequest } from "./interfaces"; import { RequestType, NotificationType } from "vscode-messenger-common"; const _preFix = "ai-agent"; -export const getAgentOrg: RequestType = { method: `${_preFix}/getAgentOrg` }; +export const getAiModuleOrg: RequestType = { method: `${_preFix}/getAiModuleOrg` }; export const getAllAgents: RequestType = { method: `${_preFix}/getAllAgents` }; export const getAllModels: RequestType = { method: `${_preFix}/getAllModels` }; export const getAllMemoryManagers: RequestType = { method: `${_preFix}/getAllMemoryManagers` }; 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 33c34223d65..545294b9a82 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts @@ -182,8 +182,8 @@ import { FunctionModelRequest, FunctionModelResponse, TypeDataWithReferences, - AIAgentOrgRequest, - AIAgentOrgResponse, + AiModuleOrgRequest, + AiModuleOrgResponse, AINodesResponse, AIModelsRequest, AIToolsRequest, @@ -373,7 +373,7 @@ enum EXTENDED_APIS { BI_ADD_TEST_FUNCTION = 'testManagerService/addTestFunction', BI_UPDATE_TEST_FUNCTION = 'testManagerService/updateTestFunction', BI_EDIT_FUNCTION_NODE = 'flowDesignService/functionDefinition', - BI_AI_AGENT_ORG = 'agentManager/getAgentOrg', + BI_AI_AGENT_ORG = 'agentManager/getAiModuleOrg', BI_AI_ALL_AGENTS = 'agentManager/getAllAgents', BI_AI_ALL_MODELS = 'agentManager/getAllModels', BI_AI_ALL_MEMORY_MANAGERS = 'agentManager/getAllMemoryManagers', @@ -1114,8 +1114,8 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest(EXTENDED_APIS.BI_ADD_FUNCTION, params); } - async getAgentOrg(params: AIAgentOrgRequest) : Promise { - return this.sendRequest(EXTENDED_APIS.BI_AI_AGENT_ORG, params); + async getAiModuleOrg(params: AiModuleOrgRequest) : Promise { + return this.sendRequest(EXTENDED_APIS.BI_AI_AGENT_ORG, params); } async getAllAgents(params: AINodesRequest): Promise { diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts index ab46244ae75..c69e9f0922a 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts @@ -18,7 +18,7 @@ * THIS FILE INCLUDES AUTO GENERATED CODE */ import { - AIAgentOrgRequest, + AiModuleOrgRequest, AIAgentRequest, AIAgentToolsUpdateRequest, AIGentToolsRequest, @@ -27,7 +27,7 @@ import { AIToolsRequest, createAIAgent, genTool, - getAgentOrg, + getAiModuleOrg, getAllAgents, getAllMemoryManagers, getAllModels, @@ -45,7 +45,7 @@ import { AiAgentRpcManager } from "./rpc-manager"; export function registerAiAgentRpcHandlers(messenger: Messenger) { const rpcManger = new AiAgentRpcManager(); - messenger.onRequest(getAgentOrg, (args: AIAgentOrgRequest) => rpcManger.getAgentOrg(args)); + messenger.onRequest(getAiModuleOrg, (args: AiModuleOrgRequest) => rpcManger.getAiModuleOrg(args)); messenger.onRequest(getAllAgents, (args: AINodesRequest) => rpcManger.getAllAgents(args)); messenger.onRequest(getAllModels, (args: AIModelsRequest) => rpcManger.getAllModels(args)); messenger.onRequest(getAllMemoryManagers, (args: MemoryManagersRequest) => rpcManger.getAllMemoryManagers(args)); diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts index 9ab9ac5a67f..75d4a2e2c65 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts @@ -17,8 +17,8 @@ */ import { AIAgentAPI, - AIAgentOrgRequest, - AIAgentOrgResponse, + AiModuleOrgRequest, + AiModuleOrgResponse, AIAgentRequest, AIAgentResponse, AIAgentToolsUpdateRequest, @@ -157,14 +157,14 @@ export class AiAgentRpcManager implements AIAgentAPI { } // Create the model Second - const agentOrg = await StateMachine.langClient().getAgentOrg({ projectPath: projectUri }); - const allAgents = (await StateMachine.langClient().getAllAgents({ filePath, orgName: agentOrg.orgName})); + const aiModuleOrg = await StateMachine.langClient().getAiModuleOrg({ projectPath: projectUri }); + const allAgents = (await StateMachine.langClient().getAllAgents({ filePath, orgName: aiModuleOrg.orgName})); console.log("All Agents: ", allAgents); const fixedAgentCodeData = allAgents.agents.at(0); if (params.modelState === 1) { - const allModels = await StateMachine.langClient().getAllModels({ agent: fixedAgentCodeData.object, filePath, orgName: agentOrg.orgName }); + const allModels = await StateMachine.langClient().getAllModels({ agent: fixedAgentCodeData.object, filePath, orgName: aiModuleOrg.orgName }); const modelCodeData = allModels.models.find(val => val.object === params.selectedModel); const modelFlowNode = (await StateMachine.langClient().getNodeTemplate({ filePath, id: modelCodeData, position: { line: 0, offset: 0 } })).flowNode; @@ -393,11 +393,11 @@ export class AiAgentRpcManager implements AIAgentAPI { } } - async getAgentOrg(params: AIAgentOrgRequest): Promise { + async getAiModuleOrg(params: AiModuleOrgRequest): Promise { return new Promise(async (resolve) => { const context = StateMachine.context(); try { - const res: AIAgentOrgResponse = await context.langClient.getAgentOrg(params); + const res: AiModuleOrgResponse = await context.langClient.getAiModuleOrg(params); resolve(res); } catch (error) { console.log(error); diff --git a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts index 12d24aa8abd..5401758698e 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts @@ -179,7 +179,7 @@ async function getEntryValue(artifact: BaseArtifact, icon: string, moduleName?: // This has to be replaced once we have a proper design for AI Agent Chat Service async function injectAIAgent(serviceArtifact: BaseArtifact) { // Fetch the organization name for importing the AI package - const agentOrg = await new AiAgentRpcManager().getAgentOrg({ projectPath: StateMachine.context().projectUri }); + const aiModuleOrg = await new AiAgentRpcManager().getAiModuleOrg({ projectPath: StateMachine.context().projectUri }); //get AgentName const agentName = serviceArtifact.name.split('-')[1].trim().replace(/\//g, ''); @@ -202,7 +202,7 @@ async function injectAIAgent(serviceArtifact: BaseArtifact) { const injectionPosition = updatedService.service.functions[0].codedata.lineRange.endLine; const serviceFile = path.join(StateMachine.context().projectUri, `main.bal`); ensureFileExists(serviceFile); - await injectAgentCode(agentName, serviceFile, injectionPosition, agentOrg.orgName); + await injectAgentCode(agentName, serviceFile, injectionPosition, aiModuleOrg.orgName); const functionPosition: NodePosition = { startLine: updatedService.service.functions[0].codedata.lineRange.startLine.line, startColumn: updatedService.service.functions[0].codedata.lineRange.startLine.offset, diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts index 41920c69bf2..67a8dd8ab3c 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts @@ -19,8 +19,8 @@ */ import { AIAgentAPI, - AIAgentOrgRequest, - AIAgentOrgResponse, + AiModuleOrgRequest, + AiModuleOrgResponse, AIAgentRequest, AIAgentResponse, AIAgentToolsUpdateRequest, @@ -34,7 +34,7 @@ import { AIToolsResponse, createAIAgent, genTool, - getAgentOrg, + getAiModuleOrg, getAllAgents, getAllMemoryManagers, getAllModels, @@ -59,8 +59,8 @@ export class AiAgentRpcClient implements AIAgentAPI { this._messenger = messenger; } - getAgentOrg(params: AIAgentOrgRequest): Promise { - return this._messenger.sendRequest(getAgentOrg, HOST_EXTENSION, params); + getAiModuleOrg(params: AiModuleOrgRequest): Promise { + return this._messenger.sendRequest(getAiModuleOrg, HOST_EXTENSION, params); } getAllAgents(params: AINodesRequest): Promise { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx index c6b478763a0..a8ccf0929f0 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx @@ -27,7 +27,7 @@ import { TitleBar } from '../../../components/TitleBar'; import { TopNavigationBar } from '../../../components/TopNavigationBar'; import { RelativeLoader } from '../../../components/RelativeLoader'; import { FormHeader } from '../../../components/FormHeader'; -import { getAgentOrg, getNodeTemplate } from './utils'; +import { getAiModuleOrg, getNodeTemplate } from './utils'; import { cloneDeep } from 'lodash'; import { AI, BALLERINA } from '../../../constants'; @@ -85,7 +85,7 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { ]; const agentFilePath = useRef(""); - const agentOrg = useRef(""); + const aiModuleOrg = useRef(""); const agentCallEndOfFile = useRef(null); const agentEndOfFile = useRef(null); const mainFilePath = useRef(""); @@ -95,7 +95,7 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { const filePath = await rpcClient.getVisualizerLocation(); agentFilePath.current = Utils.joinPath(URI.file(filePath.projectUri), "agents.bal").fsPath; // get agent org - agentOrg.current = await getAgentOrg(rpcClient); + aiModuleOrg.current = await getAiModuleOrg(rpcClient); // fetch agent node await fetchAgentNode(); // get end of files @@ -114,7 +114,7 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { useEffect(() => { initWizard().then(() => { - rpcClient.getServiceDesignerRpcClient().getListenerModel({ moduleName: type, orgName: agentOrg.current }).then(res => { + rpcClient.getServiceDesignerRpcClient().getListenerModel({ moduleName: type, orgName: aiModuleOrg.current }).then(res => { setListenerModel(res.listener); }); }).catch(error => { @@ -125,7 +125,7 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { const fetchAgentNode = async () => { // get the agent node - const allAgents = await rpcClient.getAIAgentRpcClient().getAllAgents({ filePath: agentFilePath.current, orgName: agentOrg.current }); + const allAgents = await rpcClient.getAIAgentRpcClient().getAllAgents({ filePath: agentFilePath.current, orgName: aiModuleOrg.current }); console.log(">>> allAgents", allAgents); if (!allAgents.agents.length) { console.log(">>> no agents found"); @@ -139,7 +139,7 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { // get all llm models const allModels = await rpcClient .getAIAgentRpcClient() - .getAllModels({ agent: agentCodeData.object, filePath: agentFilePath.current, orgName: agentOrg.current }); + .getAllModels({ agent: agentCodeData.object, filePath: agentFilePath.current, orgName: aiModuleOrg.current }); console.log(">>> allModels", allModels); // get openai model const defaultModel = allModels.models.find((model) => model.object === "OpenAiProvider" || (model.org === BALLERINA && model.module === AI)); @@ -197,7 +197,7 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { filePath: "", moduleName: type, listenerName: listenerName, - orgName: agentOrg.current, + orgName: aiModuleOrg.current, }).then(res => { const serviceModel = res.service; console.log("Service Model: ", serviceModel); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/MemoryManagerConfig.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/MemoryManagerConfig.tsx index 4ffb7bb5a6f..467da902d04 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/MemoryManagerConfig.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/MemoryManagerConfig.tsx @@ -26,7 +26,7 @@ import ConfigForm from "./ConfigForm"; import { Dropdown } from "@wso2/ui-toolkit"; import { cloneDeep } from "lodash"; import { RelativeLoader } from "../../../components/RelativeLoader"; -import { getAgentFilePath, getAgentOrg, getNodeTemplate } from "./utils"; +import { getAgentFilePath, getAiModuleOrg, getNodeTemplate } from "./utils"; const Container = styled.div` padding: 16px; @@ -68,7 +68,7 @@ export function MemoryManagerConfig(props: MemoryManagerConfigProps): JSX.Elemen const [savingForm, setSavingForm] = useState(false); const agentFilePath = useRef(""); - const agentOrg = useRef(""); + const aiModuleOrg = useRef(""); const agentNodeRef = useRef(); const moduleConnectionNodes = useRef([]); @@ -85,7 +85,7 @@ export function MemoryManagerConfig(props: MemoryManagerConfigProps): JSX.Elemen const initPanel = async () => { setLoading(true); agentFilePath.current = await getAgentFilePath(rpcClient); - agentOrg.current = await getAgentOrg(rpcClient); + aiModuleOrg.current = await getAiModuleOrg(rpcClient); // fetch all memory managers const memoryManagers = await fetchMemoryManagers(); // fetch selected agent memory manager @@ -103,7 +103,7 @@ export function MemoryManagerConfig(props: MemoryManagerConfigProps): JSX.Elemen try { const memoryManagers = await rpcClient .getAIAgentRpcClient() - .getAllMemoryManagers({ filePath: agentFilePath.current, orgName: agentOrg.current }); + .getAllMemoryManagers({ filePath: agentFilePath.current, orgName: aiModuleOrg.current }); console.log(">>> all memory managers", memoryManagers); if (memoryManagers.memoryManagers) { setMemoryManagersCodeData(memoryManagers.memoryManagers); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx index 181850f2fe4..9d3bd80159b 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx @@ -26,7 +26,7 @@ import ConfigForm from "./ConfigForm"; import { Dropdown } from "@wso2/ui-toolkit"; import { cloneDeep } from "lodash"; import { RelativeLoader } from "../../../components/RelativeLoader"; -import { getAgentFilePath, getAgentOrg, getNodeTemplate } from "./utils"; +import { getAgentFilePath, getAiModuleOrg, getNodeTemplate } from "./utils"; import { BALLERINA, BALLERINAX, GET_DEFAULT_MODEL_PROVIDER, WSO2_MODEL_PROVIDER, PROVIDER_NAME_MAP } from "../../../constants"; const Container = styled.div` @@ -69,7 +69,7 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { const [savingForm, setSavingForm] = useState(false); const agentFilePath = useRef(""); - const agentOrg = useRef(""); + const aiModuleOrg = useRef(""); const moduleConnectionNodes = useRef([]); const selectedModelFlowNode = useRef(); @@ -81,9 +81,9 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { if (modelsCodeData.length > 0 && selectedModel && !selectedModelCodeData) { // Find the initial modelCodeData that matches selectedModel let initialModelCodeData: CodeData | undefined; - if (agentOrg.current === BALLERINA) { + if (aiModuleOrg.current === BALLERINA) { initialModelCodeData = modelsCodeData.find((model) => model.module === selectedModel.codedata.module); - } else if (agentOrg.current === BALLERINAX) { + } else if (aiModuleOrg.current === BALLERINAX) { initialModelCodeData = modelsCodeData.find((model) => model.object === selectedModel.codedata.object); } else { initialModelCodeData = modelsCodeData.find((model) => model.module === selectedModel.codedata.module); @@ -100,7 +100,7 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { const initPanel = async () => { setLoading(true); agentFilePath.current = await getAgentFilePath(rpcClient); - agentOrg.current = await getAgentOrg(rpcClient); + aiModuleOrg.current = await getAiModuleOrg(rpcClient); // fetch all models await fetchModels(); // fetch selected agent model @@ -111,12 +111,12 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { // Helper to get provider name from modelCodeData const getProviderName = (model: CodeData, useMappedName: boolean = false) => { if (!model) return ""; - if (agentOrg.current === BALLERINA) { + if (aiModuleOrg.current === BALLERINA) { if (useMappedName) { return PROVIDER_NAME_MAP[model.module] || model.module; } return model.module; - } else if (agentOrg.current === BALLERINAX) { + } else if (aiModuleOrg.current === BALLERINAX) { return model.object; } // fallback @@ -132,7 +132,7 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { } const models = await rpcClient .getAIAgentRpcClient() - .getAllModels({ agent: agentName, filePath: agentFilePath.current, orgName: agentOrg.current }); + .getAllModels({ agent: agentName, filePath: agentFilePath.current, orgName: aiModuleOrg.current }); console.log(">>> all models", models); setModelsCodeData(models.models); }; @@ -166,11 +166,11 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { const fetchModelNodeTemplate = async (modelCodeData: CodeData) => { setLoading(true); let nodeProperties: NodeProperties = {}; - // Determine provider match for both agentOrg cases + // Determine provider match for both aiModuleOrg cases let isProviderMatch = false; - if (agentOrg.current === BALLERINA) { + if (aiModuleOrg.current === BALLERINA) { isProviderMatch = selectedModel?.codedata.module === modelCodeData.module; - } else if (agentOrg.current === BALLERINAX) { + } else if (aiModuleOrg.current === BALLERINAX) { isProviderMatch = selectedModel?.codedata.object === modelCodeData.object; } else { isProviderMatch = selectedModel?.codedata.module === modelCodeData.module; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx index 324175243f3..3568ae9f7ad 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx @@ -26,7 +26,7 @@ import { URI, Utils } from "vscode-uri"; import ConfigForm from "./ConfigForm"; import { cloneDeep } from "lodash"; import { RelativeLoader } from "../../../components/RelativeLoader"; -import { getAgentOrg, getNodeTemplate } from "./utils"; +import { getAiModuleOrg, getNodeTemplate } from "./utils"; import { AI, BALLERINA } from "../../../constants"; const Container = styled.div` @@ -61,7 +61,7 @@ export function NewAgent(props: NewAgentProps): JSX.Element { const [savingForm, setSavingForm] = useState(false); const agentFilePath = useRef(""); - const agentOrg = useRef(""); + const aiModuleOrg = useRef(""); const agentCallEndOfFile = useRef(null); const agentEndOfFile = useRef(null); @@ -75,7 +75,7 @@ export function NewAgent(props: NewAgentProps): JSX.Element { const filePath = await rpcClient.getVisualizerLocation(); agentFilePath.current = Utils.joinPath(URI.file(filePath.projectUri), "agents.bal").fsPath; // get agent org - agentOrg.current = await getAgentOrg(rpcClient); + aiModuleOrg.current = await getAiModuleOrg(rpcClient); // fetch agent node await fetchAgentNode(); // get end of files @@ -100,7 +100,7 @@ export function NewAgent(props: NewAgentProps): JSX.Element { const fetchAgentNode = async () => { // get the agent node - const allAgents = await rpcClient.getAIAgentRpcClient().getAllAgents({ filePath: agentFilePath.current, orgName: agentOrg.current }); + const allAgents = await rpcClient.getAIAgentRpcClient().getAllAgents({ filePath: agentFilePath.current, orgName: aiModuleOrg.current }); console.log(">>> allAgents", allAgents); if (!allAgents.agents.length) { console.log(">>> no agents found"); @@ -114,7 +114,7 @@ export function NewAgent(props: NewAgentProps): JSX.Element { // get all llm models const allModels = await rpcClient .getAIAgentRpcClient() - .getAllModels({ agent: agentCodeData.object, filePath: agentFilePath.current, orgName: agentOrg.current }); + .getAllModels({ agent: agentCodeData.object, filePath: agentFilePath.current, orgName: aiModuleOrg.current }); console.log(">>> allModels", allModels); // get openai model const defaultModel = allModels.models.find((model) => model.object === "OpenAiProvider" || (model.org === BALLERINA && model.module === AI)); @@ -134,7 +134,7 @@ export function NewAgent(props: NewAgentProps): JSX.Element { return; } // overwrite the agent call node properties - agentCallNode.codedata.org = agentOrg.current; + agentCallNode.codedata.org = aiModuleOrg.current; const agentCallFormFields = convertConfig(agentCallNode.properties); const systemPromptProperty = agentNode.properties.systemPrompt; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts index 8f5180a7dbe..fb944941a6f 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts @@ -36,13 +36,13 @@ export const getNodeTemplate = async ( return response?.flowNode; }; -export const getAgentOrg = async (rpcClient: BallerinaRpcClient) => { +export const getAiModuleOrg = async (rpcClient: BallerinaRpcClient) => { const filePath = await rpcClient.getVisualizerLocation(); - const agentOrgResponse = await rpcClient + const aiModuleOrgResponse = await rpcClient .getAIAgentRpcClient() - .getAgentOrg({ projectPath: filePath.projectUri }); - console.log(">>> agent org", agentOrgResponse.orgName); - return agentOrgResponse.orgName; + .getAiModuleOrg({ projectPath: filePath.projectUri }); + console.log(">>> agent org", aiModuleOrgResponse.orgName); + return aiModuleOrgResponse.orgName; } export const getAgentFilePath = async (rpcClient: BallerinaRpcClient) => { From ea355a4bd874b8623fe695316e0e31c6e33fb860 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Tue, 22 Jul 2025 14:39:09 +0530 Subject: [PATCH 090/349] Fix line range calculation in injectAIAgent function --- .../ballerina-extension/src/utils/project-artifacts.ts | 2 +- .../ballerina/ballerina-extension/src/utils/source-utils.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts index 5401758698e..7198f2294c7 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts @@ -206,7 +206,7 @@ async function injectAIAgent(serviceArtifact: BaseArtifact) { const functionPosition: NodePosition = { startLine: updatedService.service.functions[0].codedata.lineRange.startLine.line, startColumn: updatedService.service.functions[0].codedata.lineRange.startLine.offset, - endLine: updatedService.service.functions[0].codedata.lineRange.endLine.line + 3, + endLine: updatedService.service.functions[0].codedata.lineRange.endLine.line + 2, endColumn: updatedService.service.functions[0].codedata.lineRange.endLine.offset }; return { diff --git a/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts b/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts index 16c1792100b..3cb43b8b749 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts @@ -208,8 +208,8 @@ export async function injectAgentCode(name: string, serviceFile: string, injecti ` string stringResult = check _${name}Agent.run(request.message, request.sessionId); return {message: stringResult}; ` - : ` - string stringResult = check _${name}Agent->run(request.message, request.sessionId); + : + ` string stringResult = check _${name}Agent->run(request.message, request.sessionId); return {message: stringResult}; `; serviceEdit.insert(Uri.file(serviceFile), new Position(injectionPosition.line, 0), serviceSourceCode); From decea815c16345443579130ba4177ccebfc74db3 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Tue, 22 Jul 2025 15:12:37 +0530 Subject: [PATCH 091/349] Add Variables artifact type and corresponding directory mapping --- .../ballerina-core/src/interfaces/extended-lang-client.ts | 3 ++- .../ballerina-extension/src/utils/project-artifacts.ts | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) 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 9ddf90bd613..7a3cf34686f 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -1580,7 +1580,8 @@ export enum ARTIFACT_TYPE { Types = "Types", NaturalFunctions = "Natural Functions", DataMappers = "Data Mappers", - Configurations = "Configurations" + Configurations = "Configurations", + Variables = "Variables" } export interface Artifacts { diff --git a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts index 7198f2294c7..c461714faef 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts @@ -269,6 +269,8 @@ function getDirectoryMapKeyAndIcon(artifact: BaseArtifact, artifactCategoryKey: return { mapKey: DIRECTORY_MAP.CONFIGURABLE, icon: "config" }; case ARTIFACT_TYPE.NaturalFunctions: return { mapKey: DIRECTORY_MAP.NP_FUNCTION, icon: "function" }; + case ARTIFACT_TYPE.Variables: + return { mapKey: DIRECTORY_MAP.VARIABLE, icon: "variable" }; default: console.warn(`Unhandled artifact category key: ${artifactCategoryKey}`); return null; From 4da8c65aaac6976a52b12ad38a19bc04e3c9a7db Mon Sep 17 00:00:00 2001 From: Vellummyilum Vinoth Date: Thu, 24 Jul 2025 09:29:25 +0530 Subject: [PATCH 092/349] Change the DataMappingSchema to prevent hallucination --- .../src/features/ai/service/datamapper/datamapper.ts | 6 +++--- .../src/features/ai/service/datamapper/schema.ts | 5 +++++ .../src/views/AIPanel/utils/attachment/attachmentManager.ts | 2 -- 3 files changed, 8 insertions(+), 5 deletions(-) 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 index 8cc63533652..650ad54f01d 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts @@ -35,7 +35,7 @@ import { Structure, ChatResponse, } from "./types"; -import { DataMappingSchema } from "./schema"; +import { MappingSchema } from "./schema"; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; // ============================================================================= @@ -297,11 +297,11 @@ async function getAutoMappings( maxTokens: 4096, temperature: 0, messages: messages, - schema: DataMappingSchema, + schema: MappingSchema, abortSignal: AIPanelAbortController.getInstance().signal, }); - const generatedMappings = object as AIDataMappings; + const generatedMappings = object.generatedMappings as AIDataMappings; return generatedMappings; } catch (error) { console.error("Failed to parse response:", error); diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/schema.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/schema.ts index e4522337c40..eae58bd7d50 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/schema.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/schema.ts @@ -54,3 +54,8 @@ export const DataMappingSchema = z.record( ]) ); +// Top-level schema for the data mapping +export const MappingSchema = z.object({ + generatedMappings: DataMappingSchema +}); + diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/utils/attachment/attachmentManager.ts b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/utils/attachment/attachmentManager.ts index 4ad57bb78e0..e81b4617626 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/utils/attachment/attachmentManager.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/utils/attachment/attachmentManager.ts @@ -51,8 +51,6 @@ const DOCUMENT_TYPES = [ "image/heic", "image/heif", "application/pdf", - "application/vnd.openxmlformats-officedocument.wordprocessingml.document", - "application/msword", ]; /** From 73390fbe1309bd5bd58875915a8544a331c6cadf Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Wed, 23 Jul 2025 14:25:05 +0530 Subject: [PATCH 093/349] Update AI agent components to pass correct filepath to ConfigForm component --- .../src/views/BI/AIChatAgent/AgentConfig.tsx | 6 +++++- .../src/views/BI/AIChatAgent/ConfigForm.tsx | 5 +++-- .../src/views/BI/AIChatAgent/MemoryManagerConfig.tsx | 1 + .../src/views/BI/AIChatAgent/ModelConfig.tsx | 1 + .../src/views/BI/AIChatAgent/NewAgent.tsx | 4 ++++ .../src/views/BI/AIChatAgent/ToolConfig.tsx | 1 + .../src/views/BI/AIChatAgent/utils.ts | 8 ++++++++ 7 files changed, 23 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AgentConfig.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AgentConfig.tsx index 2d93a6d86d9..d9d02611f3b 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AgentConfig.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AgentConfig.tsx @@ -24,7 +24,7 @@ import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { convertConfig } from "../../../utils/bi"; import ConfigForm from "./ConfigForm"; import { cloneDeep } from "lodash"; -import { findAgentNodeFromAgentCallNode, getAgentFilePath } from "./utils"; +import { findAgentNodeFromAgentCallNode, getAgentFilePath, getMainFilePath } from "./utils"; const Container = styled.div` padding: 16px; @@ -54,6 +54,7 @@ export function AgentConfig(props: AgentConfigProps): JSX.Element { const [savingForm, setSavingForm] = useState(false); const agentFilePath = useRef(""); + const mainFilePath = useRef(""); useEffect(() => { initPanel(); @@ -68,6 +69,8 @@ export function AgentConfig(props: AgentConfigProps): JSX.Element { const initPanel = async () => { // get agent file path agentFilePath.current = await getAgentFilePath(rpcClient); + // get main file path + mainFilePath.current = await getMainFilePath(rpcClient); // fetch agent node await fetchAgentNode(); await fetchAgentCallNode(); @@ -214,6 +217,7 @@ export function AgentConfig(props: AgentConfigProps): JSX.Element { {agentCallNode?.codedata?.lineRange && ( >> ConfigForm props", props); const handleSubmit = async (data: FormValues, formImports: FormImports) => { @@ -80,7 +81,7 @@ export function ConfigForm(props: ConfigProps) { {targetLineRange && ( 0 && agentNodeRef.current?.codedata?.lineRange && ( 0 && selectedModel?.codedata?.lineRange && ( (false); const agentFilePath = useRef(""); + const mainFilePath = useRef(""); const aiModuleOrg = useRef(""); const agentCallEndOfFile = useRef(null); const agentEndOfFile = useRef(null); @@ -74,6 +75,8 @@ export function NewAgent(props: NewAgentProps): JSX.Element { // get agent file path const filePath = await rpcClient.getVisualizerLocation(); agentFilePath.current = Utils.joinPath(URI.file(filePath.projectUri), "agents.bal").fsPath; + // get main file path + mainFilePath.current = Utils.joinPath(URI.file(filePath.projectUri), "main.bal").fsPath; // get agent org aiModuleOrg.current = await getAiModuleOrg(rpcClient); // fetch agent node @@ -295,6 +298,7 @@ export function NewAgent(props: NewAgentProps): JSX.Element { )} {!loading && ( { return agentFilePath; }; +export const getMainFilePath = async (rpcClient: BallerinaRpcClient) => { + // Get the main file path and update the node + const filePath = await rpcClient.getVisualizerLocation(); + // Create the main file path + const mainFilePath = Utils.joinPath(URI.file(filePath.projectUri), "main.bal").fsPath; + return mainFilePath; +}; + export const findFlowNodeByModuleVarName = async (variableName: string, rpcClient: BallerinaRpcClient) => { try { // Get all module nodes From f4b21ea9306d3bef69aa2e1405c586174d4acd39 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Thu, 24 Jul 2025 10:23:29 +0530 Subject: [PATCH 094/349] Remove mock values for mcp tools --- .../src/components/editors/DropdownEditor.tsx | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx index a746aa5b977..581a47d5b24 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx @@ -115,15 +115,7 @@ export function DropdownEditor(props: DropdownEditorProps) { const { field, openSubPanel, serviceUrl, configs, rpcClient, onToolsChange, newServerUrl } = props; const { form } = useFormContext(); const { register, setValue, watch } = form; - - console.log(">>> DropdownEditor props:", props); - // MCP tools selection state (self-contained) - const DUMMY_TOOLS = [ - { name: "single-greet", description: "Greet a user with a single message" }, - { name: "multi-greet", description: "Greet a user with multiple messages" } - ]; - - const [mcpTools, setMcpTools] = useState<{ name: string; description?: string }[]>(props.mcpTools || DUMMY_TOOLS); + const [mcpTools, setMcpTools] = useState<{ name: string; description?: string }[]>(props.mcpTools || []); // Sync mcpTools state with props.mcpTools useEffect(() => { From 622500f8303daf15c836f02fd375230e276f2261 Mon Sep 17 00:00:00 2001 From: tharindulak Date: Thu, 24 Jul 2025 11:25:17 +0530 Subject: [PATCH 095/349] Fix issues --- .../examples/profile-test.spec.ts | 82 ------------------- .../playwright-vscode-tester/src/browser.ts | 7 +- .../playwright-vscode-tester/src/codeUtil.ts | 10 ++- 3 files changed, 12 insertions(+), 87 deletions(-) delete mode 100644 workspaces/common-libs/playwright-vscode-tester/examples/profile-test.spec.ts diff --git a/workspaces/common-libs/playwright-vscode-tester/examples/profile-test.spec.ts b/workspaces/common-libs/playwright-vscode-tester/examples/profile-test.spec.ts deleted file mode 100644 index c2d21567ec8..00000000000 --- a/workspaces/common-libs/playwright-vscode-tester/examples/profile-test.spec.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { test, expect } from '@playwright/test'; -import { startVSCode, ReleaseQuality } from '@wso2/playwright-vscode-tester'; - -test.describe('VSCode Profile Testing', () => { - test('should start VSCode with custom profile', async () => { - // Start VSCode with a custom profile for isolation - const vscode = await startVSCode( - './test-resources', // resources folder - 'latest', // VSCode version - ReleaseQuality.Stable, // release type - false, // enable recorder - undefined, // extensions folder - './test-project', // project path to open - 'test-profile-clean' // custom profile name - ); - - // Get the main workbench page - const workbench = vscode.firstWindow(); - - // Verify VSCode opened with clean profile - await expect(workbench.locator('.monaco-workbench')).toBeVisible(); - - // You can now interact with VSCode in a clean environment - // without any interference from your development settings - - // Close VSCode when done - await vscode.close(); - }); - - test('should start multiple VSCode instances with different profiles', async () => { - // Start first instance with profile A - const vscode1 = await startVSCode( - './test-resources', - 'latest', - ReleaseQuality.Stable, - false, - undefined, - './project-a', - 'test-profile-a' - ); - - // Start second instance with profile B - const vscode2 = await startVSCode( - './test-resources', - 'latest', - ReleaseQuality.Stable, - false, - undefined, - './project-b', - 'test-profile-b' - ); - - // Both instances are now running with isolated profiles - const workbench1 = vscode1.firstWindow(); - const workbench2 = vscode2.firstWindow(); - - await expect(workbench1.locator('.monaco-workbench')).toBeVisible(); - await expect(workbench2.locator('.monaco-workbench')).toBeVisible(); - - // Clean up - await vscode1.close(); - await vscode2.close(); - }); - - test('should use auto-generated profile when none specified', async () => { - // This will automatically generate a unique profile name - const vscode = await startVSCode( - './test-resources', - 'latest', - ReleaseQuality.Stable, - false, - undefined, - './test-project' - // No profile name specified - will auto-generate - ); - - const workbench = vscode.firstWindow(); - await expect(workbench.locator('.monaco-workbench')).toBeVisible(); - - await vscode.close(); - }); -}); diff --git a/workspaces/common-libs/playwright-vscode-tester/src/browser.ts b/workspaces/common-libs/playwright-vscode-tester/src/browser.ts index ac5f7785df0..b375dc0d1e9 100644 --- a/workspaces/common-libs/playwright-vscode-tester/src/browser.ts +++ b/workspaces/common-libs/playwright-vscode-tester/src/browser.ts @@ -17,9 +17,9 @@ export class VSBrowser { private profileName: string; private static _instance: VSBrowser; - constructor(codeVersion: string, releaseType: ReleaseQuality, private resources: string[], customSettings: object = {}, profileName?: string) { + constructor(codeVersion: string, releaseType: ReleaseQuality, private resources: string[], customSettings: object = {}, profileName?: string, extensionsFolder?: string) { this.storagePath = process.env.TEST_RESOURCES ? process.env.TEST_RESOURCES : os.tmpdir(); - this.extensionsFolder = process.env.EXTENSIONS_FOLDER ? process.env.EXTENSIONS_FOLDER : undefined; + this.extensionsFolder = extensionsFolder || (process.env.EXTENSIONS_FOLDER ? process.env.EXTENSIONS_FOLDER : undefined); this.customSettings = customSettings; this.codeVersion = codeVersion; this.releaseType = releaseType; @@ -58,6 +58,9 @@ export class VSBrowser { if (this.extensionsFolder) { args.push(`--extensions-dir=${this.extensionsFolder}`); + } else { + // If no extensions folder is specified, use a profile-specific one to ensure isolation + args.push(`--extensions-dir=${path.join(this.storagePath, 'settings', this.profileName, 'extensions')}`); } if (compareVersions(this.codeVersion, '1.39.0') < 0) { diff --git a/workspaces/common-libs/playwright-vscode-tester/src/codeUtil.ts b/workspaces/common-libs/playwright-vscode-tester/src/codeUtil.ts index 547040e73b0..b02f9eb661a 100644 --- a/workspaces/common-libs/playwright-vscode-tester/src/codeUtil.ts +++ b/workspaces/common-libs/playwright-vscode-tester/src/codeUtil.ts @@ -159,10 +159,12 @@ export class CodeUtil { } private installExt(pathOrID: string): void { - let command = `${this.cliEnv} "${this.executablePath}" "${this.cliPath}" --ms-enable-electron-run-as-node --force --install-extension "${pathOrID}"`; + let command = `${this.cliEnv} "${this.executablePath}" "${this.cliPath}" --ms-enable-electron-run-as-node --force --install-extension "${pathOrID}" --user-data-dir="${path.join(this.downloadFolder, 'settings', this.profileName, 'Code')}"`; if (this.extensionsFolder) { command += ` --extensions-dir=${this.extensionsFolder}`; } + // If no extensionsFolder is specified, extensions will be installed to the default location + // within the user data directory: {user-data-dir}/extensions/ child_process.execSync(command, { stdio: 'inherit' }); } @@ -214,10 +216,12 @@ export class CodeUtil { const extension = `${pjson.publisher}.${pjson.name}`; if (cleanup) { - let command = `${this.cliEnv} "${this.executablePath}" "${this.cliPath}" --ms-enable-electron-run-as-node --uninstall-extension "${extension}"`; + let command = `${this.cliEnv} "${this.executablePath}" "${this.cliPath}" --ms-enable-electron-run-as-node --uninstall-extension "${extension}" --user-data-dir="${path.join(this.downloadFolder, 'settings', this.profileName, 'Code')}"`; if (this.extensionsFolder) { command += ` --extensions-dir=${this.extensionsFolder}`; } + // If no extensionsFolder is specified, uninstall from the default location + // within the user data directory: {user-data-dir}/extensions/ child_process.execSync(command, { stdio: 'inherit' }); } } @@ -383,7 +387,7 @@ export class CodeUtil { const key = 'PATH'; finalEnv[key] = [this.downloadFolder, process.env[key]].join(path.delimiter); - const browser = new VSBrowser(literalVersion, this.releaseType, runOptions.resources, {}, this.profileName); + const browser = new VSBrowser(literalVersion, this.releaseType, runOptions.resources, {}, this.profileName, this.extensionsFolder); const launchArgs = await browser.getLaunchArgs() process.env = { From 65e1ecb028c20dfe31eba34177fee4567cb1a0b7 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Thu, 24 Jul 2025 12:19:49 +0530 Subject: [PATCH 096/349] Separate mcp tools logic from DropDown Editor --- .../src/components/editors/DropdownEditor.tsx | 146 ++---------------- .../components/editors/McpToolsSelection.tsx | 143 +++++++++++++++++ 2 files changed, 160 insertions(+), 129 deletions(-) create mode 100644 workspaces/ballerina/ballerina-side-panel/src/components/editors/McpToolsSelection.tsx diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx index 581a47d5b24..16c396a9320 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx @@ -25,6 +25,7 @@ import { FormField } from "../Form/types"; import { capitalize, getValueForDropdown } from "./utils"; import { useFormContext } from "../../context"; import { SubPanel, SubPanelView } from "@wso2/ballerina-core"; +import { McpToolsSelection, McpTool } from "./McpToolsSelection"; interface DropdownEditorProps { field: FormField; @@ -39,68 +40,6 @@ interface DropdownEditorProps { mcpTools?: { name: string; description?: string }[]; // <-- add this line } -const ToolsContainer = styled.div` - display: flex; - flex-direction: column; - gap: 8px; - margin-top: 12px; - padding: 12px; - border: 1px solid ${ThemeColors.OUTLINE_VARIANT}; - border-radius: 8px; -`; -const ToolsHeader = styled.div` - display: flex; - flex-direction: row; - align-items: center; - justify-content: space-between; - margin-bottom: 8px; -`; -const ToolsTitle = styled.div` - font-size: 14px; - font-family: GilmerBold; - color: ${ThemeColors.ON_SURFACE}; -`; -const ToolCheckboxContainer = styled.div` - display: flex; - flex-direction: column; - gap: 6px; - max-height: 200px; - overflow-y: auto; -`; -const ToolCheckboxItem = styled.div` - display: flex; - flex-direction: row; - align-items: center; - gap: 8px; - padding: 4px 0; -`; -const ErrorMessage = styled.div` - color: ${ThemeColors.ERROR}; - font-size: 12px; - margin-top: 4px; -`; -const LoadingMessage = styled.div` - color: ${ThemeColors.ON_SURFACE_VARIANT}; - font-size: 12px; - display: flex; - align-items: center; - gap: 8px; -`; -// Simple inline spinner for loading state -const InlineSpinner = styled.span` - display: inline-block; - width: 16px; - height: 16px; - border: 2px solid ${ThemeColors.ON_SURFACE_VARIANT}; - border-top: 2px solid transparent; - border-radius: 50%; - animation: spin 0.8s linear infinite; - @keyframes spin { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } - } -`; - const DropdownStack = styled.div` display: flex; flex-direction: column; @@ -128,11 +67,6 @@ export function DropdownEditor(props: DropdownEditorProps) { const [mcpToolsError, setMcpToolsError] = useState(""); const toolSelection = watch(field.key); const [localServiceUrl, setLocalServiceUrl] = useState(""); - const [localConfigs, setLocalConfigs] = useState({}); - const [editMode] = useState(false); - - // Debounce logic for serverUrl input - const debounceTimeout = useRef | null>(null); useEffect(() => { if (newServerUrl && newServerUrl !== localServiceUrl) { @@ -171,69 +105,13 @@ export function DropdownEditor(props: DropdownEditorProps) { // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedMcpTools]); - // Update renderToolsSelection to use props.mcpTools if provided - const renderToolsSelection = () => { - const tools = props.mcpTools ?? mcpTools; - if (toolSelection !== "Selected") { - return null; - } - - return ( - - - Available Tools - {tools.length > 0 && ( - - )} - - {loadingMcpTools && ( - - - Loading tools from MCP server... - - )} - {mcpToolsError && ( - {mcpToolsError} - )} - {tools.length > 0 && ( - - {tools.map((tool) => ( - - !loadingMcpTools && handleToolSelectionChange(tool.name, !selectedMcpTools.has(tool.name))} - > - -
-
{tool.name}
- {tool.description && ( -
- {tool.description} -
- )} -
-
- ))} -
- )} - {!loadingMcpTools && !mcpToolsError && tools.length === 0 && localServiceUrl.trim() && ( -
- No tools available from this MCP server -
- )} -
- ); - }; - const showScopeControls = field.key === "toolsToInclude"; + // HACK: create values for Scope field + if (field.key === "scope") { + field.items = ["Global", "Local"]; + } + if (showScopeControls) { return ( @@ -254,7 +132,17 @@ export function DropdownEditor(props: DropdownEditorProps) { addNewBtnClick={field.addNewButton ? () => openSubPanel({ view: SubPanelView.ADD_NEW_FORM }) : undefined} /> - {renderToolsSelection()} + {toolSelection === "Selected" && ( + + )} ); } diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/McpToolsSelection.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/McpToolsSelection.tsx new file mode 100644 index 00000000000..2fa7bbb7557 --- /dev/null +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/McpToolsSelection.tsx @@ -0,0 +1,143 @@ +import React from "react"; +import styled from "@emotion/styled"; +import { Button, CheckBox, ThemeColors } from "@wso2/ui-toolkit"; + +// Types for MCP tools +export interface McpTool { + name: string; + description?: string; +} + +interface McpToolsSelectionProps { + tools: McpTool[]; + selectedTools: Set; + loading: boolean; + error: string; + onToolSelectionChange: (toolName: string, isSelected: boolean) => void; + onSelectAll: () => void; + serviceUrl?: string; +} + +const ToolsContainer = styled.div` + display: flex; + flex-direction: column; + gap: 8px; + margin-top: 12px; + padding: 12px; + border: 1px solid ${ThemeColors.OUTLINE_VARIANT}; + border-radius: 8px; +`; +const ToolsHeader = styled.div` + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + margin-bottom: 8px; +`; +const ToolsTitle = styled.div` + font-size: 14px; + font-family: GilmerBold; + color: ${ThemeColors.ON_SURFACE}; +`; +const ToolCheckboxContainer = styled.div` + display: flex; + flex-direction: column; + gap: 6px; + max-height: 200px; + overflow-y: auto; +`; +const ToolCheckboxItem = styled.div` + display: flex; + flex-direction: row; + align-items: center; + gap: 8px; + padding: 4px 0; +`; +const ErrorMessage = styled.div` + color: ${ThemeColors.ERROR}; + font-size: 12px; + margin-top: 4px; +`; +const LoadingMessage = styled.div` + color: ${ThemeColors.ON_SURFACE_VARIANT}; + font-size: 12px; + display: flex; + align-items: center; + gap: 8px; +`; +const InlineSpinner = styled.span` + display: inline-block; + width: 16px; + height: 16px; + border: 2px solid ${ThemeColors.ON_SURFACE_VARIANT}; + border-top: 2px solid transparent; + border-radius: 50%; + animation: spin 0.8s linear infinite; + @keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } + } +`; + +export const McpToolsSelection: React.FC = ({ + tools, + selectedTools, + loading, + error, + onToolSelectionChange, + onSelectAll, + serviceUrl +}) => { + return ( + + + Available Tools + {tools.length > 0 && ( + + )} + + {loading && ( + + + Loading tools from MCP server... + + )} + {error && ( + {error} + )} + {tools.length > 0 && ( + + {tools.map((tool) => ( + + !loading && onToolSelectionChange(tool.name, !selectedTools.has(tool.name))} + > + +
+
{tool.name}
+ {tool.description && ( +
+ {tool.description} +
+ )} +
+
+ ))} +
+ )} + {!loading && !error && tools.length === 0 && serviceUrl?.trim() && ( +
+ No tools available from this MCP server +
+ )} +
+ ); +}; From 35e0cafa04fa1af39ccbf954202e1431d025aa8c Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Thu, 24 Jul 2025 12:22:19 +0530 Subject: [PATCH 097/349] Add missing license header --- .../components/editors/McpToolsSelection.tsx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/McpToolsSelection.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/McpToolsSelection.tsx index 2fa7bbb7557..257cfbd4a52 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/McpToolsSelection.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/McpToolsSelection.tsx @@ -1,3 +1,21 @@ +/** + * 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 React from "react"; import styled from "@emotion/styled"; import { Button, CheckBox, ThemeColors } from "@wso2/ui-toolkit"; From 8e629490b3bfbac066c02fa660b03e11abfc58ea Mon Sep 17 00:00:00 2001 From: tharindulak Date: Thu, 24 Jul 2025 14:29:45 +0530 Subject: [PATCH 098/349] Run trvivy scan report in wokflow --- .github/workflows/build.yml | 52 +++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cfa48d64021..b1b6843ff36 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -167,6 +167,58 @@ jobs: PLATFORM_DEV_GHAPP_CLIENT_ID: ${{ secrets.PLATFORM_DEV_GHAPP_CLIENT_ID }} PLATFORM_DEV_DEVANT_ASGARDEO_CLIENT_ID: ${{ secrets.PLATFORM_DEV_DEVANT_ASGARDEO_CLIENT_ID }} + Security_Scan: + name: Security vulnerability scan + needs: Build_Stage + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - name: Restore build + uses: actions/download-artifact@v4 + with: + name: ExtBuild + path: ./ + + - name: Set up workspace + run: | + unzip build.zip + rm build.zip + + - name: Setup Rush + uses: gigara/setup-rush@v1.2.0 + with: + pnpm: 10.10.0 + node: 22.x + rush-install: true + + - name: Run Trivy vulnerability scanner + uses: aquasecurity/trivy-action@master + with: + scan-type: 'fs' + scan-ref: '.' + format: 'sarif' + output: 'trivy-results.sarif' + skip-dirs: 'common/temp' + timeout: '10m' + severity: 'CRITICAL,HIGH,MEDIUM,LOW' + exit-code: '1' + + - name: Upload Trivy scan results to GitHub Security tab + uses: github/codeql-action/upload-sarif@v3 + if: always() + with: + sarif_file: 'trivy-results.sarif' + + - name: Run Trivy scanner for table output + uses: aquasecurity/trivy-action@master + with: + scan-type: 'fs' + scan-ref: '.' + format: 'table' + skip-dirs: 'common/temp' + timeout: '10m' + severity: 'CRITICAL,HIGH,MEDIUM,LOW' + ExtTest_Ballerina: name: Run Ballerina extension tests needs: Build_Stage From 02a0c279d8ab4868ce646f2ee54b0c3afc0ef4f2 Mon Sep 17 00:00:00 2001 From: tharindulak Date: Thu, 24 Jul 2025 15:12:02 +0530 Subject: [PATCH 099/349] Add test vulnerability --- package.json | 3 + pnpm-lock.yaml | 157 +++++++++++++++++++++++++++---------------------- 2 files changed, 89 insertions(+), 71 deletions(-) diff --git a/package.json b/package.json index 3cdf1ca4b8f..fd74b2bc4a2 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,9 @@ "form-data": "^4.0.4" } }, + "dependencies": { + "axios": "0.21.0" + }, "scripts": { "prebuild": "pnpm run init-submodules && rush install", "init-submodules": "git submodule update --init --recursive && git submodule foreach git pull origin master", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 14cfcd65e87..65055fed6da 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,7 +20,11 @@ overrides: importers: - .: {} + .: + dependencies: + axios: + specifier: 0.21.0 + version: 0.21.0 workspaces/ballerina/ballerina-core: dependencies: @@ -809,7 +813,7 @@ importers: version: 1.57.5 '@types/webpack': specifier: ^5.28.5 - version: 5.28.5(webpack-cli@4.10.0) + 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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) @@ -851,10 +855,10 @@ importers: version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.100.2(webpack-cli@4.10.0) + version: 5.100.2(webpack-cli@5.1.4) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@4.10.0)(webpack@5.100.2) + version: 5.2.2(webpack-cli@5.1.4)(webpack@5.100.2) workspaces/ballerina/bi-diagram: dependencies: @@ -1484,9 +1488,6 @@ importers: '@wso2/ballerina-rpc-client': specifier: workspace:* version: link:../ballerina-rpc-client - '@wso2/syntax-tree': - specifier: workspace:* - version: link:../syntax-tree '@wso2/ui-toolkit': specifier: workspace:* version: link:../../common-libs/ui-toolkit @@ -10633,6 +10634,10 @@ packages: resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} engines: {node: '>=4'} + axios@0.21.0: + resolution: {integrity: sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==} + deprecated: Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410 + axios@1.9.0: resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} @@ -25456,7 +25461,10 @@ snapshots: jest-runner: 25.5.4 jest-runtime: 25.5.4 transitivePeerDependencies: + - bufferutil + - canvas - supports-color + - utf-8-validate '@jest/test-sequencer@29.7.0': dependencies: @@ -26030,7 +26038,7 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.2 source-map: 0.7.4 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: '@types/webpack': 5.28.5 type-fest: 4.41.0 @@ -28557,7 +28565,7 @@ snapshots: ts-dedent: 2.2.0 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) webpack-dev-middleware: 3.7.3(webpack@5.100.2) webpack-filter-warnings-plugin: 1.2.1(webpack@5.100.2) webpack-hot-middleware: 2.26.1 @@ -28620,7 +28628,7 @@ snapshots: ts-dedent: 2.2.0 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) webpack-dev-middleware: 3.7.3(webpack@5.100.2) webpack-filter-warnings-plugin: 1.2.1(webpack@5.100.2) webpack-hot-middleware: 2.26.1 @@ -28746,7 +28754,7 @@ snapshots: ts-dedent: 2.2.0 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) webpack-dev-middleware: 3.7.3(webpack@5.100.2) webpack-filter-warnings-plugin: 1.2.1(webpack@5.100.2) webpack-hot-middleware: 2.26.1 @@ -28955,7 +28963,7 @@ snapshots: url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) webpack-dev-middleware: 6.1.3(webpack@5.100.2) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 @@ -29328,7 +29336,7 @@ snapshots: ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.3 @@ -29356,7 +29364,7 @@ snapshots: ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: typescript: 4.9.5 @@ -29483,7 +29491,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -29548,7 +29556,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -29743,7 +29751,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -30005,7 +30013,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.4.4 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) ws: 8.18.2 x-default-browser: 0.4.0 optionalDependencies: @@ -30070,7 +30078,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.4.4 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) ws: 8.18.2 x-default-browser: 0.4.0 optionalDependencies: @@ -30135,7 +30143,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.4.4 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) ws: 8.18.2 x-default-browser: 0.4.0 optionalDependencies: @@ -30279,7 +30287,7 @@ snapshots: '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.4.2))(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.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -30302,7 +30310,7 @@ snapshots: '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -30325,7 +30333,7 @@ snapshots: '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -30628,7 +30636,7 @@ snapshots: ts-dedent: 2.2.0 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) webpack-dev-middleware: 3.7.3(webpack@5.100.2) webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -30680,7 +30688,7 @@ snapshots: ts-dedent: 2.2.0 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) webpack-dev-middleware: 3.7.3(webpack@5.100.2) webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -30784,7 +30792,7 @@ snapshots: ts-dedent: 2.2.0 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) webpack-dev-middleware: 3.7.3(webpack@5.100.2) webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -31038,7 +31046,7 @@ snapshots: semver: 7.7.2 storybook: 8.6.14(prettier@3.6.2) tsconfig-paths: 4.2.0 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -31171,7 +31179,7 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@4.9.5) tslib: 2.8.1 typescript: 4.9.5 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) transitivePeerDependencies: - supports-color @@ -31185,7 +31193,7 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) transitivePeerDependencies: - supports-color @@ -31213,7 +31221,7 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) transitivePeerDependencies: - supports-color @@ -31514,7 +31522,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.28.0 typescript: 5.8.3 @@ -31577,7 +31585,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.28.0 typescript: 5.8.3 @@ -31640,7 +31648,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.28.0 typescript: 4.9.5 @@ -33188,7 +33196,7 @@ snapshots: dependencies: '@types/node': 22.15.32 tapable: 2.2.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -33229,6 +33237,7 @@ snapshots: - esbuild - uglify-js - webpack-cli + optional: true '@types/webpack@5.28.5(webpack-cli@5.1.4)': dependencies: @@ -33240,7 +33249,6 @@ snapshots: - esbuild - uglify-js - webpack-cli - optional: true '@types/webpack@5.28.5(webpack-cli@6.0.1)': dependencies: @@ -34164,7 +34172,7 @@ snapshots: '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.100.2)': dependencies: webpack: 5.100.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.100.2) + webpack-cli: 5.1.4(webpack@5.100.2) '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.100.2)': dependencies: @@ -34179,7 +34187,7 @@ snapshots: '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.100.2)': dependencies: webpack: 5.100.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.100.2) + webpack-cli: 5.1.4(webpack@5.100.2) '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.100.2)': dependencies: @@ -34768,6 +34776,12 @@ snapshots: axe-core@4.10.3: {} + axios@0.21.0: + dependencies: + follow-redirects: 1.15.9 + transitivePeerDependencies: + - debug + axios@1.9.0: dependencies: follow-redirects: 1.15.9 @@ -34982,7 +34996,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 find-up: 5.0.0 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.4))(webpack@5.100.2): dependencies: @@ -34998,7 +35012,7 @@ snapshots: find-cache-dir: 1.0.0 loader-utils: 1.4.2 mkdirp: 0.5.6 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) babel-loader@8.4.1(@babel/core@7.27.4)(webpack@5.100.2): dependencies: @@ -35007,7 +35021,7 @@ snapshots: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) babel-loader@9.2.1(@babel/core@7.27.4)(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)): dependencies: @@ -36790,7 +36804,7 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.1 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) css-loader@5.2.7(webpack@5.100.2): dependencies: @@ -36804,7 +36818,7 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 3.3.0 semver: 7.7.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) css-loader@6.11.0(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)): dependencies: @@ -36843,7 +36857,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.2 optionalDependencies: - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) css-select@4.3.0: dependencies: @@ -37846,7 +37860,7 @@ snapshots: eslint: 6.8.0 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@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@6.8.0)(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(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(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(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)(typescript@3.9.10): + eslint-config-react-app@5.2.1(@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@6.8.0)(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(babel-eslint@10.1.0(eslint@9.27.0(jiti@2.4.2)))(eslint-plugin-flowtype@3.13.0(eslint@9.27.0(jiti@2.4.2)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2)))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.27.0(jiti@2.4.2)))(eslint-plugin-react-hooks@2.5.1(eslint@6.8.0))(eslint-plugin-react@7.37.5(eslint@9.27.0(jiti@2.4.2)))(eslint@6.8.0)(typescript@3.9.10): dependencies: '@typescript-eslint/eslint-plugin': 2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@6.8.0)(typescript@3.9.10) '@typescript-eslint/parser': 2.34.0(eslint@6.8.0)(typescript@3.9.10) @@ -38940,7 +38954,7 @@ snapshots: lodash.startswith: 4.2.1 minimatch: 3.1.2 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: eslint: 9.26.0(jiti@2.4.2) @@ -38968,7 +38982,7 @@ snapshots: semver: 5.7.2 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) worker-rpc: 0.1.1 optionalDependencies: eslint: 9.26.0(jiti@2.4.2) @@ -38982,7 +38996,7 @@ snapshots: semver: 5.7.2 tapable: 1.1.3 typescript: 4.9.5 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) worker-rpc: 0.1.1 optionalDependencies: eslint: 9.27.0(jiti@2.4.2) @@ -38996,7 +39010,7 @@ snapshots: semver: 5.7.2 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) worker-rpc: 0.1.1 optionalDependencies: eslint: 9.27.0(jiti@2.4.2) @@ -39017,7 +39031,7 @@ snapshots: semver: 7.7.2 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: eslint: 9.26.0(jiti@2.4.2) @@ -39037,7 +39051,7 @@ snapshots: semver: 7.7.2 tapable: 1.1.3 typescript: 4.9.5 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: eslint: 9.27.0(jiti@2.4.2) @@ -39057,7 +39071,7 @@ snapshots: semver: 7.7.2 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) optionalDependencies: eslint: 9.27.0(jiti@2.4.2) @@ -40053,7 +40067,7 @@ snapshots: pretty-error: 2.1.2 tapable: 1.1.3 util.promisify: 1.0.0 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) html-webpack-plugin@5.6.3(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)): dependencies: @@ -40073,7 +40087,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.2 optionalDependencies: - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) htmlparser2@10.0.0: dependencies: @@ -44731,7 +44745,7 @@ snapshots: postcss: 7.0.39 schema-utils: 3.3.0 semver: 7.7.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) postcss-loader@8.1.1(postcss@8.5.6)(typescript@5.8.3)(webpack@5.100.2): dependencies: @@ -45379,7 +45393,7 @@ snapshots: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) rc-config-loader@4.1.3: dependencies: @@ -45918,7 +45932,7 @@ snapshots: typescript: 5.8.3 uglifyjs-webpack-plugin: 1.2.5(webpack@5.100.2) url-loader: 0.6.2(file-loader@1.1.5(webpack@5.100.2)) - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) webpack-dev-server: 5.2.2(webpack@5.100.2) webpack-manifest-plugin: 1.3.2(webpack@5.100.2) whatwg-fetch: 2.0.3 @@ -47204,7 +47218,7 @@ snapshots: dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) source-map-resolve@0.6.0: dependencies: @@ -47647,13 +47661,13 @@ snapshots: dependencies: loader-utils: 2.0.4 schema-utils: 2.7.1 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) style-loader@2.0.0(webpack@5.100.2): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) style-loader@3.3.4(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)): dependencies: @@ -47665,7 +47679,7 @@ snapshots: style-loader@4.0.0(webpack@5.100.2): dependencies: - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) style-mod@4.1.2: {} @@ -48177,7 +48191,7 @@ snapshots: serialize-javascript: 5.0.1 source-map: 0.6.1 terser: 5.43.1 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) webpack-sources: 1.4.3 transitivePeerDependencies: - bluebird @@ -48212,7 +48226,7 @@ snapshots: schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.43.1 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) terser@4.8.1: dependencies: @@ -48538,7 +48552,7 @@ snapshots: semver: 7.7.2 source-map: 0.7.4 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) ts-mixer@6.0.4: {} @@ -48609,7 +48623,7 @@ snapshots: 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@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@6.8.0)(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(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(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(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)(typescript@3.9.10) + eslint-config-react-app: 5.2.1(@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@6.8.0)(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(babel-eslint@10.1.0(eslint@9.27.0(jiti@2.4.2)))(eslint-plugin-flowtype@3.13.0(eslint@9.27.0(jiti@2.4.2)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2)))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.27.0(jiti@2.4.2)))(eslint-plugin-react-hooks@2.5.1(eslint@6.8.0))(eslint-plugin-react@7.37.5(eslint@9.27.0(jiti@2.4.2)))(eslint@6.8.0)(typescript@3.9.10) eslint-plugin-flowtype: 3.13.0(eslint@6.8.0) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@6.8.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@6.8.0) @@ -49231,7 +49245,7 @@ snapshots: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) optionalDependencies: file-loader: 6.2.0(webpack@5.100.2) @@ -49762,7 +49776,7 @@ snapshots: mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) webpack-log: 2.0.0 webpack-dev-middleware@4.3.0(webpack@5.100.2): @@ -49773,7 +49787,7 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 3.3.0 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) webpack-dev-middleware@6.1.3(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)): dependencies: @@ -49816,7 +49830,7 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.2 optionalDependencies: - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) webpack-dev-server@5.2.2(webpack-cli@4.10.0)(webpack@5.100.2): dependencies: @@ -49856,6 +49870,7 @@ snapshots: - debug - supports-color - utf-8-validate + optional: true webpack-dev-server@5.2.2(webpack-cli@5.1.4)(webpack@5.100.2): dependencies: @@ -50005,7 +50020,7 @@ snapshots: webpack-dev-middleware: 7.4.2(webpack@5.100.2) ws: 8.18.2 optionalDependencies: - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(webpack-cli@5.1.4) transitivePeerDependencies: - bufferutil - debug @@ -50014,7 +50029,7 @@ snapshots: webpack-filter-warnings-plugin@1.2.1(webpack@5.100.2): dependencies: - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) webpack-hot-middleware@2.26.1: dependencies: @@ -50203,7 +50218,7 @@ snapshots: watchpack: 2.4.4 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.100.2) + webpack-cli: 5.1.4(webpack@5.100.2) transitivePeerDependencies: - '@swc/core' - esbuild From cdc58d25bd7209442d3adfa2d41e8fddd16adf84 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Thu, 24 Jul 2025 16:45:33 +0530 Subject: [PATCH 100/349] Fix applying advance configs to mcp toolkits --- .../src/rpc-managers/ai-agent/rpc-manager.ts | 12 ++++++++--- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 21 +++++++++++++------ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts index cb21897d746..97a7459737e 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts @@ -430,9 +430,15 @@ export class AiAgentRpcManager implements AIAgentAPI { } }); - nodeTemplate.flowNode.properties["serverUrl"] = params.updatedNode.properties["serverUrl"]; - nodeTemplate.flowNode.properties["info"] = params.updatedNode.properties["info"]; - nodeTemplate.flowNode.properties["variable"].value = params.updatedNode.properties["variable"].value; + // Map all properties from updatedNode to nodeTemplate.flowNode + for (const key in params.updatedNode.properties) { + if (key === "type") { + continue; + } + if (nodeTemplate.flowNode.properties.hasOwnProperty(key)) { + nodeTemplate.flowNode.properties[key].value = params.updatedNode.properties[key].value; + } + } if (params.selectedTools.length === 0) { (nodeTemplate.flowNode.properties["permittedTools"] as { value: any }).value = `()`; } else { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index 36288519026..52aff58534c 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -221,7 +221,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { const { agentCallNode, onAddMcpServer, onSave, editMode = false } = props; console.log(">>> Add Mcp Server props", props); const { rpcClient } = useRpcContext(); - const [mcpToolkitCount, setMcpToolkitCount] = useState(1); + const [mcpToolkitCount, setMcpToolkitCount] = useState(0); const [agentNode, setAgentNode] = useState(null); const [existingTools, setExistingTools] = useState([]); const [toolsStringList, setToolsStringList] = useState(""); @@ -507,6 +507,8 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { ) => { console.log(">>> selected tools", selectedTools) console.log("All submitted form values:", rawFormValues); + console.log("handle on save node:", node); + // Use the same logic as the display to determine the name let finalName; if (name.trim() !== "") { @@ -523,6 +525,18 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { selectedTools: selectedTools, mcpTools }; + // Update node.properties so that each key is an object with a value property + if (rawFormValues && node && node.properties) { + const props = node.properties as Record; + Object.entries(rawFormValues).forEach(([key, value]) => { + if (props[key] && typeof props[key] === "object" && "value" in props[key]) { + props[key].value = value; + } else { + props[key] = { value }; + } + }); + node.properties = props; + } console.log(">>> Saving with payload:", payload); setSavingForm(true); @@ -656,11 +670,6 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { }; console.log(">>> agentNode", agentCallNode); - const DropdownContainer = styled.div` - width: 100%; -`; - - const fieldVal = { key: "scope", advanced: false, From 46e54e4ffaf47c6d9e24936c5313bd3d433ef6b8 Mon Sep 17 00:00:00 2001 From: Azeem Muzammil Date: Thu, 24 Jul 2025 17:33:14 +0530 Subject: [PATCH 101/349] Fix logout on token expiry --- rush.json | 10 +-- .../src/features/ai/service/connection.ts | 70 +++++++++++-------- .../src/rpc-managers/ai-panel/rpc-manager.ts | 2 +- .../src/rpc-managers/ai-panel/utils.ts | 6 +- .../ballerina-extension/src/utils/ai/auth.ts | 14 +++- .../src/views/ai-panel/aiMachine.ts | 2 +- .../src/views/ai-panel/utils.ts | 13 ++-- 7 files changed, 65 insertions(+), 52 deletions(-) diff --git a/rush.json b/rush.json index f600b8dc962..5599eccfe76 100644 --- a/rush.json +++ b/rush.json @@ -425,11 +425,11 @@ "projectFolder": "workspaces/wso2-platform/wso2-platform-extension", "versionPolicyName": "wso2-platform-extension" }, - { - "packageName": "@wso2/wso2-platform-vscode-webviews", - "projectFolder": "workspaces/wso2-platform/wso2-platform-webviews", - "versionPolicyName": "wso2-platform-extension" - }, + // { + // "packageName": "@wso2/wso2-platform-vscode-webviews", + // "projectFolder": "workspaces/wso2-platform/wso2-platform-webviews", + // "versionPolicyName": "wso2-platform-extension" + // }, { "packageName": "@wso2/choreo-core", "projectFolder": "workspaces/choreo/choreo-core", diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts index 67894d9867c..01553b83af6 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts @@ -15,7 +15,7 @@ // under the License. import { createAnthropic } from "@ai-sdk/anthropic"; -import { getAccessToken, getRefreshedAccessToken } from "../../../utils/ai/auth"; +import { getAccessToken, getLoginMethod, getRefreshedAccessToken } from "../../../utils/ai/auth"; import { AIStateMachine } from "../../../views/ai-panel/aiMachine"; import { BACKEND_URL } from "../utils"; import { AIMachineEventType, LoginMethod } from "@wso2/ballerina-core"; @@ -38,37 +38,44 @@ let cachedAuthMethod: LoginMethod | null = null; * @param options - Fetch options * @returns Promise */ -export async function fetchWithAuth(input: string | URL | Request, options: RequestInit = {}): Promise { - const accessToken = await getAccessToken(); - - // Ensure headers object exists - options.headers = { - ...options.headers, - 'Authorization': `Bearer ${accessToken.token}`, - 'User-Agent': 'Ballerina-VSCode-Plugin', - 'Connection': 'keep-alive', - }; - - let response = await fetch(input, options); - console.log("Response status: ", response.status); - - // Handle token expiration - if (response.status === 401) { - console.log("Token expired. Refreshing token..."); - const newToken = await getRefreshedAccessToken(); - if (newToken) { - options.headers = { - ...options.headers, - 'Authorization': `Bearer ${newToken}`, - }; - response = await fetch(input, options); - } else { +export async function fetchWithAuth(input: string | URL | Request, options: RequestInit = {}): Promise { + try { + const accessToken = await getAccessToken(); + + // Ensure headers object exists + options.headers = { + ...options.headers, + 'Authorization': `Bearer ${accessToken}`, + 'User-Agent': 'Ballerina-VSCode-Plugin', + 'Connection': 'keep-alive', + }; + + let response = await fetch(input, options); + console.log("Response status: ", response.status); + + // Handle token expiration + if (response.status === 401) { + console.log("Token expired. Refreshing token..."); + const newToken = await getRefreshedAccessToken(); + if (newToken) { + options.headers = { + ...options.headers, + 'Authorization': `Bearer ${newToken}`, + }; + response = await fetch(input, options); + } else { + AIStateMachine.service().send(AIMachineEventType.LOGOUT); + return; + } + } + + return response; + } catch (error: any) { + if (error?.message === "TOKEN_EXPIRED") { AIStateMachine.service().send(AIMachineEventType.LOGOUT); - throw new Error('Authentication failed: Unable to refresh token'); } + return; } - - return response; } /** @@ -76,7 +83,7 @@ export async function fetchWithAuth(input: string | URL | Request, options: Requ * Re-initializes the client if the login method has changed. */ export const getAnthropicClient = async (model: AnthropicModel) => { - const { token, loginMethod } = await getAccessToken(); + const loginMethod = await getLoginMethod(); // Recreate client if login method has changed or no cached instance if (!cachedAnthropic || cachedAuthMethod !== loginMethod) { @@ -87,9 +94,10 @@ export const getAnthropicClient = async (model: AnthropicModel) => { fetch: fetchWithAuth, }); } else if (loginMethod === LoginMethod.ANTHROPIC_KEY) { + const apiKey = await getAccessToken(); cachedAnthropic = createAnthropic({ baseURL: "https://api.anthropic.com/v1", - apiKey: token, + apiKey: apiKey, }); } else { throw new Error(`Unsupported login method: ${loginMethod}`); 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 c3e1df1079f..c1fcd68d602 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 @@ -147,7 +147,7 @@ export class AiPanelRpcManager implements AIPanelAPI { reject(new Error("Access Token is undefined")); return; } - resolve(accessToken.token); + resolve(accessToken); } catch (error) { reject(error); } 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 d063e0003e1..8d4a5da89ad 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 @@ -1300,11 +1300,7 @@ export async function getDatamapperCode(parameterDefinitions: ErrorCode | Parame console.error(error); return NOT_LOGGED_IN; }); - const tokenOrError: string | ErrorCode = - typeof accessToken === 'object' && 'token' in accessToken - ? accessToken.token - : accessToken; - let response: DatamapperResponse = await sendDatamapperRequest(parameterDefinitions, tokenOrError); + let response: DatamapperResponse = await sendDatamapperRequest(parameterDefinitions, accessToken); let intermediateMapping = response.mappings; let finalCode = await generateBallerinaCode(intermediateMapping, parameterDefinitions, "", nestedKeyArray); diff --git a/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts b/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts index 06d32e5f2fa..65393877d2a 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts @@ -146,7 +146,15 @@ export const clearAuthCredentials = async (): Promise => { // ================================== // BI Copilot Auth Utils // ================================== -export const getAccessToken = async (): Promise<{ token: string, loginMethod: LoginMethod } | undefined> => { +export const getLoginMethod = async (): Promise => { + const credentials = await getAuthCredentials(); + if (credentials) { + return credentials.loginMethod; + } + return undefined; +}; + +export const getAccessToken = async (): Promise => { return new Promise(async (resolve, reject) => { try { const credentials = await getAuthCredentials(); @@ -164,7 +172,7 @@ export const getAccessToken = async (): Promise<{ token: string, loginMethod: Lo if (decoded.exp && decoded.exp < now) { finalToken = await getRefreshedAccessToken(); } - resolve({ token: finalToken, loginMethod: LoginMethod.BI_INTEL }); + resolve(finalToken); return; } catch (err) { if (axios.isAxiosError(err)) { @@ -179,7 +187,7 @@ export const getAccessToken = async (): Promise<{ token: string, loginMethod: Lo } case LoginMethod.ANTHROPIC_KEY: - resolve({ token: credentials.secrets.apiKey, loginMethod: LoginMethod.ANTHROPIC_KEY }); + resolve(credentials.secrets.apiKey); return; default: 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 fb185e9b5a8..cd22228ef0c 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/aiMachine.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/aiMachine.ts @@ -296,7 +296,7 @@ const getTokenAfterAuth = async () => { throw new Error('No authentication credentials found'); } return { token: result, loginMethod: LoginMethod.BI_INTEL }; -} +}; const aiStateService = interpret(aiMachine.withConfig({ services: { 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 b68b2c5b76d..a0920213486 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/utils.ts @@ -22,7 +22,7 @@ import { createAnthropic } from '@ai-sdk/anthropic'; import { generateText } from 'ai'; import { getAuthUrl, getLogoutUrl } from './auth'; import { extension } from '../../BalExtensionContext'; -import { getAccessToken, clearAuthCredentials, storeAuthCredentials } from '../../utils/ai/auth'; +import { getAccessToken, clearAuthCredentials, storeAuthCredentials, getLoginMethod } from '../../utils/ai/auth'; const LEGACY_ACCESS_TOKEN_SECRET_KEY = 'BallerinaAIUser'; const LEGACY_REFRESH_TOKEN_SECRET_KEY = 'BallerinaAIRefreshToken'; @@ -33,12 +33,13 @@ export const checkToken = async (): Promise<{ token: string; loginMethod: LoginM // Clean up any legacy tokens on initialization await cleanupLegacyTokens(); - const result = await getAccessToken(); - if (!result) { + const token = await getAccessToken(); + const loginMethod = await getLoginMethod(); + if (!token || !loginMethod) { resolve(undefined); return; } - resolve({ token: result.token, loginMethod: result.loginMethod }); + resolve({ token, loginMethod }); } catch (error) { reject(error); } @@ -62,8 +63,8 @@ const cleanupLegacyTokens = async (): Promise => { export const logout = async (isUserLogout: boolean = true) => { // For user-initiated logout, check if we need to redirect to SSO logout if (isUserLogout) { - const result = await getAccessToken(); - if (result && result.loginMethod === LoginMethod.BI_INTEL) { + const { token, loginMethod } = await checkToken(); + if (token && loginMethod === LoginMethod.BI_INTEL) { const logoutURL = getLogoutUrl(); vscode.env.openExternal(vscode.Uri.parse(logoutURL)); } From c1cfe62e4ccc7696360cba58a693a7fe267de4d7 Mon Sep 17 00:00:00 2001 From: Azeem Muzammil Date: Thu, 24 Jul 2025 17:34:10 +0530 Subject: [PATCH 102/349] Revert rush.json changes --- rush.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rush.json b/rush.json index 5599eccfe76..f600b8dc962 100644 --- a/rush.json +++ b/rush.json @@ -425,11 +425,11 @@ "projectFolder": "workspaces/wso2-platform/wso2-platform-extension", "versionPolicyName": "wso2-platform-extension" }, - // { - // "packageName": "@wso2/wso2-platform-vscode-webviews", - // "projectFolder": "workspaces/wso2-platform/wso2-platform-webviews", - // "versionPolicyName": "wso2-platform-extension" - // }, + { + "packageName": "@wso2/wso2-platform-vscode-webviews", + "projectFolder": "workspaces/wso2-platform/wso2-platform-webviews", + "versionPolicyName": "wso2-platform-extension" + }, { "packageName": "@wso2/choreo-core", "projectFolder": "workspaces/choreo/choreo-core", From 2869ca127695e42b1cf70a5424050b393e332a2b Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Thu, 24 Jul 2025 17:04:09 +0530 Subject: [PATCH 103/349] Add RAG construct fetch rpc methods --- .../ballerina-core/src/interfaces/bi.ts | 9 ++ .../src/rpc-types/bi-diagram/index.ts | 4 + .../src/rpc-types/bi-diagram/rpc-type.ts | 4 + .../src/core/extended-language-client.ts | 20 +++++ .../rpc-managers/bi-diagram/rpc-handler.ts | 8 ++ .../rpc-managers/bi-diagram/rpc-manager.ts | 83 +++++++++++++++++-- .../src/rpc-clients/bi-diagram/rpc-client.ts | 23 ++++- .../src/components/NodeIcon/index.tsx | 5 ++ 8 files changed, 148 insertions(+), 8 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts index 44e92672050..c3c73dabb45 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts @@ -234,6 +234,7 @@ export enum DIRECTORY_MAP { FUNCTION = "FUNCTION", LISTENER = "LISTENER", LOCAL_CONNECTORS = "localConnectors", + MODEL_PROVIDER = "MODEL_PROVIDER", NP_FUNCTION = "NP_FUNCTION", REMOTE = "REMOTE", RESOURCE = "RESOURCE", @@ -375,6 +376,14 @@ export type NodeKind = | "LOCK" | "LV_EXPRESSION" | "MATCH" + | "MODEL_PROVIDER" + | "VECTOR_STORE" + | "VECTOR_KNOWLEDGE_BASE" + | "EMBEDDING_PROVIDER" + | "MODEL_PROVIDERS" + | "VECTOR_STORES" + | "VECTOR_KNOWLEDGE_BASES" + | "EMBEDDING_PROVIDERS" | "NEW_CONNECTION" | "NEW_DATA" | "NP_FUNCTION" 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 9e0d9250ac6..8018c78d59a 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 @@ -119,6 +119,10 @@ export interface BIDiagramAPI { deleteFlowNode: (params: BISourceCodeRequest) => Promise; deleteByComponentInfo: (params: BIDeleteByComponentInfoRequest) => Promise; getAvailableNodes: (params: BIAvailableNodesRequest) => Promise; + getAvailableModelProviders: (params: BIAvailableNodesRequest) => Promise; + getAvailableVectorStores: (params: BIAvailableNodesRequest) => Promise; + getAvailableEmbeddingProviders: (params: BIAvailableNodesRequest) => Promise; + getAvailableVectorKnowledgeBases: (params: BIAvailableNodesRequest) => Promise; getEnclosedFunction: (params: BIGetEnclosedFunctionRequest) => Promise; getNodeTemplate: (params: BINodeTemplateRequest) => Promise; getAiSuggestions: (params: BIAiSuggestionsRequest) => Promise; 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 ffc81232a22..91ee5a70a44 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 @@ -121,6 +121,10 @@ export const getSourceCode: RequestType = { method: `${_preFix}/deleteFlowNode` }; export const deleteByComponentInfo: RequestType = { method: `${_preFix}/deleteByComponentInfo` }; export const getAvailableNodes: RequestType = { method: `${_preFix}/getAvailableNodes` }; +export const getAvailableModelProviders: RequestType = { method: `${_preFix}/getAvailableModelProviders` }; +export const getAvailableVectorStores: RequestType = { method: `${_preFix}/getAvailableVectorStores` }; +export const getAvailableEmbeddingProviders: RequestType = { method: `${_preFix}/getAvailableEmbeddingProviders` }; +export const getAvailableVectorKnowledgeBases: RequestType = { method: `${_preFix}/getAvailableVectorKnowledgeBases` }; export const getEnclosedFunction: RequestType = { method: `${_preFix}/getEnclosedFunction` }; export const getNodeTemplate: RequestType = { method: `${_preFix}/getNodeTemplate` }; export const getAiSuggestions: RequestType = { method: `${_preFix}/getAiSuggestions` }; 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 545294b9a82..2d592e2022d 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts @@ -301,6 +301,10 @@ enum EXTENDED_APIS { BI_DELETE_NODE = 'flowDesignService/deleteFlowNode', BI_DELETE_BY_COMPONENT_INFO = 'flowDesignService/deleteComponent', BI_AVAILABLE_NODES = 'flowDesignService/getAvailableNodes', + BI_AVAILABLE_MODEL_PROVIDERS = 'flowDesignService/getAvailableModelProviders', + BI_AVAILABLE_VECTOR_STORES = 'flowDesignService/getAvailableVectorStores', + BI_AVAILABLE_EMBEDDING_PROVIDERS = 'flowDesignService/getAvailableEmbeddingProviders', + BI_AVAILABLE_VECTOR_KNOWLEDGE_BASES = 'flowDesignService/getAvailableVectorKnowledgeBases', BI_NODE_TEMPLATE = 'flowDesignService/getNodeTemplate', BI_GEN_OPEN_API = 'flowDesignService/generateServiceFromOpenApiContract', BI_MODULE_NODES = 'flowDesignService/getModuleNodes', @@ -881,6 +885,22 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest(EXTENDED_APIS.BI_AVAILABLE_NODES, params); } + async getAvailableModelProviders(params: BIAvailableNodesRequest): Promise { + return this.sendRequest(EXTENDED_APIS.BI_AVAILABLE_MODEL_PROVIDERS, params); + } + + async getAvailableVectorStores(params: BIAvailableNodesRequest): Promise { + return this.sendRequest(EXTENDED_APIS.BI_AVAILABLE_VECTOR_STORES, params); + } + + async getAvailableEmbeddingProviders(params: BIAvailableNodesRequest): Promise { + return this.sendRequest(EXTENDED_APIS.BI_AVAILABLE_EMBEDDING_PROVIDERS, params); + } + + async getAvailableVectorKnowledgeBases(params: BIAvailableNodesRequest): Promise { + return this.sendRequest(EXTENDED_APIS.BI_AVAILABLE_VECTOR_KNOWLEDGE_BASES, params); + } + async getEnclosedFunctionDef(params: BIGetEnclosedFunctionRequest): Promise { return this.sendRequest(EXTENDED_APIS.BI_GET_ENCLOSED_FUNCTION, params); } 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 6693f588596..aac325f1039 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 @@ -82,7 +82,11 @@ import { generateOpenApiClient, getAiSuggestions, getAllImports, + getAvailableEmbeddingProviders, + getAvailableModelProviders, getAvailableNodes, + getAvailableVectorKnowledgeBases, + getAvailableVectorStores, getBreakpointInfo, getConfigVariableNodeTemplate, getConfigVariables, @@ -142,6 +146,10 @@ export function registerBiDiagramRpcHandlers(messenger: Messenger) { messenger.onRequest(deleteFlowNode, (args: BISourceCodeRequest) => rpcManger.deleteFlowNode(args)); messenger.onRequest(deleteByComponentInfo, (args: BIDeleteByComponentInfoRequest) => rpcManger.deleteByComponentInfo(args)); messenger.onRequest(getAvailableNodes, (args: BIAvailableNodesRequest) => rpcManger.getAvailableNodes(args)); + messenger.onRequest(getAvailableModelProviders, (args: BIAvailableNodesRequest) => rpcManger.getAvailableModelProviders(args)); + messenger.onRequest(getAvailableVectorStores, (args: BIAvailableNodesRequest) => rpcManger.getAvailableVectorStores(args)); + messenger.onRequest(getAvailableEmbeddingProviders, (args: BIAvailableNodesRequest) => rpcManger.getAvailableEmbeddingProviders(args)); + messenger.onRequest(getAvailableVectorKnowledgeBases, (args: BIAvailableNodesRequest) => rpcManger.getAvailableVectorKnowledgeBases(args)); messenger.onRequest(getEnclosedFunction, (args: BIGetEnclosedFunctionRequest) => rpcManger.getEnclosedFunction(args)); messenger.onRequest(getNodeTemplate, (args: BINodeTemplateRequest) => rpcManger.getNodeTemplate(args)); messenger.onRequest(getAiSuggestions, (args: BIAiSuggestionsRequest) => rpcManger.getAiSuggestions(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 18e65f4e713..c10f529d34d 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 @@ -139,6 +139,7 @@ import * as fs from "fs"; import * as path from 'path'; import * as vscode from "vscode"; +import { ICreateComponentCmdParams, IWso2PlatformExtensionAPI, CommandIds as PlatformExtCommandIds } from "@wso2/wso2-platform-core"; import { ShellExecution, Task, @@ -149,20 +150,17 @@ 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 { cleanAndValidateProject, getCurrentBIProject } from "../../features/config-generator/configGenerator"; import { BreakpointManager } from "../../features/debugger/breakpoint-manager"; import { StateMachine, updateView } from "../../stateMachine"; import { getCompleteSuggestions } from '../../utils/ai/completions'; import { README_FILE, createBIAutomation, createBIFunction, createBIProjectPure } from "../../utils/bi"; import { writeBallerinaFileDidOpen } from "../../utils/modification"; -import { OLD_BACKEND_URL } from "../../features/ai/utils"; -import { ICreateComponentCmdParams, IWso2PlatformExtensionAPI, CommandIds as PlatformExtCommandIds } from "@wso2/wso2-platform-core"; -import { cleanAndValidateProject, getCurrentBIProject } from "../../features/config-generator/configGenerator"; import { updateSourceCode } from "../../utils/source-utils"; -import { getRefreshedAccessToken } from "../../../src/utils/ai/auth"; -import { applyBallerinaTomlEdit } from "./utils"; -import { fetchWithAuth } from "../../../src/features/ai/service/connection"; export class BiDiagramRpcManager implements BIDiagramAPI { OpenConfigTomlRequest: (params: OpenConfigTomlRequest) => Promise; @@ -319,6 +317,79 @@ export class BiDiagramRpcManager implements BIDiagramAPI { }); } + + async getAvailableModelProviders(params: BIAvailableNodesRequest): Promise { + console.log(">>> requesting bi available model providers from ls", params); + return new Promise((resolve) => { + StateMachine.langClient() + .getAvailableModelProviders(params) + .then((model) => { + console.log(">>> bi available model providers from ls", model); + resolve(model); + }) + .catch((error) => { + console.log(">>> error fetching available model providers from ls", error); + return new Promise((resolve) => { + resolve(undefined); + }); + }); + }); + } + + async getAvailableVectorStores(params: BIAvailableNodesRequest): Promise { + console.log(">>> requesting bi available vector stores from ls", params); + return new Promise((resolve) => { + StateMachine.langClient() + .getAvailableVectorStores(params) + .then((model) => { + console.log(">>> bi available vector stores from ls", model); + resolve(model); + }) + .catch((error) => { + console.log(">>> error fetching available vector stores from ls", error); + return new Promise((resolve) => { + resolve(undefined); + }); + }); + }); + } + + async getAvailableEmbeddingProviders(params: BIAvailableNodesRequest): Promise { + console.log(">>> requesting bi available embedding providers from ls", params); + return new Promise((resolve) => { + StateMachine.langClient() + .getAvailableEmbeddingProviders(params) + .then((model) => { + console.log(">>> bi available embedding providers from ls", model); + resolve(model); + }) + .catch((error) => { + console.log(">>> error fetching available embedding providers from ls", error); + return new Promise((resolve) => { + resolve(undefined); + }); + }); + }); + } + + async getAvailableVectorKnowledgeBases(params: BIAvailableNodesRequest): Promise { + console.log(">>> requesting bi available vector knowledge bases from ls", params); + return new Promise((resolve) => { + StateMachine.langClient() + .getAvailableVectorKnowledgeBases(params) + .then((model) => { + console.log(">>> bi available vector knowledge bases from ls", model); + resolve(model); + }) + .catch((error) => { + console.log(">>> error fetching available vector knowledge bases from ls", error); + return new Promise((resolve) => { + resolve(undefined); + }); + }); + }); + } + async getNodeTemplate(params: BINodeTemplateRequest): Promise { console.log(">>> requesting bi node template from ls", params); params.forceAssign = true; // TODO: remove this 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 ed59c8fc1ff..7ca25fb3e75 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 @@ -41,7 +41,6 @@ import { BISearchRequest, BISearchResponse, BISourceCodeRequest, - BISourceCodeResponse, BreakpointRequest, BuildMode, ClassFieldModifierRequest, @@ -128,7 +127,11 @@ import { generateOpenApiClient, getAiSuggestions, getAllImports, + getAvailableEmbeddingProviders, + getAvailableModelProviders, getAvailableNodes, + getAvailableVectorKnowledgeBases, + getAvailableVectorStores, getBreakpointInfo, getConfigVariableNodeTemplate, getConfigVariables, @@ -210,6 +213,22 @@ export class BiDiagramRpcClient implements BIDiagramAPI { return this._messenger.sendRequest(getAvailableNodes, HOST_EXTENSION, params); } + getAvailableModelProviders(params: BIAvailableNodesRequest): Promise { + return this._messenger.sendRequest(getAvailableModelProviders, HOST_EXTENSION, params); + } + + getAvailableVectorStores(params: BIAvailableNodesRequest): Promise { + return this._messenger.sendRequest(getAvailableVectorStores, HOST_EXTENSION, params); + } + + getAvailableEmbeddingProviders(params: BIAvailableNodesRequest): Promise { + return this._messenger.sendRequest(getAvailableEmbeddingProviders, HOST_EXTENSION, params); + } + + getAvailableVectorKnowledgeBases(params: BIAvailableNodesRequest): Promise { + return this._messenger.sendRequest(getAvailableVectorKnowledgeBases, HOST_EXTENSION, params); + } + getEnclosedFunction(params: BIGetEnclosedFunctionRequest): Promise { return this._messenger.sendRequest(getEnclosedFunction, HOST_EXTENSION, params); } @@ -265,7 +284,7 @@ export class BiDiagramRpcClient implements BIDiagramAPI { getConfigVariablesV2(): Promise { return this._messenger.sendRequest(getConfigVariablesV2, HOST_EXTENSION); } - + updateConfigVariablesV2(params: UpdateConfigVariableRequestV2): Promise { return this._messenger.sendRequest(updateConfigVariablesV2, HOST_EXTENSION, params); } diff --git a/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx b/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx index 2b9b60ee1d7..2ecadf226b4 100644 --- a/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx @@ -37,6 +37,7 @@ import { } from "../../resources"; import { NodeKind } from "../../utils/types"; import { Icon } from "@wso2/ui-toolkit"; +import { DefaultLlmIcon } from "../../resources/icons/DefaultLlmIcon"; // VSCode chart colors - guaranteed to be available in all webviews // These colors are visually distinct and work well in both light and dark themes @@ -210,6 +211,10 @@ const NODE_ICONS: Record> = FAIL: ({ size, color }) => , RETRY: ({ size, color }) => , AGENT_CALL: ({ size, color }) => , + MODEL_PROVIDERS: ({ size, color }) => , + VECTOR_KNOWLEDGE_BASES: ({ size, color }) => , + VECTOR_STORES: ({ size, color }) => , + EMBEDDING_PROVIDERS: ({ size, color }) => , // Default case for any NodeKind not explicitly handled } as Record>; From 263b33b4fa5f869f8716d0eca709db97efc109e6 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Thu, 24 Jul 2025 18:04:07 +0530 Subject: [PATCH 104/349] Refactor NodeList component to enhance UI and functionality to support more category --- .../src/components/NodeList/index.tsx | 342 ++++++++++++------ 1 file changed, 230 insertions(+), 112 deletions(-) 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 81a51ec9a85..d1e544fc444 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx @@ -202,29 +202,40 @@ namespace S { margin-top: 20px; `; - export const ShowMoreContainer = styled.div` + export const AdvancedSubcategoryContainer = styled.div` + display: flex; + flex-direction: column; + width: 100%; + margin-top: 8px; + `; + + export const AdvancedSubcategoryHeader = styled.div` display: flex; flex-direction: row; - justify-content: center; + justify-content: space-between; align-items: center; width: 100%; - height: 35px; - cursor: pointer; - border: 1px dashed ${ThemeColors.OUTLINE_VARIANT}; + padding: 4px 12px; border-radius: 5px; + cursor: pointer; + transition: all 0.2s ease; + border: 1px solid transparent; + &:hover { background-color: ${ThemeColors.PRIMARY_CONTAINER}; - border: 1px dashed ${ThemeColors.PRIMARY}; - border-radius: 5px; + } + + &:hover > div:first-of-type { + opacity: 1; + color: ${ThemeColors.PRIMARY}; } `; - export const ShowMoreTitle = styled.div` - white-space: nowrap; - justify-items: center; - align-items: center; - color: ${ThemeColors.ON_SURFACE_VARIANT}; + export const AdvancedSubTitle = styled.div` + font-size: 12px; opacity: 0.7; + color: ${ThemeColors.ON_SURFACE_VARIANT}; + transition: all 0.2s ease; `; } @@ -236,6 +247,8 @@ interface NodeListProps { onSearchTextChange?: (text: string) => void; onAddConnection?: () => void; onAddFunction?: () => void; + onAdd?: () => void; + addButtonLabel?: string; onBack?: () => void; onClose?: () => void; searchPlaceholder?: string; @@ -250,21 +263,27 @@ export function NodeList(props: NodeListProps) { onSearchTextChange, onAddConnection, onAddFunction, + onAdd, + addButtonLabel, onBack, onClose, - searchPlaceholder + searchPlaceholder, } = props; const [searchText, setSearchText] = useState(""); const [showGeneratePanel, setShowGeneratePanel] = useState(false); const [isSearching, setIsSearching] = useState(false); + const [expandedMoreSections, setExpandedMoreSections] = useState>({}); const { rpcClient } = useRpcContext(); const [isNPSupported, setIsNPSupported] = useState(false); useEffect(() => { - rpcClient.getCommonRpcClient().isNPSupported().then((supported) => { - setIsNPSupported(supported); - }); + rpcClient + .getCommonRpcClient() + .isNPSupported() + .then((supported) => { + setIsNPSupported(supported); + }); }, []); useEffect(() => { @@ -289,6 +308,13 @@ export function NodeList(props: NodeListProps) { setIsSearching(false); }, [categories]); + const toggleMoreSection = (sectionKey: string) => { + setExpandedMoreSections((prev) => ({ + ...prev, + [sectionKey]: !prev[sectionKey], + })); + }; + const handleAddNode = (node: Node, category?: string) => { onSelect(node.id, { node: node.metadata, category }); }; @@ -305,54 +331,105 @@ export function NodeList(props: NodeListProps) { } }; - const getNodesContainer = (nodes: Node[]) => ( - - {nodes.map((node, index) => { - if (["NP_FUNCTION"].includes(node.id) && !isNPSupported) { - return; - } + const handleAdd = () => { + if (onAdd) { + onAdd(); + } + }; - return ( - handleAddNode(node)} - title={node.label} - > - {node.icon || } - { - if (el && el.scrollWidth > el.clientWidth) { - el.style.fontSize = "13px"; - el.style.wordBreak = "break-word"; - el.style.whiteSpace = "normal"; - } - }} - > - {node.label} - - - ); - })} - - ); + const getNodesContainer = (items: (Node | Category)[], parentCategoryTitle?: string) => { + const nodes = items.filter((item): item is Node => "id" in item && !("title" in item)); + const subcategories = items.filter((item): item is Category => "title" in item && "items" in item); + + return ( + <> + + {nodes.map((node, index) => { + if (["NP_FUNCTION"].includes(node.id) && !isNPSupported) { + return; + } + + return ( + handleAddNode(node)} + title={node.label} + > + {node.icon || } + { + if (el && el.scrollWidth > el.clientWidth) { + el.style.fontSize = "13px"; + el.style.wordBreak = "break-word"; + el.style.whiteSpace = "normal"; + } + }} + > + {node.label} + + + ); + })} + + {subcategories.map((subcategory, index) => { + const isMoreSubcategory = subcategory.title === "More"; + + if (isMoreSubcategory) { + const sectionKey = `${parentCategoryTitle}-${subcategory.title}`; + const isExpanded = expandedMoreSections[sectionKey] || searchText?.length > 0; + + return ( + + toggleMoreSection(sectionKey)}> + {subcategory.title} + + + {isExpanded &&
{getNodesContainer(subcategory.items, parentCategoryTitle)}
} +
+ ); + } else { + return ( + + + + {subcategory.title} + + + {subcategory.items.length > 0 && + getNodesContainer(subcategory.items, parentCategoryTitle)} + + ); + } + })} + + ); + }; const getConnectionContainer = (categories: Category[]) => ( {categories.map((category, index) => ( - // 0} onSelect={handleAddNode} /> - // ))} ); - const getCategoryContainer = (groups: Category[], isSubCategory = false) => { + const getCategoryContainer = (groups: Category[], isSubCategory = false, parentCategoryTitle?: string) => { const callFunctionNode = groups .flatMap((group) => group?.items) .find((item) => "id" in item && item.id === "FUNCTION"); @@ -364,14 +441,19 @@ export function NodeList(props: NodeListProps) { const isDataMapperCategory = isProjectFunctionsCategory && title === "Data Mappers"; const isAgentCategory = group.title === "Agents"; const isNpFunctionCategory = isProjectFunctionsCategory && title === "Natural Functions"; - if ( - (!group || group.items.length === 0) && - !isConnectionCategory && - !isProjectFunctionsCategory && - !isAgentCategory && - !isNpFunctionCategory - ) { - return null; + const isModelProviderCategory = group.title === "Model Providers"; + // Hide categories that don't have items, except for special categories that can add items + if (!group || group.items.length === 0) { + // Only show empty categories if they have add functionality + if ( + !isConnectionCategory && + !isProjectFunctionsCategory && + !isAgentCategory && + !isNpFunctionCategory && + !isModelProviderCategory + ) { + return null; + } } if (searchText && group.items.length === 0) { return null; @@ -380,6 +462,7 @@ export function NodeList(props: NodeListProps) { if (!onAddFunction && isProjectFunctionsCategory && group.items?.length === 0) { return null; } + return ( @@ -391,49 +474,47 @@ export function NodeList(props: NodeListProps) { {!isSubCategory && ( <> {group.title} - {(isConnectionCategory || isProjectFunctionsCategory || isAgentCategory) && ( - <> - {onAddConnection && isConnectionCategory && ( + <> + {onAddConnection && isConnectionCategory && ( + + )} + {onAddFunction && isDataMapperCategory && ( + + )} + {onAddFunction && + isProjectFunctionsCategory && + !isDataMapperCategory && + !isNpFunctionCategory && ( - )} - {onAddFunction && isDataMapperCategory && ( - )} - {onAddFunction && - isProjectFunctionsCategory && - !isDataMapperCategory && - !isNpFunctionCategory && ( - - )} - {onAddFunction && isNpFunctionCategory && ( - - )} - - )} + {onAddFunction && isNpFunctionCategory && ( + + )} + )} @@ -463,28 +544,53 @@ export function NodeList(props: NodeListProps) { }`} )} - {group.items.length > 0 && "id" in group.items.at(0) - ? getNodesContainer(group.items as Node[]) + {onAdd && addButtonLabel && group.items.length === 0 && !searchText && !isSearching && ( + + + {addButtonLabel} + + )} + {group.items.length > 0 && + (group.items.some((item) => "id" in item && !("title" in item)) || + group.items.some((item) => "title" in item && "items" in item)) + ? getNodesContainer( + group.items as (Node | Category)[], + !isSubCategory ? group.title : parentCategoryTitle + ) : (onAddConnection && isConnectionCategory) || - (onAddFunction && isProjectFunctionsCategory) + (onAddFunction && isProjectFunctionsCategory) || + (onAdd && isModelProviderCategory) ? getConnectionContainer(group.items as Category[]) - : getCategoryContainer(group.items as Category[], true)} + : getCategoryContainer( + group.items as Category[], + true, + !isSubCategory ? group.title : parentCategoryTitle + )} ); })} {callFunctionNode && ( - - handleAddNode(callFunctionNode as Node)}> - Show More Functions - - + + handleAddNode(callFunctionNode as Node)}> + Show More Functions + + + )} ); - // Check if the content is empty const isEmpty = React.Children.toArray(content.props.children).every((child) => child === null); - return isEmpty ?
No matching results found
: content; }; @@ -492,13 +598,23 @@ export function NodeList(props: NodeListProps) { const filterItems = (items: Item[]): Item[] => { return items .map((item) => { - if ("items" in item) { + if ("items" in item && "title" in item) { + // This is a Category (like "More") const filteredItems = filterItems(item.items); - return { - ...item, - items: filteredItems, - }; - } else { + const categoryMatches = + item.title.toLowerCase().includes(searchText.toLowerCase()) || + (item.description?.toLowerCase() || "").includes(searchText.toLowerCase()); + + // Keep the category if it matches or has matching items + if (categoryMatches || filteredItems.length > 0) { + return { + ...item, + items: filteredItems, + }; + } + return null; + } else if ("id" in item && "label" in item) { + // This is a Node const lowerCaseTitle = item.label.toLowerCase(); const lowerCaseDescription = item.description?.toLowerCase() || ""; const lowerCaseSearchText = searchText.toLowerCase(); @@ -508,9 +624,11 @@ export function NodeList(props: NodeListProps) { ) { return item; } + return null; } + return null; }) - .filter(Boolean); + .filter(Boolean) as Item[]; }; const filteredCategories = cloneDeep(categories).map((category) => { @@ -561,7 +679,7 @@ export function NodeList(props: NodeListProps) { Date: Thu, 24 Jul 2025 18:12:27 +0530 Subject: [PATCH 105/349] Introduce new SVG icons for model, vector knowledge base, vector store, and embedding provider. --- .../src/components/NodeIcon/index.tsx | 18 ++++++++++--- .../src/icons/bi-ai-model.svg | 25 +++++++++++++++++++ .../font-wso2-vscode/src/icons/bi-brain.svg | 21 ++++++++++++++++ .../font-wso2-vscode/src/icons/bi-cut.svg | 21 ++++++++++++++++ .../font-wso2-vscode/src/icons/bi-db.svg | 21 ++++++++++++++++ .../font-wso2-vscode/src/icons/bi-doc.svg | 21 ++++++++++++++++ 6 files changed, 123 insertions(+), 4 deletions(-) create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-ai-model.svg create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-brain.svg create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-cut.svg create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-db.svg create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-doc.svg diff --git a/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx b/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx index 2ecadf226b4..ac58153cf18 100644 --- a/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx @@ -37,7 +37,6 @@ import { } from "../../resources"; import { NodeKind } from "../../utils/types"; import { Icon } from "@wso2/ui-toolkit"; -import { DefaultLlmIcon } from "../../resources/icons/DefaultLlmIcon"; // VSCode chart colors - guaranteed to be available in all webviews // These colors are visually distinct and work well in both light and dark themes @@ -78,8 +77,19 @@ const NODE_COLOR_GROUPS = { ], // AI/NP function group - cyan variants - CYAN_FUNCTION_GROUP: ["AGENT_CALL", "NP_FUNCTION", "NP_FUNCTION_CALL"], - + CYAN_FUNCTION_GROUP: [ + "AGENT_CALL", + "NP_FUNCTION", + "NP_FUNCTION_CALL", + "MODEL_PROVIDER", + "VECTOR_KNOWLEDGE_BASE", + "VECTOR_STORE", + "EMBEDDING_PROVIDER", + "MODEL_PROVIDERS", + "VECTOR_KNOWLEDGE_BASES", + "VECTOR_STORES", + "EMBEDDING_PROVIDERS", + ], // Data related - magenta variants MAGENTA_DATA_GROUP: ["VARIABLE", "NEW_DATA", "UPDATE_DATA", "ASSIGN"], @@ -211,7 +221,7 @@ const NODE_ICONS: Record> = FAIL: ({ size, color }) => , RETRY: ({ size, color }) => , AGENT_CALL: ({ size, color }) => , - MODEL_PROVIDERS: ({ size, color }) => , + MODEL_PROVIDERS: ({ size, color }) => , VECTOR_KNOWLEDGE_BASES: ({ size, color }) => , VECTOR_STORES: ({ size, color }) => , EMBEDDING_PROVIDERS: ({ size, color }) => , diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-ai-model.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-ai-model.svg new file mode 100644 index 00000000000..5739f878d3c --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-ai-model.svg @@ -0,0 +1,25 @@ + + + + + + + diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-brain.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-brain.svg new file mode 100644 index 00000000000..35fbdeb0e09 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-brain.svg @@ -0,0 +1,21 @@ + + + + diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-cut.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-cut.svg new file mode 100644 index 00000000000..fe220901cde --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-cut.svg @@ -0,0 +1,21 @@ + + + + diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-db.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-db.svg new file mode 100644 index 00000000000..7dbd75707ca --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-db.svg @@ -0,0 +1,21 @@ + + + + diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-doc.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-doc.svg new file mode 100644 index 00000000000..cbb8b3ae3a5 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-doc.svg @@ -0,0 +1,21 @@ + + + + From 32be5390831b2a4b0beaa1e460f9416a83b76422 Mon Sep 17 00:00:00 2001 From: tharindulak Date: Thu, 24 Jul 2025 16:18:02 +0530 Subject: [PATCH 106/349] Refactor trivy scan --- .github/workflows/build.yml | 73 ++++++++++++++++++++++++++----------- 1 file changed, 52 insertions(+), 21 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b1b6843ff36..8c63e63a67f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -187,21 +187,51 @@ jobs: - name: Setup Rush uses: gigara/setup-rush@v1.2.0 with: - pnpm: 10.10.0 + pnpm: 10.11.0 node: 22.x rush-install: true - - name: Run Trivy vulnerability scanner - uses: aquasecurity/trivy-action@master - with: - scan-type: 'fs' - scan-ref: '.' - format: 'sarif' - output: 'trivy-results.sarif' - skip-dirs: 'common/temp' - timeout: '10m' - severity: 'CRITICAL,HIGH,MEDIUM,LOW' - exit-code: '1' + - name: Install Trivy + run: | + sudo apt-get update + sudo apt-get install wget apt-transport-https gnupg lsb-release + wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo gpg --dearmor -o /usr/share/keyrings/trivy.gpg + echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list + sudo apt-get update + sudo apt-get install trivy + + - name: Verify Trivy installation + run: | + trivy version + echo "Trivy installed successfully" + + - name: Show scan configuration + run: | + echo "🔧 Security Scan Configuration:" + echo " - Scanning: Production dependencies" + echo " - Severity levels: CRITICAL, HIGH, MEDIUM, LOW" + echo " - Skipping directories: common/temp" + echo " - Timeout: 10 minutes" + echo " - Exit on vulnerabilities: YES" + + - name: Run Trivy vulnerability scanner (SARIF) + run: | + echo "Running Trivy vulnerability scanner..." + trivy fs . \ + --timeout 10m \ + --skip-dirs common/temp \ + --severity CRITICAL,HIGH,MEDIUM,LOW \ + --format sarif \ + --output trivy-results.sarif \ + --exit-code 1 + + if [ $? -ne 0 ]; then + echo "❌ Trivy scan found vulnerabilities!" + echo "Check the uploaded SARIF file and table output for details." + exit 1 + else + echo "✅ No vulnerabilities found!" + fi - name: Upload Trivy scan results to GitHub Security tab uses: github/codeql-action/upload-sarif@v3 @@ -209,15 +239,16 @@ jobs: with: sarif_file: 'trivy-results.sarif' - - name: Run Trivy scanner for table output - uses: aquasecurity/trivy-action@master - with: - scan-type: 'fs' - scan-ref: '.' - format: 'table' - skip-dirs: 'common/temp' - timeout: '10m' - severity: 'CRITICAL,HIGH,MEDIUM,LOW' + - name: Run Trivy scanner for table output + if: always() + run: | + echo "🔍 Running Trivy scanner for human-readable table output..." + trivy fs . \ + --timeout 10m \ + --skip-dirs common/temp \ + --severity CRITICAL,HIGH,MEDIUM,LOW \ + --format table + echo "📊 Table output complete." ExtTest_Ballerina: name: Run Ballerina extension tests From 46a25287c3c7d2f6ce0244fe114c5d58a4cab6ed Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Thu, 24 Jul 2025 18:51:27 +0530 Subject: [PATCH 107/349] Apply review suggestions --- .../src/rpc-managers/ai-agent/rpc-manager.ts | 2 +- .../src/components/editors/DropdownEditor.tsx | 1 - .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 21 ------------------- .../views/BI/Forms/FormGenerator/index.tsx | 2 +- 4 files changed, 2 insertions(+), 24 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts index 97a7459737e..5984ba94d2b 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts @@ -503,7 +503,7 @@ export class AiAgentRpcManager implements AIAgentAPI { toolsArray.push(variableName); } // Update the tools value - toolsValue = `[${toolsArray.join(", ")} ]`; + toolsValue = `[${toolsArray.join(", ")}]`; } else { toolsValue = `[${variableName}]`; } diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx index 16c396a9320..e7db6f00d1d 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx @@ -102,7 +102,6 @@ export function DropdownEditor(props: DropdownEditorProps) { // Call onToolsChange whenever selectedMcpTools changes useEffect(() => { props.onToolsChange?.(Array.from(selectedMcpTools)); - // eslint-disable-next-line react-hooks/exhaustive-deps }, [selectedMcpTools]); const showScopeControls = field.key === "toolsToInclude"; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index 52aff58534c..95c22202cbb 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -182,27 +182,6 @@ const LoadingMessage = styled.div` gap: 8px; `; -const CheckboxIcon = styled.div<{ visible: boolean }>((props: React.PropsWithChildren<{ visible: boolean }>) => ` - width: 10px; - height: 10px; - opacity: ${props.visible ? 1 : 0}; - transition: opacity 0.2s ease; - display: flex; - align-items: center; - justify-content: center; - - /* SVG checkmark */ - &::after { - content: ''; - width: 8px; - height: 8px; - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='white' d='M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z'/%3E%3C/svg%3E"); - background-repeat: no-repeat; - background-position: center; - background-size: contain; - } -`); - interface Tool { name: string; description?: string; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx index aede06c81d2..fd265c5ab86 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx @@ -143,7 +143,7 @@ const StyledActionButton = styled(Button)` } `; -export const FormGenerator = forwardRef(function FormGenerator(props: FormProps, ref) { +export const FormGenerator = forwardRef(function FormGenerator(props: FormProps, ref: React.ForwardedRef) { const { fileName, node, From 39fdad8c02a63d83b7316069e30b85bf43016166 Mon Sep 17 00:00:00 2001 From: Chinthaka Jayatilake <37581983+ChinthakaJ98@users.noreply.github.com> Date: Thu, 24 Jul 2025 19:04:00 +0530 Subject: [PATCH 108/349] Discourage creating a project within a project --- .../src/rpc-managers/mi-diagram/rpc-manager.ts | 11 +++++++++-- .../src/test/e2e-playwright-tests/Utils.ts | 2 +- .../overviewPageTests/projectSettingPage.spec.ts | 2 +- .../projectTests/createProject.spec.ts | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts b/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts index 107f83b6ac6..e7c4f19afb9 100644 --- a/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts +++ b/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts @@ -3129,8 +3129,15 @@ ${endpointAttributes} async getWorkspaceRoot(): Promise { return new Promise(async (resolve) => { const workspaceFolders = workspace.workspaceFolders; - if (workspaceFolders) { - resolve({ path: this.projectUri }); + if (workspaceFolders && this.projectUri) { + const existingProject = path.basename(this.projectUri); + const matched = workspaceFolders.find(folder => path.basename(folder.uri.fsPath) === existingProject); + if (matched) { + const parentPath = path.dirname(this.projectUri); + resolve({ path: parentPath }); + } else { + resolve({ path: this.projectUri }); + } } resolve({ path: getDefaultProjectPath() }); }); diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/Utils.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/Utils.ts index c5caf22e358..629bd0d3e70 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/Utils.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/Utils.ts @@ -31,7 +31,7 @@ export const dataFolder = path.join(__dirname, 'data'); const extensionsFolder = path.join(__dirname, '..', '..', '..', 'vsix'); const vscodeVersion = 'latest'; export const resourcesFolder = path.join(__dirname, '..', 'test-resources'); -export const newProjectPath = path.join(dataFolder, 'new-project', 'testProject'); +export const newProjectPath = path.join(dataFolder, 'new-project', 'testProjectFolder'); export const screenShotsFolder = path.join(__dirname, '..', 'test-resources', 'screenshots'); export const videosFolder = path.join(__dirname, '..', 'test-resources', 'videos'); diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/overviewPageTests/projectSettingPage.spec.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/overviewPageTests/projectSettingPage.spec.ts index 9099f18401d..926067121d5 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/overviewPageTests/projectSettingPage.spec.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/overviewPageTests/projectSettingPage.spec.ts @@ -21,7 +21,7 @@ import { Overview } from '../components/Overview'; import path from "path"; import { initTest, page, waitUntilPomContains, waitUntilPomNotContains } from '../Utils'; const dataFolder = path.join(__dirname, '..', 'data'); -export const newProjectPath = path.join(dataFolder, 'new-project', 'testProject'); +export const newProjectPath = path.join(dataFolder, 'new-project', 'testProjectFolder'); export const pomFilePath = path.join(newProjectPath, 'testProject', 'pom.xml'); export const configFilePath = path.join(newProjectPath, 'testProject', 'src', 'main', 'wso2mi', 'resources', 'conf', 'config.properties'); diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/projectTests/createProject.spec.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/projectTests/createProject.spec.ts index c4a48956e28..4a9e0f67287 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/projectTests/createProject.spec.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/projectTests/createProject.spec.ts @@ -26,7 +26,7 @@ import path from "path"; import fs from 'fs'; const dataFolder = path.join( __dirname, '..', 'data'); -export const newProjectPath = path.join(dataFolder, 'new-project', 'testProject'); +export const newProjectPath = path.join(dataFolder, 'new-project', 'testProjectFolder'); export default function createTests() { test.describe("Create Project Tests", { From 361de24466cc64679c55ea715e8c32c3dcdaa59c Mon Sep 17 00:00:00 2001 From: madushajg Date: Thu, 24 Jul 2025 19:27:32 +0530 Subject: [PATCH 109/349] Improve IO error styling --- .../src/components/DataMapper/DataMapper.tsx | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/DataMapper/DataMapper.tsx b/workspaces/ballerina/inline-data-mapper/src/components/DataMapper/DataMapper.tsx index 606b1cca135..1dfb96476b4 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/DataMapper/DataMapper.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/DataMapper/DataMapper.tsx @@ -17,7 +17,7 @@ */ // tslint:disable: jsx-no-multiline-js import React, { useCallback, useEffect, useReducer, useState } from "react"; -import { css } from "@emotion/css"; +import { css, keyframes } from "@emotion/css"; import { ExpandedDMModel } from "@wso2/ballerina-core"; import { DataMapperContext } from "../../utils/DataMapperContext/DataMapperContext"; @@ -42,13 +42,8 @@ import { ErrorNodeKind } from "./Error/RenderingError"; import { IOErrorComponent } from "./Error/DataMapperError"; import { IntermediateNodeInitVisitor } from "../../visitors/IntermediateNodeInitVisitor"; import { - ArrayOutputNode, - InputNode, - ObjectOutputNode, LinkConnectorNode, QueryExprConnectorNode, - QueryOutputNode, - SubMappingNode, EmptyInputsNode } from "../Diagram/Node"; import { SubMappingNodeInitVisitor } from "../../visitors/SubMappingNodeInitVisitor"; @@ -56,11 +51,38 @@ import { SubMappingConfigForm } from "./SidePanel/SubMappingConfig/SubMappingCon import { ClausesPanel } from "./SidePanel/QueryClauses/ClausesPanel"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; + +const fadeIn = keyframes` + from { opacity: 0.5; } + to { opacity: 1; } +`; + const classes = { root: css({ flexGrow: 1, - height: "100vh", + height: "100%", overflow: "hidden", + }), + overlay: css({ + zIndex: 1, + position: 'absolute', + width: '100%', + height: '100%', + background: "var(--vscode-input-background)", + opacity: 0.5, + cursor: 'not-allowed' + }), + errorBanner: css({ + borderColor: "var(--vscode-errorForeground)" + }), + errorMessage: css({ + zIndex: 1, + position: 'absolute', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + width: '500px', + animation: `${fadeIn} 0.5s ease-in-out` }) } @@ -250,13 +272,13 @@ export function InlineDataMapper(props: InlineDataMapperProps) { )} {errorKind && } - {nodes.length > 0 && ( + {nodes.length > 0 && !errorKind && ( <> Date: Thu, 24 Jul 2025 20:42:42 +0530 Subject: [PATCH 110/349] Add vulnerable dependency --- .github/workflows/build.yml | 150 +++++++++++++++--- common/config/rush/pnpm-lock.yaml | 17 +- .../common-libs/ui-toolkit/package.json | 1 + 3 files changed, 142 insertions(+), 26 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8c63e63a67f..963f72c27d4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -214,41 +214,143 @@ jobs: echo " - Timeout: 10 minutes" echo " - Exit on vulnerabilities: YES" - - name: Run Trivy vulnerability scanner (SARIF) + - name: Run Trivy vulnerability scanner run: | - echo "Running Trivy vulnerability scanner..." + echo "🔍 Running Trivy vulnerability scanner (table format)..." + + # Run Trivy once with table format (human-readable for PR comments and logs) trivy fs . \ --timeout 10m \ --skip-dirs common/temp \ --severity CRITICAL,HIGH,MEDIUM,LOW \ - --format sarif \ - --output trivy-results.sarif \ - --exit-code 1 + --format table \ + --output trivy-table-results.txt \ + --exit-code 0 + + echo "📊 Table output complete." - if [ $? -ne 0 ]; then - echo "❌ Trivy scan found vulnerabilities!" - echo "Check the uploaded SARIF file and table output for details." - exit 1 + # Check if vulnerabilities were found by examining the table output + if [ -f "trivy-table-results.txt" ]; then + # Count vulnerability lines (exclude headers and empty lines) + VULN_COUNT=$(grep -c "CVE\|GHSA" trivy-table-results.txt 2>/dev/null || echo "0") + if [ "$VULN_COUNT" -gt 0 ]; then + echo "❌ Trivy scan found $VULN_COUNT vulnerabilities!" + echo "Check the table output for details." + echo "VULNERABILITIES_FOUND=true" >> $GITHUB_ENV + echo "VULN_COUNT=$VULN_COUNT" >> $GITHUB_ENV + else + echo "✅ No vulnerabilities found!" + echo "VULNERABILITIES_FOUND=false" >> $GITHUB_ENV + echo "VULN_COUNT=0" >> $GITHUB_ENV + fi else - echo "✅ No vulnerabilities found!" + echo "⚠️ Table output file not generated!" + echo "VULNERABILITIES_FOUND=false" >> $GITHUB_ENV + echo "VULN_COUNT=0" >> $GITHUB_ENV fi - - name: Upload Trivy scan results to GitHub Security tab - uses: github/codeql-action/upload-sarif@v3 - if: always() + - name: Create PR comment with vulnerability report + if: env.VULNERABILITIES_FOUND == 'true' + uses: actions/github-script@v7 + continue-on-error: true with: - sarif_file: 'trivy-results.sarif' - - - name: Run Trivy scanner for table output - if: always() + script: | + const fs = require('fs'); + + // Read the table output + let tableOutput = ''; + try { + tableOutput = fs.readFileSync('trivy-table-results.txt', 'utf8'); + } catch (error) { + tableOutput = 'Unable to read vulnerability details.'; + } + + // Count vulnerabilities by severity + const vulnCount = process.env.VULN_COUNT || 'unknown'; + + const comment = `## 🚨 Security Vulnerabilities Detected + + **❌ Build Failed**: ${vulnCount} security vulnerabilities found in dependencies. + + ### 📊 Vulnerability Summary + \`\`\` + ${tableOutput} + \`\`\` + + ### 🔧 Next Steps + 1. **Review vulnerabilities** in the table above + 2. **Update vulnerable packages** to the fixed versions shown + 3. **Re-run the build** after fixing the issues + + ### 📋 Additional Information + - **Scan Type**: Production dependencies only + - **Severity Levels**: CRITICAL, HIGH, MEDIUM, LOW + - **Workflow**: Security_Scan job in build pipeline + + > 💡 **Tip**: Focus on CRITICAL and HIGH severity vulnerabilities first for maximum security impact.`; + + // Get PR number from various possible sources + let prNumber = null; + + // Method 1: Direct PR context (pull_request events) + if (context.payload.pull_request) { + prNumber = context.payload.pull_request.number; + } + + // Method 2: Check if triggered by PR (workflow_run events) + if (!prNumber && context.payload.workflow_run && context.payload.workflow_run.pull_requests && context.payload.workflow_run.pull_requests.length > 0) { + prNumber = context.payload.workflow_run.pull_requests[0].number; + } + + // Method 3: Parse from ref if it's a PR branch + if (!prNumber && context.ref && context.ref.includes('refs/pull/')) { + const match = context.ref.match(/refs\/pull\/(\d+)\//); + if (match) { + prNumber = parseInt(match[1]); + } + } + + // Method 4: Check environment variables (some CI systems set these) + if (!prNumber && process.env.GITHUB_HEAD_REF) { + console.log('Detected fork/branch build, checking for associated PR...'); + // This is a potential PR build but we can't determine the PR number reliably + } + + if (prNumber) { + try { + console.log(`Posting vulnerability report to PR #${prNumber}`); + await github.rest.issues.createComment({ + issue_number: prNumber, + owner: context.repo.owner, + repo: context.repo.repo, + body: comment + }); + console.log('✅ PR comment posted successfully'); + } catch (error) { + console.log('❌ Failed to post PR comment:', error.message); + console.log('Vulnerability report logged in job output instead'); + } + } else { + console.log('📋 No PR context found - vulnerability report available in job output'); + console.log('Event:', context.eventName); + console.log('Ref:', context.ref); + console.log('Actor:', context.actor); + } + + // Always log the vulnerability details to job output + console.log('\n' + '='.repeat(80)); + console.log('🚨 SECURITY VULNERABILITY REPORT'); + console.log('='.repeat(80)); + console.log(comment); + console.log('='.repeat(80) + '\n'); + + - name: Fail build if vulnerabilities found + if: env.VULNERABILITIES_FOUND == 'true' run: | - echo "🔍 Running Trivy scanner for human-readable table output..." - trivy fs . \ - --timeout 10m \ - --skip-dirs common/temp \ - --severity CRITICAL,HIGH,MEDIUM,LOW \ - --format table - echo "📊 Table output complete." + echo "❌ Build failed due to security vulnerabilities!" + echo "Please review the table output above for vulnerability details." + echo "Fix the vulnerabilities before proceeding." + exit 1 ExtTest_Ballerina: name: Run Ballerina extension tests diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 41ae065e22b..14fa4196af5 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -2836,6 +2836,9 @@ importers: '@wso2/font-wso2-vscode': specifier: workspace:* version: link:../font-wso2-vscode + axios: + specifier: 0.21.0 + version: 0.21.0 classnames: specifier: ^2.5.1 version: 2.5.1 @@ -10411,6 +10414,10 @@ packages: resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} engines: {node: '>=4'} + axios@0.21.0: + resolution: {integrity: sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==} + deprecated: Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410 + axios@1.9.0: resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} @@ -34272,6 +34279,12 @@ snapshots: axe-core@4.10.3: {} + axios@0.21.0: + dependencies: + follow-redirects: 1.15.9 + transitivePeerDependencies: + - debug + axios@1.9.0: dependencies: follow-redirects: 1.15.9 @@ -47343,7 +47356,7 @@ snapshots: schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.43.1 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@5.1.4) terser@4.8.1: dependencies: @@ -47662,7 +47675,7 @@ snapshots: semver: 7.7.2 source-map: 0.7.4 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@5.1.4) ts-mixer@6.0.4: {} diff --git a/workspaces/common-libs/ui-toolkit/package.json b/workspaces/common-libs/ui-toolkit/package.json index d221f13b2d3..0151a5fb2bd 100644 --- a/workspaces/common-libs/ui-toolkit/package.json +++ b/workspaces/common-libs/ui-toolkit/package.json @@ -33,6 +33,7 @@ "@vscode/codicons": "0.0.36", "@vscode/webview-ui-toolkit": "~1.4.0", "@wso2/font-wso2-vscode": "workspace:*", + "axios": "0.21.0", "classnames": "^2.5.1", "lodash": "~4.17.21", "monaco-editor": "~0.52.2", From ccfec4522cf575ed0d01637276467b0256b60e0a Mon Sep 17 00:00:00 2001 From: tharindulak Date: Thu, 24 Jul 2025 22:31:43 +0530 Subject: [PATCH 111/349] Add debugging to security scan workflow - Debug dependency state before vulnerability scanning - Add verbose Trivy output with --debug flag - Show preview of scan results - Enhanced logging to understand CI environment differences --- .github/workflows/build.yml | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 963f72c27d4..dfa1cb21c52 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -214,25 +214,54 @@ jobs: echo " - Timeout: 10 minutes" echo " - Exit on vulnerabilities: YES" + - name: Debug dependency state + run: | + echo "🔍 Debugging dependency state for vulnerability scanning..." + echo "Current directory contents:" + ls -la + echo "" + echo "Checking for axios in root package.json:" + cat package.json | grep -A5 -B5 axios || echo "No axios found in root package.json" + echo "" + echo "Checking for axios in ui-toolkit package.json:" + cat workspaces/common-libs/ui-toolkit/package.json | grep -A5 -B5 axios || echo "No axios found in ui-toolkit package.json" + echo "" + echo "Checking pnpm-lock.yaml for axios entries:" + grep -c "axios" pnpm-lock.yaml || echo "No axios entries found in pnpm-lock.yaml" + echo "" + echo "Checking if axios 0.21.0 is in pnpm-lock.yaml:" + grep "axios@0.21.0" pnpm-lock.yaml || echo "No axios@0.21.0 found in pnpm-lock.yaml" + echo "" + echo "Lock file structure summary:" + echo "- pnpm-lock.yaml exists: $(test -f pnpm-lock.yaml && echo 'YES' || echo 'NO')" + echo "- common/config/rush/pnpm-lock.yaml exists: $(test -f common/config/rush/pnpm-lock.yaml && echo 'YES' || echo 'NO')" + - name: Run Trivy vulnerability scanner run: | echo "🔍 Running Trivy vulnerability scanner (table format)..." - # Run Trivy once with table format (human-readable for PR comments and logs) + # Run Trivy with verbose output for debugging trivy fs . \ --timeout 10m \ --skip-dirs common/temp \ --severity CRITICAL,HIGH,MEDIUM,LOW \ --format table \ --output trivy-table-results.txt \ - --exit-code 0 + --exit-code 0 \ + --debug echo "📊 Table output complete." + echo "" + echo "📋 Trivy scan results preview:" + head -50 trivy-table-results.txt || echo "No output file generated" + echo "" # Check if vulnerabilities were found by examining the table output if [ -f "trivy-table-results.txt" ]; then # Count vulnerability lines (exclude headers and empty lines) VULN_COUNT=$(grep -c "CVE\|GHSA" trivy-table-results.txt 2>/dev/null || echo "0") + echo "🔢 CVE/GHSA count found: $VULN_COUNT" + if [ "$VULN_COUNT" -gt 0 ]; then echo "❌ Trivy scan found $VULN_COUNT vulnerabilities!" echo "Check the table output for details." From f70d66b0a48d17e9eb73a36093ca62f0ea216d0b Mon Sep 17 00:00:00 2001 From: tharindulak Date: Thu, 24 Jul 2025 22:46:13 +0530 Subject: [PATCH 112/349] Fix pr comment --- .github/workflows/build.yml | 77 ++++++++++++++++++++++++++++++++----- 1 file changed, 67 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index dfa1cb21c52..6690acc7a8b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -321,14 +321,24 @@ jobs: // Get PR number from various possible sources let prNumber = null; + console.log('🔍 Debugging context information:'); + console.log('Event name:', context.eventName); + console.log('Ref:', context.ref); + console.log('SHA:', context.sha); + console.log('Actor:', context.actor); + console.log('Repository:', context.repo.owner + '/' + context.repo.repo); + console.log('Payload keys:', Object.keys(context.payload)); + // Method 1: Direct PR context (pull_request events) if (context.payload.pull_request) { prNumber = context.payload.pull_request.number; + console.log('✅ Found PR via payload.pull_request:', prNumber); } // Method 2: Check if triggered by PR (workflow_run events) if (!prNumber && context.payload.workflow_run && context.payload.workflow_run.pull_requests && context.payload.workflow_run.pull_requests.length > 0) { prNumber = context.payload.workflow_run.pull_requests[0].number; + console.log('✅ Found PR via workflow_run:', prNumber); } // Method 3: Parse from ref if it's a PR branch @@ -336,34 +346,81 @@ jobs: const match = context.ref.match(/refs\/pull\/(\d+)\//); if (match) { prNumber = parseInt(match[1]); + console.log('✅ Found PR via ref parsing:', prNumber); + } + } + + // Method 4: Search for PR using commit SHA + if (!prNumber) { + console.log('🔍 Searching for PR using commit SHA...'); + try { + const { data: prs } = await github.rest.repos.listPullRequestsAssociatedWithCommit({ + owner: context.repo.owner, + repo: context.repo.repo, + commit_sha: context.sha + }); + + console.log('Found PRs for commit:', prs.length); + if (prs && prs.length > 0) { + prNumber = prs[0].number; + console.log('✅ Found PR via commit SHA search:', prNumber); + console.log('PR details:', { + number: prs[0].number, + title: prs[0].title, + state: prs[0].state + }); + } + } catch (error) { + console.log('❌ Failed to search for PR via commit SHA:', error.message); + } + } + + // Method 5: Try to find open PRs for this branch + if (!prNumber && context.ref) { + const branchName = context.ref.replace('refs/heads/', ''); + console.log('🔍 Searching for PRs for branch:', branchName); + try { + const { data: prs } = await github.rest.pulls.list({ + owner: context.repo.owner, + repo: context.repo.repo, + head: `${context.repo.owner}:${branchName}`, + state: 'open' + }); + + console.log('Found PRs for branch:', prs.length); + if (prs && prs.length > 0) { + prNumber = prs[0].number; + console.log('✅ Found PR via branch search:', prNumber); + } + } catch (error) { + console.log('❌ Failed to search for PR via branch:', error.message); } } - // Method 4: Check environment variables (some CI systems set these) + // Method 6: Check environment variables if (!prNumber && process.env.GITHUB_HEAD_REF) { - console.log('Detected fork/branch build, checking for associated PR...'); - // This is a potential PR build but we can't determine the PR number reliably + console.log('🔍 Detected branch build, GITHUB_HEAD_REF:', process.env.GITHUB_HEAD_REF); + // This is a potential PR build but we can't determine the PR number reliably from env vars alone } if (prNumber) { try { - console.log(`Posting vulnerability report to PR #${prNumber}`); + console.log(`📝 Posting vulnerability report to PR #${prNumber}`); await github.rest.issues.createComment({ issue_number: prNumber, owner: context.repo.owner, repo: context.repo.repo, body: comment }); - console.log('✅ PR comment posted successfully'); + console.log('✅ PR comment posted successfully!'); } catch (error) { console.log('❌ Failed to post PR comment:', error.message); - console.log('Vulnerability report logged in job output instead'); + console.log('Error details:', error.status, error.response?.data); + console.log('Vulnerability report will be logged in job output instead'); } } else { - console.log('📋 No PR context found - vulnerability report available in job output'); - console.log('Event:', context.eventName); - console.log('Ref:', context.ref); - console.log('Actor:', context.actor); + console.log('📋 No PR found - vulnerability report available in job output'); + console.log('All detection methods exhausted.'); } // Always log the vulnerability details to job output From edd1cc66137a52a830adfa3a1c5d8dd86eadbdaa Mon Sep 17 00:00:00 2001 From: tharindulak Date: Thu, 24 Jul 2025 22:58:26 +0530 Subject: [PATCH 113/349] Enhanced PR comment detection with explicit token and improved debugging - Added explicit GitHub token to github-script action - Enhanced debugging with full payload structure logging - Improved error handling with detailed status codes and response data - Added PR verification step before comment posting - Added fallback PR detection via recent PRs and commit SHA matching - Enhanced environment variable debugging for better troubleshooting --- .github/workflows/build.yml | 88 +++++++++++++++++++++++++++++++++---- 1 file changed, 79 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6690acc7a8b..5ad99e44e56 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -283,6 +283,7 @@ jobs: uses: actions/github-script@v7 continue-on-error: true with: + github-token: ${{ secrets.GITHUB_TOKEN }} script: | const fs = require('fs'); @@ -328,6 +329,8 @@ jobs: console.log('Actor:', context.actor); console.log('Repository:', context.repo.owner + '/' + context.repo.repo); console.log('Payload keys:', Object.keys(context.payload)); + console.log('Full payload structure:'); + console.log(JSON.stringify(context.payload, null, 2)); // Method 1: Direct PR context (pull_request events) if (context.payload.pull_request) { @@ -350,7 +353,7 @@ jobs: } } - // Method 4: Search for PR using commit SHA + // Method 4: Search for PR using commit SHA (most reliable for workflow_call) if (!prNumber) { console.log('🔍 Searching for PR using commit SHA...'); try { @@ -367,11 +370,15 @@ jobs: console.log('PR details:', { number: prs[0].number, title: prs[0].title, - state: prs[0].state + state: prs[0].state, + head: prs[0].head.ref, + base: prs[0].base.ref }); } } catch (error) { console.log('❌ Failed to search for PR via commit SHA:', error.message); + console.log('Error status:', error.status); + console.log('Error response:', error.response?.data); } } @@ -397,30 +404,93 @@ jobs: } } - // Method 6: Check environment variables - if (!prNumber && process.env.GITHUB_HEAD_REF) { - console.log('🔍 Detected branch build, GITHUB_HEAD_REF:', process.env.GITHUB_HEAD_REF); - // This is a potential PR build but we can't determine the PR number reliably from env vars alone + // Method 6: Fallback - try common PR numbers if this is clearly a PR context + if (!prNumber && (context.ref.includes('pull') || context.actor !== 'dependabot[bot]')) { + console.log('🔍 Attempting fallback PR detection...'); + // Try to extract from git refs or environment + const gitRef = process.env.GITHUB_REF || context.ref || ''; + console.log('Git ref:', gitRef); + const headRef = process.env.GITHUB_HEAD_REF || ''; + console.log('Head ref:', headRef); + + // Check if we can find recent PRs that might match our commit + try { + const { data: recentPrs } = await github.rest.pulls.list({ + owner: context.repo.owner, + repo: context.repo.repo, + state: 'open', + sort: 'updated', + per_page: 10 + }); + + console.log(`Found ${recentPrs.length} recent open PRs`); + for (const pr of recentPrs) { + console.log(`PR #${pr.number}: ${pr.title} (head: ${pr.head.sha.substring(0, 8)})`); + if (pr.head.sha === context.sha) { + prNumber = pr.number; + console.log('✅ Found PR via SHA match in recent PRs:', prNumber); + break; + } + } + } catch (error) { + console.log('❌ Failed to search recent PRs:', error.message); + } } if (prNumber) { try { - console.log(`📝 Posting vulnerability report to PR #${prNumber}`); - await github.rest.issues.createComment({ + console.log(`📝 Attempting to post vulnerability report to PR #${prNumber}`); + + // First, verify the PR exists and is accessible + const { data: prDetails } = await github.rest.pulls.get({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prNumber + }); + + console.log(`✅ PR #${prNumber} verified: "${prDetails.title}" (state: ${prDetails.state})`); + + // Now post the comment + const result = await github.rest.issues.createComment({ issue_number: prNumber, owner: context.repo.owner, repo: context.repo.repo, body: comment }); + console.log('✅ PR comment posted successfully!'); + console.log('Comment ID:', result.data.id); + console.log('Comment URL:', result.data.html_url); + } catch (error) { console.log('❌ Failed to post PR comment:', error.message); - console.log('Error details:', error.status, error.response?.data); + console.log('Error status:', error.status); + console.log('Error response:', JSON.stringify(error.response?.data, null, 2)); + + if (error.status === 404) { + console.log('🔍 PR not found - checking if PR exists...'); + try { + const { data: prCheck } = await github.rest.pulls.get({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prNumber + }); + console.log('PR exists but comment failed:', prCheck.title); + } catch (prError) { + console.log('PR does not exist:', prError.message); + } + } + console.log('Vulnerability report will be logged in job output instead'); } } else { console.log('📋 No PR found - vulnerability report available in job output'); console.log('All detection methods exhausted.'); + console.log('Environment details:'); + console.log('- GITHUB_REF:', process.env.GITHUB_REF); + console.log('- GITHUB_HEAD_REF:', process.env.GITHUB_HEAD_REF); + console.log('- GITHUB_BASE_REF:', process.env.GITHUB_BASE_REF); + console.log('- GITHUB_EVENT_NAME:', process.env.GITHUB_EVENT_NAME); } // Always log the vulnerability details to job output From 3d0a63582065a861c71531a3265134e9438eaec9 Mon Sep 17 00:00:00 2001 From: tharindulak Date: Thu, 24 Jul 2025 23:10:55 +0530 Subject: [PATCH 114/349] Add permissions and PR number input for better comment posting - Added explicit permissions for issues and pull-requests write access to Security_Scan job - Added optional prNumber input parameter to workflow for reliable PR number passing - Enhanced PR detection with input parameter priority and run context URL parsing - Added method to extract PR number from workflow run URLs This should resolve permission issues and improve PR comment reliability in workflow_call context. --- .github/workflows/build.yml | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5ad99e44e56..ac981532a82 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,6 +3,10 @@ name: Build and run Tests on: workflow_call: inputs: + prNumber: + description: Pull request number for commenting + type: number + required: false isPreRelease: default: true type: boolean @@ -172,6 +176,10 @@ jobs: needs: Build_Stage runs-on: ubuntu-latest timeout-minutes: 15 + permissions: + contents: read + issues: write + pull-requests: write steps: - name: Restore build uses: actions/download-artifact@v4 @@ -332,6 +340,13 @@ jobs: console.log('Full payload structure:'); console.log(JSON.stringify(context.payload, null, 2)); + // Method 0: Check if PR number is provided as input + const inputPrNumber = '${{ inputs.prNumber }}'; + if (inputPrNumber && inputPrNumber !== '' && inputPrNumber !== 'null') { + prNumber = parseInt(inputPrNumber); + console.log('✅ Found PR via input parameter:', prNumber); + } + // Method 1: Direct PR context (pull_request events) if (context.payload.pull_request) { prNumber = context.payload.pull_request.number; @@ -437,6 +452,22 @@ jobs: } } + // Method 7: Try to extract from run context if available + if (!prNumber) { + console.log('🔍 Checking for PR number in run context...'); + const runUrl = process.env.GITHUB_SERVER_URL + '/' + process.env.GITHUB_REPOSITORY + '/actions/runs/' + process.env.GITHUB_RUN_ID; + console.log('Run URL:', runUrl); + + // Check if there's a pattern in the workflow context that might indicate PR + if (context.payload.workflow_run && context.payload.workflow_run.html_url) { + const urlMatch = context.payload.workflow_run.html_url.match(/pr=(\d+)/); + if (urlMatch) { + prNumber = parseInt(urlMatch[1]); + console.log('✅ Found PR via workflow run URL:', prNumber); + } + } + } + if (prNumber) { try { console.log(`📝 Attempting to post vulnerability report to PR #${prNumber}`); From 338f249db2a0b9e30e5e92892b9fb4f81177dd8d Mon Sep 17 00:00:00 2001 From: tharindulak Date: Thu, 24 Jul 2025 23:27:45 +0530 Subject: [PATCH 115/349] Fix PR comment posting by passing PR number from calling workflow - Modified test-pr.yml to pass github.event.pull_request.number to build.yml - Enhanced build.yml with 9 different PR detection methods including input parameter - Added explicit permissions for issues and pull-requests write access - Added GITHUB_REF merge ref parsing and deep payload inspection This resolves the issue where PR comments weren't posted because the reusable workflow couldn't determine the PR number in workflow_call context. --- .github/workflows/build.yml | 31 +++++++++++++++++++++++++++++++ .github/workflows/test-pr.yml | 1 + 2 files changed, 32 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ac981532a82..4ea18cab890 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -468,6 +468,37 @@ jobs: } } + // Method 8: Extract from GitHub Actions environment (GITHUB_REF for pull request events) + if (!prNumber) { + console.log('🔍 Checking GITHUB_REF for PR information...'); + const githubRef = process.env.GITHUB_REF || ''; + console.log('GITHUB_REF:', githubRef); + + // Check if this is a merge ref (refs/pull/150/merge) + const mergeRefMatch = githubRef.match(/refs\/pull\/(\d+)\/merge/); + if (mergeRefMatch) { + prNumber = parseInt(mergeRefMatch[1]); + console.log('✅ Found PR via GITHUB_REF merge ref:', prNumber); + } + } + + // Method 9: Try to get PR number from the event payload more deeply + if (!prNumber) { + console.log('🔍 Deep inspection of event payload...'); + + // Check if this is a pull_request_target event or similar + if (context.payload.number) { + prNumber = context.payload.number; + console.log('✅ Found PR via payload.number:', prNumber); + } + + // Check for pull request in nested structures + if (!prNumber && context.payload.pull_request && context.payload.pull_request.number) { + prNumber = context.payload.pull_request.number; + console.log('✅ Found PR via nested payload.pull_request.number:', prNumber); + } + } + if (prNumber) { try { console.log(`📝 Attempting to post vulnerability report to PR #${prNumber}`); diff --git a/.github/workflows/test-pr.yml b/.github/workflows/test-pr.yml index b7a6d7cca92..f8a50275546 100644 --- a/.github/workflows/test-pr.yml +++ b/.github/workflows/test-pr.yml @@ -15,4 +15,5 @@ jobs: uses: ./.github/workflows/build.yml secrets: inherit with: + prNumber: ${{ github.event.pull_request.number }} runE2ETests: ${{ contains(github.event.pull_request.labels.*.name, 'Checks/Run with UI Tests') }} From 2ba671f1cc8d7e4d3de48ef5b5d3922cd328236a Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Fri, 25 Jul 2025 04:33:21 +0530 Subject: [PATCH 116/349] Add AIModelIcon component to render different AI model icons based on type --- .../src/components/AIModelIcon/index.tsx | 57 +++++++++++++++++++ workspaces/ballerina/bi-diagram/src/index.tsx | 1 + 2 files changed, 58 insertions(+) create mode 100644 workspaces/ballerina/bi-diagram/src/components/AIModelIcon/index.tsx diff --git a/workspaces/ballerina/bi-diagram/src/components/AIModelIcon/index.tsx b/workspaces/ballerina/bi-diagram/src/components/AIModelIcon/index.tsx new file mode 100644 index 00000000000..81084409e0b --- /dev/null +++ b/workspaces/ballerina/bi-diagram/src/components/AIModelIcon/index.tsx @@ -0,0 +1,57 @@ +/** + * 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 React from "react"; +import { OpenAiIcon } from "../../resources/icons/OpenAiIcon"; +import DefaultLlmIcon from "../../resources/icons/DefaultLlmIcon"; +import { AzureOpenAiIcon } from "../../resources/icons/AzureOpenAiIcon"; +import DeepseekIcon from "../../resources/icons/DeepseekIcon"; +import { AnthropicIcon } from "../../resources/icons/AnthropicIcon"; +import { MistralAIIcon } from "../../resources/icons/MistralAIIcon"; +import { OllamaIcon } from "../../resources/icons/OllamaIcon"; + +interface AIModelIconProps { + type: string; +} + +export function AIModelIcon(props: AIModelIconProps): React.ReactElement { + const { type } = props; + + switch (type) { + case "OpenAiProvider": + case "ai.openai": + return ; + case "AzureOpenAiProvider": + case "ai.azure": + return ; + case "AnthropicProvider": + case "ai.anthropic": + return ; + case "OllamaProvider": + case "ai.ollama": + return ; + case "MistralAiProvider": + case "ai.mistral": + return ; + case "DeepseekProvider": + case "ai.deepseek": + return ; + default: + return ; + } +} diff --git a/workspaces/ballerina/bi-diagram/src/index.tsx b/workspaces/ballerina/bi-diagram/src/index.tsx index 41c4bb57bd0..14b049ec2f5 100644 --- a/workspaces/ballerina/bi-diagram/src/index.tsx +++ b/workspaces/ballerina/bi-diagram/src/index.tsx @@ -22,6 +22,7 @@ export { MemoizedDiagram } from "./components/Diagram"; // components export { NodeIcon } from "./components/NodeIcon"; export { ConnectorIcon } from "./components/ConnectorIcon"; +export { AIModelIcon } from "./components/AIModelIcon"; // types export type { FlowNodeStyle } from "./utils/types"; From 3dcf9e88ca87bd314b49790b3caaee81f9d5e910 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Fri, 25 Jul 2025 04:34:17 +0530 Subject: [PATCH 117/349] Add CardList component to display categorized items with search functionality --- .../src/components/CardList/index.tsx | 396 ++++++++++++++++++ 1 file changed, 396 insertions(+) create mode 100644 workspaces/ballerina/ballerina-side-panel/src/components/CardList/index.tsx diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/CardList/index.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/CardList/index.tsx new file mode 100644 index 00000000000..03e976836d8 --- /dev/null +++ b/workspaces/ballerina/ballerina-side-panel/src/components/CardList/index.tsx @@ -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 React, { useEffect, useState } from "react"; +import { Button, ProgressRing, SearchBox, SidePanelBody, ThemeColors } from "@wso2/ui-toolkit"; +import styled from "@emotion/styled"; +import { BackIcon, CloseIcon, LogIcon } from "../../resources"; +import { Category, Item, Node } from "../NodeList/types"; +import { cloneDeep, debounce } from "lodash"; + +namespace S { + export const Container = styled.div<{}>` + width: 100%; + `; + + export const HeaderContainer = styled.div<{}>` + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + padding: 16px; + `; + + export const PanelBody = styled(SidePanelBody)` + height: calc(100vh - 100px); + padding-top: 0; + `; + + export const StyledSearchInput = styled(SearchBox)` + height: 30px; + `; + + export const CategorySection = styled.div<{}>` + display: flex; + flex-direction: column; + width: 100%; + margin-bottom: 24px; + `; + + export const CategoryTitle = styled.div<{}>` + font-size: 14px; + font-family: GilmerBold; + margin-bottom: 12px; + display: flex; + justify-content: space-between; + align-items: center; + `; + + export const CategoryDescription = styled.div<{}>` + font-size: 12px; + opacity: 0.7; + margin-bottom: 16px; + `; + + export const CardsContainer = styled.div<{}>` + display: flex; + flex-direction: column; + gap: 8px; + width: 100%; + `; + + export const Card = styled.div<{ enabled?: boolean }>` + display: flex; + flex-direction: row; + align-items: center; + gap: 12px; + padding: 12px; + border: 1px solid ${ThemeColors.OUTLINE_VARIANT}; + border-radius: 8px; + cursor: ${({ enabled }) => (enabled ? "pointer" : "not-allowed")}; + transition: all 0.2s ease; + background-color: ${ThemeColors.SURFACE}; + min-height: 60px; + + ${({ enabled }) => !enabled && "opacity: 0.5;"} + + &:hover { + ${({ enabled }) => + enabled && + ` + background-color: ${ThemeColors.PRIMARY_CONTAINER}; + border: 1px solid ${ThemeColors.PRIMARY}; + transform: translateY(-1px); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + `} + } + `; + + export const CardIcon = styled.div` + display: flex; + align-items: center; + justify-content: center; + width: 40px; + height: 40px; + border-radius: 6px; + background-color: ${ThemeColors.PRIMARY_CONTAINER}; + flex-shrink: 0; + + & svg { + height: 20px; + width: 20px; + } + + & img { + height: 20px; + width: 20px; + border-radius: 2px; + } + `; + + export const CardContent = styled.div` + display: flex; + flex-direction: column; + flex-grow: 1; + min-width: 0; + `; + + export const CardTitle = styled.div` + font-size: 14px; + font-weight: 500; + margin-bottom: 4px; + color: ${ThemeColors.ON_SURFACE}; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + `; + + export const CardDescription = styled.div` + font-size: 12px; + color: ${ThemeColors.ON_SURFACE_VARIANT}; + opacity: 0.8; + line-height: 1.4; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + `; + + export const Row = styled.div<{}>` + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + gap: 8px; + margin-top: 4px; + margin-bottom: 4px; + width: 100%; + `; + + export const LeftAlignRow = styled(Row)` + justify-content: flex-start; + `; + + export const BackButton = styled(Button)` + border-radius: 5px; + `; + + export const CloseButton = styled(Button)` + position: absolute; + right: 10px; + border-radius: 5px; + `; + + export const EmptyState = styled.div` + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 40px 16px; + text-align: center; + color: ${ThemeColors.ON_SURFACE_VARIANT}; + opacity: 0.7; + `; + + export const EmptyStateText = styled.div` + font-size: 14px; + margin-bottom: 8px; + `; + + export const EmptyStateSubText = styled.div` + font-size: 12px; + opacity: 0.8; + `; + + export const AddButton = styled(Button)` + border-radius: 5px; + `; +} + +export interface CardListProps { + categories: Category[]; + title?: string; + searchPlaceholder?: string; + onSelect: (id: string, metadata?: any) => void; + onSearch?: (text: string) => void; + onBack?: () => void; + onClose?: () => void; +} + +function CardList(props: CardListProps) { + const { categories, title, searchPlaceholder, onSelect, onSearch, onBack, onClose } = props; + + const [searchText, setSearchText] = useState(""); + const [isSearching, setIsSearching] = useState(false); + + useEffect(() => { + if (onSearch) { + setIsSearching(true); + debouncedSearch(searchText); + return () => debouncedSearch.cancel(); + } + }, [searchText]); + + const handleSearch = (text: string) => { + if (onSearch) { + onSearch(text); + } + }; + + const debouncedSearch = debounce(handleSearch, 500); + + const handleOnSearch = (text: string) => { + setSearchText(text); + }; + + useEffect(() => { + setIsSearching(false); + }, [categories]); + + const handleCardClick = (node: Node) => { + onSelect(node.id, { node: node.metadata }); + }; + + // Filter items based on search text (only if no onSearch prop - local filtering) + const filterItems = (items: Item[]): Item[] => { + if (!items || onSearch) return items || []; // If onSearch is provided, don't filter locally + + return items + .filter((item) => item != null) + .map((item) => { + if ("items" in item && "title" in item) { + // This is a Category + const filteredItems = filterItems(item.items); + const categoryMatches = + item.title.toLowerCase().includes(searchText.toLowerCase()) || + (item.description?.toLowerCase() || "").includes(searchText.toLowerCase()); + + if (categoryMatches || filteredItems.length > 0) { + return { + ...item, + items: filteredItems, + }; + } + return null; + } else if ("id" in item && "label" in item) { + // This is a Node + const lowerCaseTitle = item.label.toLowerCase(); + const lowerCaseDescription = item.description?.toLowerCase() || ""; + const lowerCaseSearchText = searchText.toLowerCase(); + + if ( + lowerCaseTitle.includes(lowerCaseSearchText) || + lowerCaseDescription.includes(lowerCaseSearchText) + ) { + return item; + } + return null; + } + return null; + }) + .filter(Boolean) as Item[]; + }; + + const renderCards = (items: Item[]) => { + const nodes = items.filter((item): item is Node => item != null && "id" in item && "label" in item); + + if (nodes.length === 0) { + return ( + + No items found + Try adjusting your search or explore different categories + + ); + } + + return ( + + {nodes.map((node, index) => ( + handleCardClick(node)}> + {node.icon ? node.icon : } + + {node.label} + {node.description && {node.description}} + + + ))} + + ); + }; + + const filteredCategories = onSearch + ? categories + : cloneDeep(categories).map((category) => { + if (!category || !category.items) { + return category; + } + category.items = filterItems(category.items) || []; + return category; + }); + + const hasContent = filteredCategories.some((category) => category?.items && category.items.length > 0); + + return ( + + + + {onBack && title && ( + + + + + {title} + + )} + {onClose && ( + + + + )} + + + + + + + {isSearching && ( + +
+ +
+
+ )} + + {!isSearching && ( + + {!hasContent ? ( + + No results found + Try adjusting your search terms + + ) : ( + filteredCategories.map((category, index) => { + if (!category?.items || category.items.length === 0) { + return null; + } + + return ( + + {category.title} + {category.description && ( + {category.description} + )} + {renderCards(category.items)} + + ); + }) + )} + + )} +
+ ); +} + +export { CardList }; +export default CardList; From fc9487b1767a23fe07dd71035a0763bd9848d115 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Fri, 25 Jul 2025 04:35:07 +0530 Subject: [PATCH 118/349] Enhance NodeList component to handle null items and more category --- .../src/components/NodeList/index.tsx | 77 ++++++++++++------- 1 file changed, 49 insertions(+), 28 deletions(-) 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 d1e544fc444..eb3534b5d05 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx @@ -338,8 +338,9 @@ export function NodeList(props: NodeListProps) { }; const getNodesContainer = (items: (Node | Category)[], parentCategoryTitle?: string) => { - const nodes = items.filter((item): item is Node => "id" in item && !("title" in item)); - const subcategories = items.filter((item): item is Category => "title" in item && "items" in item); + const safeItems = items.filter((item) => item != null); + const nodes = safeItems.filter((item): item is Node => "id" in item && !("title" in item)); + const subcategories = safeItems.filter((item): item is Category => "title" in item && "items" in item); return ( <> @@ -406,7 +407,8 @@ export function NodeList(props: NodeListProps) { {subcategory.title}
- {subcategory.items.length > 0 && + {subcategory.items && + subcategory.items.length > 0 && getNodesContainer(subcategory.items, parentCategoryTitle)} ); @@ -431,7 +433,8 @@ export function NodeList(props: NodeListProps) { const getCategoryContainer = (groups: Category[], isSubCategory = false, parentCategoryTitle?: string) => { const callFunctionNode = groups - .flatMap((group) => group?.items) + .flatMap((group) => group?.items || []) + .filter((item) => item != null) .find((item) => "id" in item && item.id === "FUNCTION"); const content = ( <> @@ -443,7 +446,7 @@ export function NodeList(props: NodeListProps) { const isNpFunctionCategory = isProjectFunctionsCategory && title === "Natural Functions"; const isModelProviderCategory = group.title === "Model Providers"; // Hide categories that don't have items, except for special categories that can add items - if (!group || group.items.length === 0) { + if (!group || !group.items || group.items.length === 0) { // Only show empty categories if they have add functionality if ( !isConnectionCategory && @@ -455,11 +458,11 @@ export function NodeList(props: NodeListProps) { return null; } } - if (searchText && group.items.length === 0) { + if (searchText && (!group.items || group.items.length === 0)) { return null; } // skip current integration category if onAddFunction is not provided and items are empty - if (!onAddFunction && isProjectFunctionsCategory && group.items?.length === 0) { + if (!onAddFunction && isProjectFunctionsCategory && (!group.items || group.items.length === 0)) { return null; } @@ -514,11 +517,20 @@ export function NodeList(props: NodeListProps) { )} + {onAdd && addButtonLabel && ( + + )} )} - {onAddConnection && isConnectionCategory && group.items.length === 0 && ( + {onAddConnection && isConnectionCategory && (!group.items || group.items.length === 0) && ( @@ -544,27 +556,33 @@ export function NodeList(props: NodeListProps) { }`} )} - {onAdd && addButtonLabel && group.items.length === 0 && !searchText && !isSearching && ( - - - {addButtonLabel} - - )} - {group.items.length > 0 && - (group.items.some((item) => "id" in item && !("title" in item)) || - group.items.some((item) => "title" in item && "items" in item)) - ? getNodesContainer( - group.items as (Node | Category)[], - !isSubCategory ? group.title : parentCategoryTitle - ) - : (onAddConnection && isConnectionCategory) || - (onAddFunction && isProjectFunctionsCategory) || - (onAdd && isModelProviderCategory) + {onAdd && + addButtonLabel && + (!group.items || group.items.length === 0) && + !searchText && + !isSearching && ( + + + {addButtonLabel} + + )} + {group.items && + group.items.length > 0 && + // 1. If parent group is "Connections" or "Model Providers" and ALL items don't have id, use getConnectionContainer + (group.title === "Connections" || group.title === "Model Providers") && + group.items.filter((item) => item != null).every((item) => !("id" in item)) ? getConnectionContainer(group.items as Category[]) - : getCategoryContainer( + : // 2. If ALL items don't have id (all are categories), use getCategoryContainer + group.items.filter((item) => item != null).every((item) => !("id" in item)) + ? getCategoryContainer( group.items as Category[], true, !isSubCategory ? group.title : parentCategoryTitle + ) + : // 3. Otherwise (has items with id or mixed), use getNodesContainer + getNodesContainer( + group.items as (Node | Category)[], + !isSubCategory ? group.title : parentCategoryTitle )} ); @@ -590,13 +608,16 @@ export function NodeList(props: NodeListProps) { ); - const isEmpty = React.Children.toArray(content.props.children).every((child) => child === null); + const isEmpty = React.Children.toArray(content.props.children).every((child) => child === null) && searchText; return isEmpty ?
No matching results found
: content; }; // filter out category items based on search text const filterItems = (items: Item[]): Item[] => { + if (!items) return []; + return items + .filter((item) => item != null) .map((item) => { if ("items" in item && "title" in item) { // This is a Category (like "More") @@ -635,7 +656,7 @@ export function NodeList(props: NodeListProps) { if (!category || !category.items || onSearchTextChange) { return category; } - category.items = filterItems(category.items); + category.items = filterItems(category.items) || []; return category; }); From 4efe2a8fc94320a81061cda175cda6764c873873 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Fri, 25 Jul 2025 04:36:16 +0530 Subject: [PATCH 119/349] Update FlowDiagram to support model provider functionality --- .../src/interfaces/extended-lang-client.ts | 2 +- .../ballerina-side-panel/src/index.ts | 1 + .../src/components/ButtonCard/index.tsx | 2 - .../ballerina-visualizer/src/utils/bi.tsx | 12 +- .../src/views/BI/FlowDiagram/PanelManager.tsx | 41 +- .../src/views/BI/FlowDiagram/index.tsx | 354 ++++++++++++++---- .../views/BI/Forms/FormGenerator/index.tsx | 1 - 7 files changed, 336 insertions(+), 77 deletions(-) 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 7a3cf34686f..fabba22e06b 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -728,7 +728,7 @@ export type SearchQueryParams = { includeAvailableFunctions?: string; } -export type SearchKind = 'FUNCTION' | 'CONNECTOR' | 'TYPE' | "NP_FUNCTION"; +export type SearchKind = 'FUNCTION' | 'CONNECTOR' | 'TYPE' | "NP_FUNCTION" | "MODEL_PROVIDER"; export type BISearchRequest = { position: LineRange; diff --git a/workspaces/ballerina/ballerina-side-panel/src/index.ts b/workspaces/ballerina/ballerina-side-panel/src/index.ts index 0cf54960194..6dbf77e975e 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/index.ts +++ b/workspaces/ballerina/ballerina-side-panel/src/index.ts @@ -24,5 +24,6 @@ export * from "./components/Form/types"; export * from "./components/editors"; export * from "./components/GroupList"; export * from "./components/ParamManager/ParamManager"; +export * from "./components/CardList"; export * from "./utils/path-validations"; diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/ButtonCard/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/ButtonCard/index.tsx index 84d9b0fe191..0730592434f 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/components/ButtonCard/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/components/ButtonCard/index.tsx @@ -19,7 +19,6 @@ import React from "react"; import { ThemeColors, Tooltip } from "@wso2/ui-toolkit"; import styled from "@emotion/styled"; -import { BetaSVG } from "../../views/Connectors/Marketplace/BetaSVG"; const Card = styled.div<{ active?: boolean; appearance?: ButtonCardAppearance, disabled?: boolean }>` gap: 16px; @@ -154,7 +153,6 @@ export function ButtonCard(props: ButtonCardProps) { truncate={truncate} > {title} - {isBeta && } {description && {description}} diff --git a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx index 70f2f16b39c..9d765116d15 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx @@ -25,7 +25,7 @@ import { Parameter, FormImports, } from "@wso2/ballerina-side-panel"; -import { AddNodeVisitor, RemoveNodeVisitor, NodeIcon, traverseFlow, ConnectorIcon } from "@wso2/bi-diagram"; +import { AddNodeVisitor, RemoveNodeVisitor, NodeIcon, traverseFlow, ConnectorIcon, AIModelIcon } from "@wso2/bi-diagram"; import { Category, AvailableNode, @@ -150,6 +150,16 @@ export function convertFunctionCategoriesToSidePanelCategories( return panelCategories; } +export function convertModelProviderCategoriesToSidePanelCategories(categories: Category[]): PanelCategory[] { + const panelCategories = categories.map((category) => convertDiagramCategoryToSidePanelCategory(category)); + panelCategories.forEach((category) => { + category.items?.forEach((item) => { + item.icon = ; + }); + }); + return panelCategories; +} + export function convertNodePropertiesToFormFields( nodeProperties: NodeProperties, connections?: FlowNode[], diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx index 84d8dd3cd32..0bbc5c81a16 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx @@ -16,7 +16,7 @@ * under the License. */ -import { PanelContainer, NodeList, ExpressionFormField } from "@wso2/ballerina-side-panel"; +import { PanelContainer, NodeList, CardList, ExpressionFormField } from "@wso2/ballerina-side-panel"; import { FlowNode, LineRange, SubPanel, SubPanelView, FUNCTION_TYPE, ToolData, NodeMetadata } from "@wso2/ballerina-core"; import { InlineDataMapper } from "../../InlineDataMapper"; import { HelperView } from "../HelperView"; @@ -45,6 +45,8 @@ export enum SidePanelView { FUNCTION_LIST = "FUNCTION_LIST", DATA_MAPPER_LIST = "DATA_MAPPER_LIST", NP_FUNCTION_LIST = "NP_FUNCTION_LIST", + MODEL_PROVIDERS = "MODEL_PROVIDERS", + MODEL_PROVIDER_LIST = "MODEL_PROVIDER_LIST", NEW_AGENT = "NEW_AGENT", ADD_TOOL = "ADD_TOOL", NEW_TOOL = "NEW_TOOL", @@ -72,6 +74,7 @@ interface PanelManagerProps { editForm?: boolean; updatedExpressionField?: ExpressionFormField; showProgressIndicator?: boolean; + canGoBack?: boolean; // Action handlers onClose: () => void; @@ -81,6 +84,7 @@ interface PanelManagerProps { onAddFunction?: () => void; onAddNPFunction?: () => void; onAddDataMapper?: () => void; + onAddModelProvider?: () => void; onSubmitForm: (updatedNode?: FlowNode, isDataMapperFormUpdate?: boolean) => void; onDiscardSuggestions: () => void; onSubPanel: (subPanel: SubPanel) => void; @@ -88,6 +92,7 @@ interface PanelManagerProps { onResetUpdatedExpressionField: () => void; onSearchFunction?: (searchText: string, functionType: FUNCTION_TYPE) => void; onSearchNpFunction?: (searchText: string, functionType: FUNCTION_TYPE) => void; + onSearchModelProvider?: (searchText: string, functionType: FUNCTION_TYPE) => void; onEditAgent?: () => void; // AI Agent handlers @@ -115,6 +120,7 @@ export function PanelManager(props: PanelManagerProps) { editForm, updatedExpressionField, showProgressIndicator, + canGoBack, onClose, onBack, onSelectNode, @@ -122,6 +128,7 @@ export function PanelManager(props: PanelManagerProps) { onAddFunction, onAddNPFunction, onAddDataMapper, + onAddModelProvider, onSubmitForm, onDiscardSuggestions, onSubPanel, @@ -242,7 +249,7 @@ export function PanelManager(props: PanelManagerProps) { onClose={onClose} title={"Functions"} searchPlaceholder={"Search library functions"} - onBack={onBack} + onBack={canGoBack ? onBack : undefined} /> ); @@ -255,7 +262,7 @@ export function PanelManager(props: PanelManagerProps) { onAddFunction={onAddNPFunction} onClose={onClose} title={"Natural Functions"} - onBack={onBack} + onBack={canGoBack ? onBack : undefined} /> ); @@ -270,7 +277,33 @@ export function PanelManager(props: PanelManagerProps) { onAddFunction={onAddDataMapper} onClose={onClose} title={"Data Mappers"} - onBack={onBack} + onBack={canGoBack ? onBack : undefined} + /> + ); + + case SidePanelView.MODEL_PROVIDER_LIST: + return ( + + ); + + case SidePanelView.MODEL_PROVIDERS: + return ( + ); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index 3eb42bb7abf..a0e55fe5800 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -43,12 +43,15 @@ import { UpdatedArtifactsResponse, ParentMetadata, NodeMetadata, + SearchKind, + Item, } from "@wso2/ballerina-core"; import { addDraftNodeToDiagram, convertBICategoriesToSidePanelCategories, convertFunctionCategoriesToSidePanelCategories, + convertModelProviderCategoriesToSidePanelCategories, } from "../../../utils/bi"; import { NodePosition, STNode } from "@wso2/syntax-tree"; import { View, ProgressRing, ProgressIndicator, ThemeColors } from "@wso2/ui-toolkit"; @@ -87,6 +90,14 @@ export interface BIFlowDiagramProps { onSave?: () => void; } +// Navigation stack interface +interface NavigationStackItem { + view: SidePanelView; + categories: PanelCategory[]; + selectedNode?: FlowNode; + clientName?: string; +} + export function BIFlowDiagram(props: BIFlowDiagramProps) { const { projectPath, breakpointState, syntaxTree, onUpdate, onReady, onSave } = props; const { rpcClient } = useRpcContext(); @@ -102,6 +113,9 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { const [updatedExpressionField, setUpdatedExpressionField] = useState(undefined); const [breakpointInfo, setBreakpointInfo] = useState(); + // Navigation stack for back navigation + const [navigationStack, setNavigationStack] = useState([]); + const selectedNodeRef = useRef(); const nodeTemplateRef = useRef(); const topNodeRef = useRef(); @@ -111,7 +125,8 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { const selectedClientName = useRef(); const initialCategoriesRef = useRef([]); const showEditForm = useRef(false); - const selectedNodeMetadata = useRef<{ nodeId: string, metadata: any, fileName: string }>(); + const selectedNodeMetadata = useRef<{ nodeId: string; metadata: any; fileName: string }>(); + const isCreatingNewModelProvider = useRef(false); useEffect(() => { debouncedGetFlowModel(); @@ -120,8 +135,16 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { useEffect(() => { rpcClient.onParentPopupSubmitted((parent: ParentPopupData) => { console.log(">>> on parent popup submitted", parent); - if (parent.artifactType === DIRECTORY_MAP.FUNCTION || parent.artifactType === DIRECTORY_MAP.NP_FUNCTION || parent.artifactType === DIRECTORY_MAP.DATA_MAPPER) { - handleOnSelectNode(selectedNodeMetadata.current.nodeId, selectedNodeMetadata.current.metadata, selectedNodeMetadata.current.fileName); + if ( + parent.artifactType === DIRECTORY_MAP.FUNCTION || + parent.artifactType === DIRECTORY_MAP.NP_FUNCTION || + parent.artifactType === DIRECTORY_MAP.DATA_MAPPER + ) { + handleOnSelectNode( + selectedNodeMetadata.current.nodeId, + selectedNodeMetadata.current.metadata, + selectedNodeMetadata.current.fileName + ); } else { if (!topNodeRef.current || !targetRef.current) { console.error(">>> No parent or target found"); @@ -140,6 +163,100 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { [] ); + // Navigation stack helpers + const pushToNavigationStack = ( + view: SidePanelView, + cats: PanelCategory[], + node?: FlowNode, + clientName?: string + ) => { + const newItem: NavigationStackItem = { + view, + categories: cats, + selectedNode: node, + clientName, + }; + setNavigationStack((prev) => [...prev, newItem]); + }; + + const popFromNavigationStack = () => { + setNavigationStack((prev) => { + if (prev.length === 0) return prev; + const newStack = [...prev]; + const poppedItem = newStack.pop(); + return newStack; + }); + + if (navigationStack.length > 0) { + const lastItem = navigationStack[navigationStack.length - 1]; + setSidePanelView(lastItem.view); + setCategories(lastItem.categories); + selectedNodeRef.current = lastItem.selectedNode; + selectedClientName.current = lastItem.clientName; + return true; + } + return false; + }; + + const clearNavigationStack = () => { + setNavigationStack([]); + }; + + const popNavigationStackUntilView = (targetView: SidePanelView) => { + setNavigationStack((prev) => { + const newStack = [...prev]; + while (newStack.length > 0) { + const lastItem = newStack[newStack.length - 1]; + if (lastItem.view === targetView) { + // Found the target view, restore it + setSidePanelView(lastItem.view); + setCategories(lastItem.categories); + selectedNodeRef.current = lastItem.selectedNode; + selectedClientName.current = lastItem.clientName; + return newStack; + } + newStack.pop(); + } + return []; + }); + + const targetItem = navigationStack.find((item) => item.view === targetView); + return !!targetItem; + }; + + const handleModelProviderAdded = async () => { + console.log(">>> Model provider added, navigating back to model provider list"); + + // Try to navigate back to MODEL_PROVIDER_LIST in the stack + const foundInStack = popNavigationStackUntilView(SidePanelView.MODEL_PROVIDER_LIST); + + if (foundInStack) { + setShowProgressIndicator(true); + try { + const response = await rpcClient.getBIDiagramRpcClient().getAvailableModelProviders({ + position: targetRef.current.startLine, + filePath: model?.fileName, + }); + console.log(">>> Refreshed model provider list", response); + setCategories( + convertFunctionCategoriesToSidePanelCategories( + response.categories as Category[], + FUNCTION_TYPE.REGULAR + ) + ); + setSidePanelView(SidePanelView.MODEL_PROVIDER_LIST); + setShowSidePanel(true); + } catch (error) { + console.error(">>> Error refreshing model providers", error); + } finally { + setShowProgressIndicator(false); + } + } else { + console.log(">>> MODEL_PROVIDER_LIST not found in navigation stack, closing panel"); + handleOnCloseSidePanel(); + } + }; + const getFlowModel = () => { setShowProgressIndicator(true); onUpdate(); @@ -193,10 +310,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { flowModel.nodes.forEach((node: FlowNode) => { const nodeMetadata = node?.metadata?.data as NodeMetadata; - if ( - node?.codedata?.node === "AGENT_CALL" && - nodeMetadata?.model?.name === modelVarName - ) { + if (node?.codedata?.node === "AGENT_CALL" && nodeMetadata?.model?.name === modelVarName) { setModelType(nodeMetadata.model, modelProviderName); } else if (node?.codedata?.node === "ERROR_HANDLER" && Array.isArray(node.branches)) { node.branches.forEach((branch) => { @@ -280,6 +394,8 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { targetRef.current = undefined; selectedClientName.current = undefined; showEditForm.current = false; + isCreatingNewModelProvider.current = false; + clearNavigationStack(); // restore original model if (originalFlowModel.current) { @@ -319,6 +435,14 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { return; } + // HACK: change knowledge bases kind to vector knowledge base + response.categories[1].items.forEach((item: Item) => { + const node = item as AvailableNode; + if (node.codedata?.node === "VECTOR_KNOWLEDGE_BASES") { + node.codedata.node = "VECTOR_KNOWLEDGE_BASE"; + } + }); + // Use the utility function to filter categories const filteredCategories = transformCategories(response.categories); const convertedCategories = convertBICategoriesToSidePanelCategories(filteredCategories); @@ -402,7 +526,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }); }; - const handleSearchNpFunction = async (searchText: string, functionType: FUNCTION_TYPE) => { + const handleSearch = async (searchText: string, functionType: FUNCTION_TYPE, searchKind: SearchKind) => { const request: BISearchRequest = { position: { startLine: targetRef.current.startLine, @@ -411,25 +535,45 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { filePath: model.fileName, queryMap: searchText.trim() ? { - q: searchText, - limit: 12, - offset: 0, - includeAvailableFunctions: "true", - } + q: searchText, + limit: 12, + offset: 0, + includeAvailableFunctions: "true", + } : undefined, - searchKind: "NP_FUNCTION", + searchKind, }; - console.log(">>> Search np function request", request); + console.log(`>>> Search ${searchKind.toLowerCase()} request`, request); setShowProgressIndicator(true); rpcClient .getBIDiagramRpcClient() .search(request) .then((response) => { - console.log(">>> Searched List of np functions", response); + console.log(`>>> Searched List of ${searchKind.toLowerCase()}`, response); setCategories( convertFunctionCategoriesToSidePanelCategories(response.categories as Category[], functionType) ); - setSidePanelView(SidePanelView.NP_FUNCTION_LIST); + + // Set the appropriate side panel view based on search kind and function type + let panelView: SidePanelView; + switch (searchKind) { + case "FUNCTION": + panelView = + functionType === FUNCTION_TYPE.REGULAR + ? SidePanelView.FUNCTION_LIST + : SidePanelView.DATA_MAPPER_LIST; + break; + case "NP_FUNCTION": + panelView = SidePanelView.NP_FUNCTION_LIST; + break; + case "MODEL_PROVIDER": + panelView = SidePanelView.MODEL_PROVIDER_LIST; + break; + default: + panelView = SidePanelView.NODE_LIST; + } + + setSidePanelView(panelView); setShowSidePanel(true); }) .finally(() => { @@ -437,46 +581,20 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }); }; + const handleSearchNpFunction = async (searchText: string, functionType: FUNCTION_TYPE) => { + await handleSearch(searchText, functionType, "NP_FUNCTION"); + }; + const handleSearchFunction = async (searchText: string, functionType: FUNCTION_TYPE) => { - const request: BISearchRequest = { - position: { - startLine: targetRef.current.startLine, - endLine: targetRef.current.endLine, - }, - filePath: model.fileName, - queryMap: searchText.trim() - ? { - q: searchText, - limit: 12, - offset: 0, - includeAvailableFunctions: "true", - } - : undefined, - searchKind: "FUNCTION", - }; - console.log(">>> Search function request", request); - setShowProgressIndicator(true); - rpcClient - .getBIDiagramRpcClient() - .search(request) - .then((response) => { - console.log(">>> Searched List of functions", response); - setCategories( - convertFunctionCategoriesToSidePanelCategories(response.categories as Category[], functionType) - ); - setSidePanelView( - functionType === FUNCTION_TYPE.REGULAR - ? SidePanelView.FUNCTION_LIST - : SidePanelView.DATA_MAPPER_LIST - ); - setShowSidePanel(true); - }) - .finally(() => { - setShowProgressIndicator(false); - }); + await handleSearch(searchText, functionType, "FUNCTION"); + }; + + const handleSearchModelProvider = async (searchText: string, functionType: FUNCTION_TYPE) => { + await handleSearch(searchText, functionType, "MODEL_PROVIDER"); }; const updateCurrentArtifactLocation = async (artifacts: UpdatedArtifactsResponse) => { + console.log(">>> Updating current artifact location", artifacts); // Get the updated component and update the location const currentIdentifier = (await rpcClient.getVisualizerLocation()).identifier; // Find the correct artifact by currentIdentifier (id) @@ -487,18 +605,39 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { } // 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) => resource.id === currentIdentifier || resource.name === currentIdentifier + ); if (resource) { currentArtifact = resource; } } }); - await rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.UPDATE_PROJECT_LOCATION, location: { documentUri: currentArtifact.path, position: currentArtifact.position, identifier: currentIdentifier } }); - } + if (currentArtifact) { + if (currentArtifact.type === "CONNECTION") { + // HACK: handle vector db and embedding provider added + await handleModelProviderAdded(); + return; + } + } + await rpcClient.getVisualizerRpcClient().openView({ + type: EVENT_TYPE.UPDATE_PROJECT_LOCATION, + location: { + documentUri: currentArtifact.path, + position: currentArtifact.position, + identifier: currentIdentifier, + }, + }); + }; const handleOnSelectNode = (nodeId: string, metadata?: any, fileName?: string) => { + console.log(">>> on select node", { nodeId, metadata, fileName }); selectedNodeMetadata.current = { nodeId, metadata, fileName: model?.fileName || fileName }; const { node, category } = metadata as { node: AvailableNode; category?: string }; + + // Push current state to navigation stack before navigating + pushToNavigationStack(sidePanelView, categories, selectedNodeRef.current, selectedClientName.current); + switch (node.codedata.node) { case "FUNCTION": setShowProgressIndicator(true); @@ -577,6 +716,30 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }); break; + case "MODEL_PROVIDERS": + setShowProgressIndicator(true); + rpcClient + .getBIDiagramRpcClient() + .getAvailableModelProviders({ + position: targetRef.current.startLine, + filePath: model?.fileName || fileName, + }) + .then((response) => { + console.log(">>> List of model providers", response); + setCategories( + convertFunctionCategoriesToSidePanelCategories( + response.categories as Category[], + FUNCTION_TYPE.REGULAR + ) + ); + setSidePanelView(SidePanelView.MODEL_PROVIDER_LIST); + setShowSidePanel(true); + }) + .finally(() => { + setShowProgressIndicator(false); + }); + break; + default: // default node console.log(">>> on select panel node", { nodeId, metadata }); @@ -593,6 +756,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { console.log(">>> FlowNode template", response); selectedNodeRef.current = response.flowNode; showEditForm.current = false; + // if agent_call node, then show agent config panel if (node.codedata.node === "AGENT_CALL") { setSidePanelView(SidePanelView.NEW_AGENT); @@ -627,7 +791,13 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { if (response.artifacts.length > 0) { selectedNodeRef.current = undefined; await updateCurrentArtifactLocation(response); - handleOnCloseSidePanel(); + + // If we were creating a new model provider, go back to the available model providers list + if (isCreatingNewModelProvider.current) { + isCreatingNewModelProvider.current = false; + } else { + handleOnCloseSidePanel(); + } } else { console.error(">>> Error updating source code", response); } @@ -760,18 +930,35 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }; const handleOnFormBack = () => { - if ( - sidePanelView === SidePanelView.FUNCTION_LIST || - sidePanelView === SidePanelView.DATA_MAPPER_LIST || - sidePanelView === SidePanelView.NP_FUNCTION_LIST - ) { - setCategories(initialCategoriesRef.current); - setSidePanelView(SidePanelView.NODE_LIST); - } else { - setSidePanelView(SidePanelView.NODE_LIST); - setSubPanel({ view: SubPanelView.UNDEFINED }); + // Try to navigate back using the navigation stack + const didNavigateBack = popFromNavigationStack(); + + if (!didNavigateBack) { + // Fallback to original logic if stack is empty + if (sidePanelView === SidePanelView.MODEL_PROVIDERS) { + handleOnSelectNode( + selectedNodeMetadata.current.nodeId, + selectedNodeMetadata.current.metadata, + selectedNodeMetadata.current.fileName + ); + setCategories([]); + setSidePanelView(SidePanelView.MODEL_PROVIDER_LIST); + } else if ( + sidePanelView === SidePanelView.FUNCTION_LIST || + sidePanelView === SidePanelView.DATA_MAPPER_LIST || + sidePanelView === SidePanelView.NP_FUNCTION_LIST || + sidePanelView === SidePanelView.MODEL_PROVIDER_LIST + ) { + setCategories(initialCategoriesRef.current); + setSidePanelView(SidePanelView.NODE_LIST); + } else { + setSidePanelView(SidePanelView.NODE_LIST); + setSubPanel({ view: SubPanelView.UNDEFINED }); + } + selectedNodeRef.current = undefined; } - selectedNodeRef.current = undefined; + + setSubPanel({ view: SubPanelView.UNDEFINED }); }; const handleOnAddConnection = () => { @@ -832,6 +1019,34 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }); }; + const handleOnAddNewModelProvider = () => { + console.log(">>> Adding new model provider"); + isCreatingNewModelProvider.current = true; + setShowProgressIndicator(true); + + // Push current state to navigation stack + pushToNavigationStack(sidePanelView, categories, selectedNodeRef.current, selectedClientName.current); + + // Use search to get available model provider types + rpcClient + .getBIDiagramRpcClient() + .search({ + position: { startLine: targetRef.current.startLine, endLine: targetRef.current.endLine }, + filePath: model?.fileName, + queryMap: undefined, + searchKind: "MODEL_PROVIDER", + }) + .then((response) => { + console.log(">>> Available model provider types", response); + setCategories(convertModelProviderCategoriesToSidePanelCategories(response.categories as Category[])); + setSidePanelView(SidePanelView.MODEL_PROVIDERS); + setShowSidePanel(true); + }) + .finally(() => { + setShowProgressIndicator(false); + }); + }; + const handleOnGoToSource = (node: FlowNode) => { const targetPosition: NodePosition = { startLine: node.codedata.lineRange.startLine.line, @@ -1235,6 +1450,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { projectPath={projectPath} editForm={showEditForm.current} updatedExpressionField={updatedExpressionField} + canGoBack={navigationStack.length > 0} // Regular callbacks onClose={handleOnCloseSidePanel} onBack={handleOnFormBack} @@ -1244,6 +1460,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { onAddFunction={handleOnAddFunction} onAddNPFunction={handleOnAddNPFunction} onAddDataMapper={handleOnAddDataMapper} + onAddModelProvider={handleOnAddNewModelProvider} onSubmitForm={handleOnFormSubmit} showProgressIndicator={showProgressIndicator} onDiscardSuggestions={onDiscardSuggestions} @@ -1252,6 +1469,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { onResetUpdatedExpressionField={handleResetUpdatedExpressionField} onSearchFunction={handleSearchFunction} onSearchNpFunction={handleSearchNpFunction} + onSearchModelProvider={handleSearchModelProvider} // AI Agent specific callbacks onEditAgent={handleEditAgent} onSelectTool={handleOnSelectTool} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx index a80f38f7005..0d8727717b0 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx @@ -147,7 +147,6 @@ export function FormGenerator(props: FormProps) { clientName, targetLineRange, projectPath, - editForm, showProgressIndicator, isGraphql, onSubmit, From dfbbdfbbf3637341b1c16bb48330168779d7a6b8 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Fri, 25 Jul 2025 05:13:19 +0530 Subject: [PATCH 120/349] Update BI diagram to support vector store functionality --- .../src/interfaces/extended-lang-client.ts | 2 +- .../src/components/NodeList/index.tsx | 9 +- .../ballerina-visualizer/src/utils/bi.tsx | 4 + .../src/views/BI/FlowDiagram/PanelManager.tsx | 35 +++++ .../src/views/BI/FlowDiagram/index.tsx | 125 ++++++++++++++++-- 5 files changed, 162 insertions(+), 13 deletions(-) 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 fabba22e06b..4d0d7e0f9ff 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -728,7 +728,7 @@ export type SearchQueryParams = { includeAvailableFunctions?: string; } -export type SearchKind = 'FUNCTION' | 'CONNECTOR' | 'TYPE' | "NP_FUNCTION" | "MODEL_PROVIDER"; +export type SearchKind = 'FUNCTION' | 'CONNECTOR' | 'TYPE' | "NP_FUNCTION" | "MODEL_PROVIDER" | "VECTOR_STORE"; export type BISearchRequest = { position: LineRange; 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 eb3534b5d05..c042f8a4955 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx @@ -445,6 +445,7 @@ export function NodeList(props: NodeListProps) { const isAgentCategory = group.title === "Agents"; const isNpFunctionCategory = isProjectFunctionsCategory && title === "Natural Functions"; const isModelProviderCategory = group.title === "Model Providers"; + const isVectorStoreCategory = group.title === "Vector Stores"; // 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 @@ -453,7 +454,8 @@ export function NodeList(props: NodeListProps) { !isProjectFunctionsCategory && !isAgentCategory && !isNpFunctionCategory && - !isModelProviderCategory + !isModelProviderCategory && + !isVectorStoreCategory ) { return null; } @@ -558,6 +560,7 @@ export function NodeList(props: NodeListProps) { )} {onAdd && addButtonLabel && + (isModelProviderCategory || isVectorStoreCategory) && (!group.items || group.items.length === 0) && !searchText && !isSearching && ( @@ -568,8 +571,8 @@ export function NodeList(props: NodeListProps) { )} {group.items && group.items.length > 0 && - // 1. If parent group is "Connections" or "Model Providers" and ALL items don't have id, use getConnectionContainer - (group.title === "Connections" || group.title === "Model Providers") && + // 1. If parent group is "Connections", "Model Providers", or "Vector Stores" and ALL items don't have id, use getConnectionContainer + (group.title === "Connections" || group.title === "Model Providers" || group.title === "Vector Stores") && group.items.filter((item) => item != null).every((item) => !("id" in item)) ? getConnectionContainer(group.items as Category[]) : // 2. If ALL items don't have id (all are categories), use getCategoryContainer diff --git a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx index 9d765116d15..9bab55349a4 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx @@ -160,6 +160,10 @@ export function convertModelProviderCategoriesToSidePanelCategories(categories: return panelCategories; } +export function convertVectorStoreCategoriesToSidePanelCategories(categories: Category[]): PanelCategory[] { + return categories.map((category) => convertDiagramCategoryToSidePanelCategory(category)); +} + export function convertNodePropertiesToFormFields( nodeProperties: NodeProperties, connections?: FlowNode[], diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx index 0bbc5c81a16..c38f107c435 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx @@ -47,6 +47,8 @@ export enum SidePanelView { NP_FUNCTION_LIST = "NP_FUNCTION_LIST", MODEL_PROVIDERS = "MODEL_PROVIDERS", MODEL_PROVIDER_LIST = "MODEL_PROVIDER_LIST", + VECTOR_STORES = "VECTOR_STORES", + VECTOR_STORE_LIST = "VECTOR_STORE_LIST", NEW_AGENT = "NEW_AGENT", ADD_TOOL = "ADD_TOOL", NEW_TOOL = "NEW_TOOL", @@ -85,6 +87,7 @@ interface PanelManagerProps { onAddNPFunction?: () => void; onAddDataMapper?: () => void; onAddModelProvider?: () => void; + onAddVectorStore?: () => void; onSubmitForm: (updatedNode?: FlowNode, isDataMapperFormUpdate?: boolean) => void; onDiscardSuggestions: () => void; onSubPanel: (subPanel: SubPanel) => void; @@ -93,6 +96,7 @@ interface PanelManagerProps { onSearchFunction?: (searchText: string, functionType: FUNCTION_TYPE) => void; onSearchNpFunction?: (searchText: string, functionType: FUNCTION_TYPE) => void; onSearchModelProvider?: (searchText: string, functionType: FUNCTION_TYPE) => void; + onSearchVectorStore?: (searchText: string, functionType: FUNCTION_TYPE) => void; onEditAgent?: () => void; // AI Agent handlers @@ -129,6 +133,7 @@ export function PanelManager(props: PanelManagerProps) { onAddNPFunction, onAddDataMapper, onAddModelProvider, + onAddVectorStore, onSubmitForm, onDiscardSuggestions, onSubPanel, @@ -136,6 +141,7 @@ export function PanelManager(props: PanelManagerProps) { onResetUpdatedExpressionField, onSearchFunction, onSearchNpFunction, + onSearchVectorStore, } = props; const [panelView, setPanelView] = useState(sidePanelView); @@ -307,6 +313,35 @@ export function PanelManager(props: PanelManagerProps) { /> ); + case SidePanelView.VECTOR_STORE_LIST: + return ( + + onSearchVectorStore?.(searchText, FUNCTION_TYPE.REGULAR) + } + onBack={canGoBack ? onBack : undefined} + /> + ); + + case SidePanelView.VECTOR_STORES: + return ( + + ); + case SidePanelView.FORM: return ( (false); const selectedNodeMetadata = useRef<{ nodeId: string; metadata: any; fileName: string }>(); const isCreatingNewModelProvider = useRef(false); + const isCreatingNewVectorStore = useRef(false); useEffect(() => { debouncedGetFlowModel(); @@ -257,6 +259,39 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { } }; + const handleVectorStoreAdded = async () => { + console.log(">>> Vector store added, navigating back to vector store list"); + + // Try to navigate back to VECTOR_STORE_LIST in the stack + const foundInStack = popNavigationStackUntilView(SidePanelView.VECTOR_STORE_LIST); + + if (foundInStack) { + setShowProgressIndicator(true); + try { + const response = await rpcClient.getBIDiagramRpcClient().getAvailableVectorStores({ + position: targetRef.current.startLine, + filePath: model?.fileName, + }); + console.log(">>> Refreshed vector store list", response); + setCategories( + convertFunctionCategoriesToSidePanelCategories( + response.categories as Category[], + FUNCTION_TYPE.REGULAR + ) + ); + setSidePanelView(SidePanelView.VECTOR_STORE_LIST); + setShowSidePanel(true); + } catch (error) { + console.error(">>> Error refreshing vector stores", error); + } finally { + setShowProgressIndicator(false); + } + } else { + console.log(">>> VECTOR_STORE_LIST not found in navigation stack, closing panel"); + handleOnCloseSidePanel(); + } + }; + const getFlowModel = () => { setShowProgressIndicator(true); onUpdate(); @@ -569,6 +604,9 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { case "MODEL_PROVIDER": panelView = SidePanelView.MODEL_PROVIDER_LIST; break; + case "VECTOR_STORE" as any: // Temporary type assertion to resolve linter error + panelView = SidePanelView.VECTOR_STORE_LIST; + break; default: panelView = SidePanelView.NODE_LIST; } @@ -593,6 +631,10 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { await handleSearch(searchText, functionType, "MODEL_PROVIDER"); }; + const handleSearchVectorStore = async (searchText: string, functionType: FUNCTION_TYPE) => { + await handleSearch(searchText, functionType, "VECTOR_STORE" as any); // Temporary type assertion to resolve linter error + }; + const updateCurrentArtifactLocation = async (artifacts: UpdatedArtifactsResponse) => { console.log(">>> Updating current artifact location", artifacts); // Get the updated component and update the location @@ -614,11 +656,17 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { } }); if (currentArtifact) { - if (currentArtifact.type === "CONNECTION") { - // HACK: handle vector db and embedding provider added + console.log(">>> currentArtifact", currentArtifact); + if (currentArtifact.type === "CONNECTION" && isCreatingNewModelProvider.current) { + isCreatingNewModelProvider.current = false; await handleModelProviderAdded(); return; } + if (currentArtifact.type === "VARIABLE" && isCreatingNewVectorStore.current) { + isCreatingNewVectorStore.current = false; + await handleVectorStoreAdded(); + return; + } } await rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.UPDATE_PROJECT_LOCATION, @@ -740,6 +788,30 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }); break; + case "VECTOR_STORES": + setShowProgressIndicator(true); + rpcClient + .getBIDiagramRpcClient() + .getAvailableVectorStores({ + position: targetRef.current.startLine, + filePath: model?.fileName || fileName, + }) + .then((response) => { + console.log(">>> List of vector stores", response); + setCategories( + convertFunctionCategoriesToSidePanelCategories( + response.categories as Category[], + FUNCTION_TYPE.REGULAR + ) + ); + setSidePanelView(SidePanelView.VECTOR_STORE_LIST); + setShowSidePanel(true); + }) + .finally(() => { + setShowProgressIndicator(false); + }); + break; + default: // default node console.log(">>> on select panel node", { nodeId, metadata }); @@ -792,12 +864,8 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { selectedNodeRef.current = undefined; await updateCurrentArtifactLocation(response); - // If we were creating a new model provider, go back to the available model providers list - if (isCreatingNewModelProvider.current) { - isCreatingNewModelProvider.current = false; - } else { - handleOnCloseSidePanel(); - } + // Handle creation completion + handleOnCloseSidePanel(); } else { console.error(">>> Error updating source code", response); } @@ -943,11 +1011,20 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { ); setCategories([]); setSidePanelView(SidePanelView.MODEL_PROVIDER_LIST); + } else if (sidePanelView === SidePanelView.VECTOR_STORES) { + handleOnSelectNode( + selectedNodeMetadata.current.nodeId, + selectedNodeMetadata.current.metadata, + selectedNodeMetadata.current.fileName + ); + setCategories([]); + setSidePanelView(SidePanelView.VECTOR_STORE_LIST); } else if ( sidePanelView === SidePanelView.FUNCTION_LIST || sidePanelView === SidePanelView.DATA_MAPPER_LIST || sidePanelView === SidePanelView.NP_FUNCTION_LIST || - sidePanelView === SidePanelView.MODEL_PROVIDER_LIST + sidePanelView === SidePanelView.MODEL_PROVIDER_LIST || + sidePanelView === SidePanelView.VECTOR_STORE_LIST ) { setCategories(initialCategoriesRef.current); setSidePanelView(SidePanelView.NODE_LIST); @@ -1047,6 +1124,34 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }); }; + const handleOnAddNewVectorStore = () => { + console.log(">>> Adding new vector store"); + isCreatingNewVectorStore.current = true; + setShowProgressIndicator(true); + + // Push current state to navigation stack + pushToNavigationStack(sidePanelView, categories, selectedNodeRef.current, selectedClientName.current); + + // Use search to get available vector store types + rpcClient + .getBIDiagramRpcClient() + .search({ + position: { startLine: targetRef.current.startLine, endLine: targetRef.current.endLine }, + filePath: model?.fileName, + queryMap: undefined, + searchKind: "VECTOR_STORE" as any, // Temporary type assertion to resolve linter error + }) + .then((response) => { + console.log(">>> Available vector store types", response); + setCategories(convertVectorStoreCategoriesToSidePanelCategories(response.categories as Category[])); + setSidePanelView(SidePanelView.VECTOR_STORES); + setShowSidePanel(true); + }) + .finally(() => { + setShowProgressIndicator(false); + }); + }; + const handleOnGoToSource = (node: FlowNode) => { const targetPosition: NodePosition = { startLine: node.codedata.lineRange.startLine.line, @@ -1461,6 +1566,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { onAddNPFunction={handleOnAddNPFunction} onAddDataMapper={handleOnAddDataMapper} onAddModelProvider={handleOnAddNewModelProvider} + onAddVectorStore={handleOnAddNewVectorStore} onSubmitForm={handleOnFormSubmit} showProgressIndicator={showProgressIndicator} onDiscardSuggestions={onDiscardSuggestions} @@ -1470,6 +1576,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { onSearchFunction={handleSearchFunction} onSearchNpFunction={handleSearchNpFunction} onSearchModelProvider={handleSearchModelProvider} + onSearchVectorStore={handleSearchVectorStore} // AI Agent specific callbacks onEditAgent={handleEditAgent} onSelectTool={handleOnSelectTool} From a94f06274317ca43d1962e3da694785b7d440f18 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Fri, 25 Jul 2025 05:21:46 +0530 Subject: [PATCH 121/349] Add support for embedding providers in BI Diagram --- .../src/interfaces/extended-lang-client.ts | 2 +- .../grammar/ballerina-grammar | 2 +- .../src/components/NodeList/index.tsx | 10 +- .../ballerina-visualizer/src/utils/bi.tsx | 4 + .../src/views/BI/FlowDiagram/PanelManager.tsx | 35 ++++++ .../src/views/BI/FlowDiagram/index.tsx | 114 +++++++++++++++++- 6 files changed, 159 insertions(+), 8 deletions(-) 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 4d0d7e0f9ff..4b9f265f436 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -728,7 +728,7 @@ export type SearchQueryParams = { includeAvailableFunctions?: string; } -export type SearchKind = 'FUNCTION' | 'CONNECTOR' | 'TYPE' | "NP_FUNCTION" | "MODEL_PROVIDER" | "VECTOR_STORE"; +export type SearchKind = 'FUNCTION' | 'CONNECTOR' | 'TYPE' | "NP_FUNCTION" | "MODEL_PROVIDER" | "VECTOR_STORE" | "EMBEDDING_PROVIDER"; export type BISearchRequest = { position: LineRange; diff --git a/workspaces/ballerina/ballerina-extension/grammar/ballerina-grammar b/workspaces/ballerina/ballerina-extension/grammar/ballerina-grammar index 1d5efa4d49d..eb62358724d 160000 --- a/workspaces/ballerina/ballerina-extension/grammar/ballerina-grammar +++ b/workspaces/ballerina/ballerina-extension/grammar/ballerina-grammar @@ -1 +1 @@ -Subproject commit 1d5efa4d49d7f1b85c89db9bfbd9e1f4428d720d +Subproject commit eb62358724deaad784458ae1d5ec33c4d164e483 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 c042f8a4955..c27e7926ccf 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx @@ -446,6 +446,7 @@ export function NodeList(props: NodeListProps) { const isNpFunctionCategory = isProjectFunctionsCategory && title === "Natural Functions"; const isModelProviderCategory = group.title === "Model Providers"; const isVectorStoreCategory = group.title === "Vector Stores"; + const isEmbeddingProviderCategory = group.title === "Embedding Providers"; // 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 @@ -455,7 +456,8 @@ export function NodeList(props: NodeListProps) { !isAgentCategory && !isNpFunctionCategory && !isModelProviderCategory && - !isVectorStoreCategory + !isVectorStoreCategory && + !isEmbeddingProviderCategory ) { return null; } @@ -560,7 +562,7 @@ export function NodeList(props: NodeListProps) { )} {onAdd && addButtonLabel && - (isModelProviderCategory || isVectorStoreCategory) && + (isModelProviderCategory || isVectorStoreCategory || isEmbeddingProviderCategory) && (!group.items || group.items.length === 0) && !searchText && !isSearching && ( @@ -571,8 +573,8 @@ export function NodeList(props: NodeListProps) { )} {group.items && group.items.length > 0 && - // 1. If parent group is "Connections", "Model Providers", or "Vector Stores" and ALL items don't have id, use getConnectionContainer - (group.title === "Connections" || group.title === "Model Providers" || group.title === "Vector Stores") && + // 1. If parent group is "Connections", "Model Providers", "Vector Stores", or "Embedding Providers" and ALL items don't have id, use getConnectionContainer + (group.title === "Connections" || group.title === "Model Providers" || group.title === "Vector Stores" || group.title === "Embedding Providers") && group.items.filter((item) => item != null).every((item) => !("id" in item)) ? getConnectionContainer(group.items as Category[]) : // 2. If ALL items don't have id (all are categories), use getCategoryContainer diff --git a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx index 9bab55349a4..189c00624ff 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx @@ -164,6 +164,10 @@ export function convertVectorStoreCategoriesToSidePanelCategories(categories: Ca return categories.map((category) => convertDiagramCategoryToSidePanelCategory(category)); } +export function convertEmbeddingProviderCategoriesToSidePanelCategories(categories: Category[]): PanelCategory[] { + return categories.map((category) => convertDiagramCategoryToSidePanelCategory(category)); +} + export function convertNodePropertiesToFormFields( nodeProperties: NodeProperties, connections?: FlowNode[], diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx index c38f107c435..dbc00ed80d7 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx @@ -49,6 +49,8 @@ export enum SidePanelView { MODEL_PROVIDER_LIST = "MODEL_PROVIDER_LIST", VECTOR_STORES = "VECTOR_STORES", VECTOR_STORE_LIST = "VECTOR_STORE_LIST", + EMBEDDING_PROVIDERS = "EMBEDDING_PROVIDERS", + EMBEDDING_PROVIDER_LIST = "EMBEDDING_PROVIDER_LIST", NEW_AGENT = "NEW_AGENT", ADD_TOOL = "ADD_TOOL", NEW_TOOL = "NEW_TOOL", @@ -88,6 +90,7 @@ interface PanelManagerProps { onAddDataMapper?: () => void; onAddModelProvider?: () => void; onAddVectorStore?: () => void; + onAddEmbeddingProvider?: () => void; onSubmitForm: (updatedNode?: FlowNode, isDataMapperFormUpdate?: boolean) => void; onDiscardSuggestions: () => void; onSubPanel: (subPanel: SubPanel) => void; @@ -97,6 +100,7 @@ interface PanelManagerProps { onSearchNpFunction?: (searchText: string, functionType: FUNCTION_TYPE) => void; onSearchModelProvider?: (searchText: string, functionType: FUNCTION_TYPE) => void; onSearchVectorStore?: (searchText: string, functionType: FUNCTION_TYPE) => void; + onSearchEmbeddingProvider?: (searchText: string, functionType: FUNCTION_TYPE) => void; onEditAgent?: () => void; // AI Agent handlers @@ -134,6 +138,7 @@ export function PanelManager(props: PanelManagerProps) { onAddDataMapper, onAddModelProvider, onAddVectorStore, + onAddEmbeddingProvider, onSubmitForm, onDiscardSuggestions, onSubPanel, @@ -142,6 +147,7 @@ export function PanelManager(props: PanelManagerProps) { onSearchFunction, onSearchNpFunction, onSearchVectorStore, + onSearchEmbeddingProvider, } = props; const [panelView, setPanelView] = useState(sidePanelView); @@ -342,6 +348,35 @@ export function PanelManager(props: PanelManagerProps) { /> ); + case SidePanelView.EMBEDDING_PROVIDER_LIST: + return ( + + onSearchEmbeddingProvider?.(searchText, FUNCTION_TYPE.REGULAR) + } + onBack={canGoBack ? onBack : undefined} + /> + ); + + case SidePanelView.EMBEDDING_PROVIDERS: + return ( + + ); + case SidePanelView.FORM: return ( (); const isCreatingNewModelProvider = useRef(false); const isCreatingNewVectorStore = useRef(false); + const isCreatingNewEmbeddingProvider = useRef(false); useEffect(() => { debouncedGetFlowModel(); @@ -292,6 +294,39 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { } }; + const handleEmbeddingProviderAdded = async () => { + console.log(">>> Embedding provider added, navigating back to embedding provider list"); + + // Try to navigate back to EMBEDDING_PROVIDER_LIST in the stack + const foundInStack = popNavigationStackUntilView(SidePanelView.EMBEDDING_PROVIDER_LIST); + + if (foundInStack) { + setShowProgressIndicator(true); + try { + const response = await rpcClient.getBIDiagramRpcClient().getAvailableEmbeddingProviders({ + position: targetRef.current.startLine, + filePath: model?.fileName, + }); + console.log(">>> Refreshed embedding provider list", response); + setCategories( + convertFunctionCategoriesToSidePanelCategories( + response.categories as Category[], + FUNCTION_TYPE.REGULAR + ) + ); + setSidePanelView(SidePanelView.EMBEDDING_PROVIDER_LIST); + setShowSidePanel(true); + } catch (error) { + console.error(">>> Error refreshing embedding providers", error); + } finally { + setShowProgressIndicator(false); + } + } else { + console.log(">>> EMBEDDING_PROVIDER_LIST not found in navigation stack, closing panel"); + handleOnCloseSidePanel(); + } + }; + const getFlowModel = () => { setShowProgressIndicator(true); onUpdate(); @@ -604,9 +639,12 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { case "MODEL_PROVIDER": panelView = SidePanelView.MODEL_PROVIDER_LIST; break; - case "VECTOR_STORE" as any: // Temporary type assertion to resolve linter error + case "VECTOR_STORE": panelView = SidePanelView.VECTOR_STORE_LIST; break; + case "EMBEDDING_PROVIDER": + panelView = SidePanelView.EMBEDDING_PROVIDER_LIST; + break; default: panelView = SidePanelView.NODE_LIST; } @@ -635,6 +673,10 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { await handleSearch(searchText, functionType, "VECTOR_STORE" as any); // Temporary type assertion to resolve linter error }; + const handleSearchEmbeddingProvider = async (searchText: string, functionType: FUNCTION_TYPE) => { + await handleSearch(searchText, functionType, "EMBEDDING_PROVIDER" as any); // Temporary type assertion to resolve linter error + }; + const updateCurrentArtifactLocation = async (artifacts: UpdatedArtifactsResponse) => { console.log(">>> Updating current artifact location", artifacts); // Get the updated component and update the location @@ -667,6 +709,11 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { await handleVectorStoreAdded(); return; } + if (currentArtifact.type === "VARIABLE" && isCreatingNewEmbeddingProvider.current) { + isCreatingNewEmbeddingProvider.current = false; + await handleEmbeddingProviderAdded(); + return; + } } await rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.UPDATE_PROJECT_LOCATION, @@ -812,6 +859,30 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }); break; + case "EMBEDDING_PROVIDERS": + setShowProgressIndicator(true); + rpcClient + .getBIDiagramRpcClient() + .getAvailableEmbeddingProviders({ + position: targetRef.current.startLine, + filePath: model?.fileName || fileName, + }) + .then((response) => { + console.log(">>> List of embedding providers", response); + setCategories( + convertFunctionCategoriesToSidePanelCategories( + response.categories as Category[], + FUNCTION_TYPE.REGULAR + ) + ); + setSidePanelView(SidePanelView.EMBEDDING_PROVIDER_LIST); + setShowSidePanel(true); + }) + .finally(() => { + setShowProgressIndicator(false); + }); + break; + default: // default node console.log(">>> on select panel node", { nodeId, metadata }); @@ -1019,12 +1090,21 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { ); setCategories([]); setSidePanelView(SidePanelView.VECTOR_STORE_LIST); + } else if (sidePanelView === SidePanelView.EMBEDDING_PROVIDERS) { + handleOnSelectNode( + selectedNodeMetadata.current.nodeId, + selectedNodeMetadata.current.metadata, + selectedNodeMetadata.current.fileName + ); + setCategories([]); + setSidePanelView(SidePanelView.EMBEDDING_PROVIDER_LIST); } else if ( sidePanelView === SidePanelView.FUNCTION_LIST || sidePanelView === SidePanelView.DATA_MAPPER_LIST || sidePanelView === SidePanelView.NP_FUNCTION_LIST || sidePanelView === SidePanelView.MODEL_PROVIDER_LIST || - sidePanelView === SidePanelView.VECTOR_STORE_LIST + sidePanelView === SidePanelView.VECTOR_STORE_LIST || + sidePanelView === SidePanelView.EMBEDDING_PROVIDER_LIST ) { setCategories(initialCategoriesRef.current); setSidePanelView(SidePanelView.NODE_LIST); @@ -1152,6 +1232,34 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }); }; + const handleOnAddNewEmbeddingProvider = () => { + console.log(">>> Adding new embedding provider"); + isCreatingNewEmbeddingProvider.current = true; + setShowProgressIndicator(true); + + // Push current state to navigation stack + pushToNavigationStack(sidePanelView, categories, selectedNodeRef.current, selectedClientName.current); + + // Use search to get available embedding provider types + rpcClient + .getBIDiagramRpcClient() + .search({ + position: { startLine: targetRef.current.startLine, endLine: targetRef.current.endLine }, + filePath: model?.fileName, + queryMap: undefined, + searchKind: "EMBEDDING_PROVIDER" as any, // Temporary type assertion to resolve linter error + }) + .then((response) => { + console.log(">>> Available embedding provider types", response); + setCategories(convertEmbeddingProviderCategoriesToSidePanelCategories(response.categories as Category[])); + setSidePanelView(SidePanelView.EMBEDDING_PROVIDERS); + setShowSidePanel(true); + }) + .finally(() => { + setShowProgressIndicator(false); + }); + }; + const handleOnGoToSource = (node: FlowNode) => { const targetPosition: NodePosition = { startLine: node.codedata.lineRange.startLine.line, @@ -1567,6 +1675,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { onAddDataMapper={handleOnAddDataMapper} onAddModelProvider={handleOnAddNewModelProvider} onAddVectorStore={handleOnAddNewVectorStore} + onAddEmbeddingProvider={handleOnAddNewEmbeddingProvider} onSubmitForm={handleOnFormSubmit} showProgressIndicator={showProgressIndicator} onDiscardSuggestions={onDiscardSuggestions} @@ -1577,6 +1686,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { onSearchNpFunction={handleSearchNpFunction} onSearchModelProvider={handleSearchModelProvider} onSearchVectorStore={handleSearchVectorStore} + onSearchEmbeddingProvider={handleSearchEmbeddingProvider} // AI Agent specific callbacks onEditAgent={handleEditAgent} onSelectTool={handleOnSelectTool} From a79c2fcc4788d5c6bd72f89294a97cd9a881c2e2 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Fri, 25 Jul 2025 05:40:52 +0530 Subject: [PATCH 122/349] Add support for vector knowledge bases in BI Diagram --- .../src/interfaces/extended-lang-client.ts | 2 +- .../src/components/NodeList/index.tsx | 10 +- .../ballerina-visualizer/src/utils/bi.tsx | 4 + .../src/views/BI/FlowDiagram/PanelManager.tsx | 22 +++ .../src/views/BI/FlowDiagram/index.tsx | 129 ++++++++++++++++-- 5 files changed, 149 insertions(+), 18 deletions(-) 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 4b9f265f436..f7237b93b31 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -728,7 +728,7 @@ export type SearchQueryParams = { includeAvailableFunctions?: string; } -export type SearchKind = 'FUNCTION' | 'CONNECTOR' | 'TYPE' | "NP_FUNCTION" | "MODEL_PROVIDER" | "VECTOR_STORE" | "EMBEDDING_PROVIDER"; +export type SearchKind = 'FUNCTION' | 'CONNECTOR' | 'TYPE' | "NP_FUNCTION" | "MODEL_PROVIDER" | "VECTOR_STORE" | "EMBEDDING_PROVIDER" | "VECTOR_KNOWLEDGE_BASE"; export type BISearchRequest = { position: LineRange; 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 c27e7926ccf..8db321c20ac 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx @@ -447,6 +447,7 @@ export function NodeList(props: NodeListProps) { const isModelProviderCategory = group.title === "Model Providers"; const isVectorStoreCategory = group.title === "Vector Stores"; const isEmbeddingProviderCategory = group.title === "Embedding Providers"; + const isVectorKnowledgeBaseCategory = group.title === "Vector Knowledge Bases"; // 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 @@ -457,7 +458,8 @@ export function NodeList(props: NodeListProps) { !isNpFunctionCategory && !isModelProviderCategory && !isVectorStoreCategory && - !isEmbeddingProviderCategory + !isEmbeddingProviderCategory && + !isVectorKnowledgeBaseCategory ) { return null; } @@ -562,7 +564,7 @@ export function NodeList(props: NodeListProps) { )} {onAdd && addButtonLabel && - (isModelProviderCategory || isVectorStoreCategory || isEmbeddingProviderCategory) && + (isModelProviderCategory || isVectorStoreCategory || isEmbeddingProviderCategory || isVectorKnowledgeBaseCategory) && (!group.items || group.items.length === 0) && !searchText && !isSearching && ( @@ -573,8 +575,8 @@ export function NodeList(props: NodeListProps) { )} {group.items && group.items.length > 0 && - // 1. If parent group is "Connections", "Model Providers", "Vector Stores", or "Embedding Providers" and ALL items don't have id, use getConnectionContainer - (group.title === "Connections" || group.title === "Model Providers" || group.title === "Vector Stores" || group.title === "Embedding Providers") && + // 1. If parent group is "Connections", "Model Providers", "Vector Stores", "Embedding Providers", or "Vector Knowledge Bases" and ALL items don't have id, use getConnectionContainer + (group.title === "Connections" || group.title === "Model Providers" || group.title === "Vector Stores" || group.title === "Embedding Providers" || group.title === "Vector Knowledge Bases") && group.items.filter((item) => item != null).every((item) => !("id" in item)) ? getConnectionContainer(group.items as Category[]) : // 2. If ALL items don't have id (all are categories), use getCategoryContainer diff --git a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx index 189c00624ff..b8d49e0d357 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx @@ -168,6 +168,10 @@ export function convertEmbeddingProviderCategoriesToSidePanelCategories(categori return categories.map((category) => convertDiagramCategoryToSidePanelCategory(category)); } +export function convertVectorKnowledgeBaseCategoriesToSidePanelCategories(categories: Category[]): PanelCategory[] { + return categories.map((category) => convertDiagramCategoryToSidePanelCategory(category)); +} + export function convertNodePropertiesToFormFields( nodeProperties: NodeProperties, connections?: FlowNode[], diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx index dbc00ed80d7..4b533b30a27 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx @@ -51,6 +51,7 @@ export enum SidePanelView { VECTOR_STORE_LIST = "VECTOR_STORE_LIST", EMBEDDING_PROVIDERS = "EMBEDDING_PROVIDERS", EMBEDDING_PROVIDER_LIST = "EMBEDDING_PROVIDER_LIST", + VECTOR_KNOWLEDGE_BASE_LIST = "VECTOR_KNOWLEDGE_BASE_LIST", NEW_AGENT = "NEW_AGENT", ADD_TOOL = "ADD_TOOL", NEW_TOOL = "NEW_TOOL", @@ -91,6 +92,7 @@ interface PanelManagerProps { onAddModelProvider?: () => void; onAddVectorStore?: () => void; onAddEmbeddingProvider?: () => void; + onAddVectorKnowledgeBase?: () => void; onSubmitForm: (updatedNode?: FlowNode, isDataMapperFormUpdate?: boolean) => void; onDiscardSuggestions: () => void; onSubPanel: (subPanel: SubPanel) => void; @@ -101,6 +103,7 @@ interface PanelManagerProps { onSearchModelProvider?: (searchText: string, functionType: FUNCTION_TYPE) => void; onSearchVectorStore?: (searchText: string, functionType: FUNCTION_TYPE) => void; onSearchEmbeddingProvider?: (searchText: string, functionType: FUNCTION_TYPE) => void; + onSearchVectorKnowledgeBase?: (searchText: string, functionType: FUNCTION_TYPE) => void; onEditAgent?: () => void; // AI Agent handlers @@ -139,6 +142,7 @@ export function PanelManager(props: PanelManagerProps) { onAddModelProvider, onAddVectorStore, onAddEmbeddingProvider, + onAddVectorKnowledgeBase, onSubmitForm, onDiscardSuggestions, onSubPanel, @@ -148,6 +152,7 @@ export function PanelManager(props: PanelManagerProps) { onSearchNpFunction, onSearchVectorStore, onSearchEmbeddingProvider, + onSearchVectorKnowledgeBase, } = props; const [panelView, setPanelView] = useState(sidePanelView); @@ -377,6 +382,23 @@ export function PanelManager(props: PanelManagerProps) { /> ); + case SidePanelView.VECTOR_KNOWLEDGE_BASE_LIST: + return ( + + onSearchVectorKnowledgeBase?.(searchText, FUNCTION_TYPE.REGULAR) + } + onBack={canGoBack ? onBack : undefined} + /> + ); + case SidePanelView.FORM: return ( (false); const isCreatingNewVectorStore = useRef(false); const isCreatingNewEmbeddingProvider = useRef(false); + const isCreatingNewVectorKnowledgeBase = useRef(false); useEffect(() => { debouncedGetFlowModel(); @@ -327,6 +329,39 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { } }; + const handleVectorKnowledgeBaseAdded = async () => { + console.log(">>> Vector knowledge base added, navigating back to vector knowledge base list"); + + // Try to navigate back to VECTOR_KNOWLEDGE_BASE_LIST in the stack + const foundInStack = popNavigationStackUntilView(SidePanelView.VECTOR_KNOWLEDGE_BASE_LIST); + + if (foundInStack) { + setShowProgressIndicator(true); + try { + const response = await rpcClient.getBIDiagramRpcClient().getAvailableVectorKnowledgeBases({ + position: targetRef.current.startLine, + filePath: model?.fileName, + }); + console.log(">>> Refreshed vector knowledge base list", response); + setCategories( + convertFunctionCategoriesToSidePanelCategories( + response.categories as Category[], + FUNCTION_TYPE.REGULAR + ) + ); + setSidePanelView(SidePanelView.VECTOR_KNOWLEDGE_BASE_LIST); + setShowSidePanel(true); + } catch (error) { + console.error(">>> Error refreshing vector knowledge bases", error); + } finally { + setShowProgressIndicator(false); + } + } else { + console.log(">>> VECTOR_KNOWLEDGE_BASE_LIST not found in navigation stack, closing panel"); + handleOnCloseSidePanel(); + } + }; + const getFlowModel = () => { setShowProgressIndicator(true); onUpdate(); @@ -505,13 +540,13 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { return; } - // HACK: change knowledge bases kind to vector knowledge base - response.categories[1].items.forEach((item: Item) => { - const node = item as AvailableNode; - if (node.codedata?.node === "VECTOR_KNOWLEDGE_BASES") { - node.codedata.node = "VECTOR_KNOWLEDGE_BASE"; - } - }); + // // HACK: change knowledge bases kind to vector knowledge base + // response.categories[1].items.forEach((item: Item) => { + // const node = item as AvailableNode; + // if (node.codedata?.node === "VECTOR_KNOWLEDGE_BASES") { + // node.codedata.node = "VECTOR_KNOWLEDGE_BASE"; + // } + // }); // Use the utility function to filter categories const filteredCategories = transformCategories(response.categories); @@ -645,6 +680,9 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { case "EMBEDDING_PROVIDER": panelView = SidePanelView.EMBEDDING_PROVIDER_LIST; break; + case "VECTOR_KNOWLEDGE_BASE": + panelView = SidePanelView.VECTOR_KNOWLEDGE_BASE_LIST; + break; default: panelView = SidePanelView.NODE_LIST; } @@ -670,11 +708,15 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }; const handleSearchVectorStore = async (searchText: string, functionType: FUNCTION_TYPE) => { - await handleSearch(searchText, functionType, "VECTOR_STORE" as any); // Temporary type assertion to resolve linter error + await handleSearch(searchText, functionType, "VECTOR_STORE"); }; const handleSearchEmbeddingProvider = async (searchText: string, functionType: FUNCTION_TYPE) => { - await handleSearch(searchText, functionType, "EMBEDDING_PROVIDER" as any); // Temporary type assertion to resolve linter error + await handleSearch(searchText, functionType, "EMBEDDING_PROVIDER"); + }; + + const handleSearchVectorKnowledgeBase = async (searchText: string, functionType: FUNCTION_TYPE) => { + await handleSearch(searchText, functionType, "VECTOR_KNOWLEDGE_BASE"); }; const updateCurrentArtifactLocation = async (artifacts: UpdatedArtifactsResponse) => { @@ -714,6 +756,11 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { await handleEmbeddingProviderAdded(); return; } + if (currentArtifact.type === "VARIABLE" && isCreatingNewVectorKnowledgeBase.current) { + isCreatingNewVectorKnowledgeBase.current = false; + await handleVectorKnowledgeBaseAdded(); + return; + } } await rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.UPDATE_PROJECT_LOCATION, @@ -883,6 +930,30 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }); break; + case "VECTOR_KNOWLEDGE_BASES": + setShowProgressIndicator(true); + rpcClient + .getBIDiagramRpcClient() + .getAvailableVectorKnowledgeBases({ + position: targetRef.current.startLine, + filePath: model?.fileName || fileName, + }) + .then((response) => { + console.log(">>> List of vector knowledge bases", response); + setCategories( + convertFunctionCategoriesToSidePanelCategories( + response.categories as Category[], + FUNCTION_TYPE.REGULAR + ) + ); + setSidePanelView(SidePanelView.VECTOR_KNOWLEDGE_BASE_LIST); + setShowSidePanel(true); + }) + .finally(() => { + setShowProgressIndicator(false); + }); + break; + default: // default node console.log(">>> on select panel node", { nodeId, metadata }); @@ -1098,13 +1169,25 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { ); setCategories([]); setSidePanelView(SidePanelView.EMBEDDING_PROVIDER_LIST); + } else if ( + sidePanelView === SidePanelView.FORM && + selectedNodeMetadata.current.metadata.node.codedata.node === "VECTOR_KNOWLEDGE_BASE" + ) { + handleOnSelectNode( + selectedNodeMetadata.current.nodeId, + selectedNodeMetadata.current.metadata, + selectedNodeMetadata.current.fileName + ); + setCategories([]); + setSidePanelView(SidePanelView.VECTOR_KNOWLEDGE_BASE_LIST); } else if ( sidePanelView === SidePanelView.FUNCTION_LIST || sidePanelView === SidePanelView.DATA_MAPPER_LIST || sidePanelView === SidePanelView.NP_FUNCTION_LIST || sidePanelView === SidePanelView.MODEL_PROVIDER_LIST || sidePanelView === SidePanelView.VECTOR_STORE_LIST || - sidePanelView === SidePanelView.EMBEDDING_PROVIDER_LIST + sidePanelView === SidePanelView.EMBEDDING_PROVIDER_LIST || + sidePanelView === SidePanelView.VECTOR_KNOWLEDGE_BASE_LIST ) { setCategories(initialCategoriesRef.current); setSidePanelView(SidePanelView.NODE_LIST); @@ -1219,7 +1302,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { position: { startLine: targetRef.current.startLine, endLine: targetRef.current.endLine }, filePath: model?.fileName, queryMap: undefined, - searchKind: "VECTOR_STORE" as any, // Temporary type assertion to resolve linter error + searchKind: "VECTOR_STORE", }) .then((response) => { console.log(">>> Available vector store types", response); @@ -1247,11 +1330,13 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { position: { startLine: targetRef.current.startLine, endLine: targetRef.current.endLine }, filePath: model?.fileName, queryMap: undefined, - searchKind: "EMBEDDING_PROVIDER" as any, // Temporary type assertion to resolve linter error + searchKind: "EMBEDDING_PROVIDER", }) .then((response) => { console.log(">>> Available embedding provider types", response); - setCategories(convertEmbeddingProviderCategoriesToSidePanelCategories(response.categories as Category[])); + setCategories( + convertEmbeddingProviderCategoriesToSidePanelCategories(response.categories as Category[]) + ); setSidePanelView(SidePanelView.EMBEDDING_PROVIDERS); setShowSidePanel(true); }) @@ -1260,6 +1345,22 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }); }; + const handleOnAddNewVectorKnowledgeBase = () => { + console.log(">>> Adding new vector knowledge base"); + isCreatingNewVectorKnowledgeBase.current = true; + setShowProgressIndicator(true); + + // Push current state to navigation stack + pushToNavigationStack(sidePanelView, categories, selectedNodeRef.current, selectedClientName.current); + // update the node type to VECTOR_KNOWLEDGE_BASE + selectedNodeMetadata.current.metadata.node.codedata.node = "VECTOR_KNOWLEDGE_BASE"; + handleOnSelectNode( + selectedNodeMetadata.current.nodeId, + selectedNodeMetadata.current.metadata, + selectedNodeMetadata.current.fileName + ); + }; + const handleOnGoToSource = (node: FlowNode) => { const targetPosition: NodePosition = { startLine: node.codedata.lineRange.startLine.line, @@ -1676,6 +1777,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { onAddModelProvider={handleOnAddNewModelProvider} onAddVectorStore={handleOnAddNewVectorStore} onAddEmbeddingProvider={handleOnAddNewEmbeddingProvider} + onAddVectorKnowledgeBase={handleOnAddNewVectorKnowledgeBase} onSubmitForm={handleOnFormSubmit} showProgressIndicator={showProgressIndicator} onDiscardSuggestions={onDiscardSuggestions} @@ -1687,6 +1789,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { onSearchModelProvider={handleSearchModelProvider} onSearchVectorStore={handleSearchVectorStore} onSearchEmbeddingProvider={handleSearchEmbeddingProvider} + onSearchVectorKnowledgeBase={handleSearchVectorKnowledgeBase} // AI Agent specific callbacks onEditAgent={handleEditAgent} onSelectTool={handleOnSelectTool} From 2c95c13cabcd0b004ea4fa6fbb5c6218536c3c68 Mon Sep 17 00:00:00 2001 From: Chinthaka Jayatilake <37581983+ChinthakaJ98@users.noreply.github.com> Date: Fri, 25 Jul 2025 08:30:01 +0530 Subject: [PATCH 123/349] Fix MI E2E tests --- .../e2e-playwright-tests/projectTests/createProject.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/projectTests/createProject.spec.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/projectTests/createProject.spec.ts index 511d789dc64..ff5f32e5760 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/projectTests/createProject.spec.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/projectTests/createProject.spec.ts @@ -86,7 +86,7 @@ export default function createTests() { await page.page.reload(); await page.executePaletteCommand("MI: Open MI Welcome"); await createProject(page, 'newProjectWithAdConfig', '4.4.0', true); - await waitUntilPomContains(page.page, path.join(newProjectPath, 'newProject', 'newProjectWithAdConfig', 'pom.xml'), + await waitUntilPomContains(page.page, path.join(newProjectPath, 'newProjectWithAdConfig', 'pom.xml'), 'test'); console.log('New project with advanced config created successfully'); }); From 52913560c64eed21481d6fde6e3e5986b4c22daf Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Fri, 25 Jul 2025 09:32:01 +0530 Subject: [PATCH 124/349] Fix onSave handler in AgentConfig to use onClose instead of handleSubmitAndClose --- .../src/views/BI/FlowDiagram/PanelManager.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx index 84d8dd3cd32..e9a94f4b616 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx @@ -227,7 +227,7 @@ export function PanelManager(props: PanelManagerProps) { return ; case SidePanelView.AGENT_CONFIG: - return ; + return ; case SidePanelView.AGENT_MEMORY_MANAGER: return ; From dfe242d54864ad8be0015f2d2cf49d78bb1858eb Mon Sep 17 00:00:00 2001 From: tharindulak Date: Fri, 25 Jul 2025 09:58:06 +0530 Subject: [PATCH 125/349] Change token --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4ea18cab890..7479ba95389 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -291,7 +291,7 @@ jobs: uses: actions/github-script@v7 continue-on-error: true with: - github-token: ${{ secrets.GITHUB_TOKEN }} + github-token: ${{ secrets.CHOREO_BOT_TOKEN }} script: | const fs = require('fs'); From 8b69288906dbfc67190be3faaac672d789485b80 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Thu, 24 Jul 2025 11:07:01 +0530 Subject: [PATCH 126/349] Refactor addDefaultModelConfig to improve config line handling and ensure correct order of serviceUrl and accessToken --- .../src/features/ai/utils.ts | 73 +++++++++++-------- 1 file changed, 41 insertions(+), 32 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts index ddef12d66f5..89f92ccd547 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts @@ -161,8 +161,10 @@ function findFileCaseInsensitive(directory: string, fileName: string): string { function addDefaultModelConfig( projectPath: string, token: string, backendUrl: string) { const targetTable = `[ballerina.ai.wso2ProviderConfig]`; - const urlLine = `serviceUrl = "${backendUrl}"`; - const accessTokenLine = `accessToken = "${token}"`; + const SERVICE_URL_KEY = 'serviceUrl'; + const ACCESS_TOKEN_KEY = 'accessToken'; + const urlLine = `${SERVICE_URL_KEY} = "${backendUrl}"`; + const accessTokenLine = `${ACCESS_TOKEN_KEY} = "${token}"`; const configFilePath = findFileCaseInsensitive(projectPath, CONFIG_FILE_NAME); let fileContent = ''; @@ -184,42 +186,49 @@ function addDefaultModelConfig( } // Table exists, update it - const tableEndIndex = fileContent.indexOf('\n', tableStartIndex); - - let updatedTableContent = `${targetTable}\n${urlLine}\n${accessTokenLine}`; - - let urlLineIndex = fileContent.indexOf('url =', tableStartIndex); - let accessTokenLineIndex = fileContent.indexOf('accessToken =', tableStartIndex); - - if (urlLineIndex !== -1 && accessTokenLineIndex !== -1) { - // url and accessToken lines exist, replace them - const existingUrlLineEnd = fileContent.indexOf('\n', urlLineIndex); - const existingAccessTokenLineEnd = fileContent.indexOf('\n', accessTokenLineIndex); + // Find the end of the table (next table or end of file) + let tableEndIndex = fileContent.indexOf('\n[', tableStartIndex); + if (tableEndIndex === -1) { + tableEndIndex = fileContent.length; + } - fileContent = - fileContent.substring(0, urlLineIndex) + - urlLine + - fileContent.substring(existingUrlLineEnd, accessTokenLineIndex) + - accessTokenLine + - fileContent.substring(existingAccessTokenLineEnd); - fs.writeFileSync(configFilePath, fileContent); - return; + // Extract table content and split into lines once + let tableContent = fileContent.substring(tableStartIndex, tableEndIndex); + let lines = tableContent.split('\n'); + + // Helper to add or replace a config line + function addOrReplaceConfigLine(lines: string[], key: string, value: string) { + const configLine = `${key} = "${value}"`; + const idx = lines.findIndex(l => l.trim().startsWith(`${key} =`)); + if (idx === -1) { + // Add after header + lines.splice(1, 0, configLine); + } else { + lines[idx] = configLine; + } } - // If url or accessToken line does not exist, just replace the entire table - let nextTableStartIndex = fileContent.indexOf('[', tableEndIndex + 1); - if (nextTableStartIndex === -1) { - fileContent = fileContent.substring(0, tableStartIndex) - + updatedTableContent + fileContent.substring(tableEndIndex + 1); + // Add or replace serviceUrl + addOrReplaceConfigLine(lines, SERVICE_URL_KEY, backendUrl); + // Add or replace accessToken (after serviceUrl) + // Ensure accessToken is after serviceUrl + let serviceUrlIdx = lines.findIndex(l => l.trim().startsWith(`${SERVICE_URL_KEY} =`)); + let accessTokenIdx = lines.findIndex(l => l.trim().startsWith(`${ACCESS_TOKEN_KEY} =`)); + if (accessTokenIdx === -1) { + lines.splice(serviceUrlIdx + 1, 0, `${ACCESS_TOKEN_KEY} = "${token}"`); } else { - let nextLineBreakIndex = fileContent.substring(tableEndIndex + 1).indexOf('\n'); - if (nextLineBreakIndex === -1) { - fileContent = fileContent.substring(0, tableStartIndex) + updatedTableContent; - } else { - fileContent = fileContent.substring(0, tableStartIndex) - + updatedTableContent + fileContent.substring(tableEndIndex + 1); + lines[accessTokenIdx] = `${ACCESS_TOKEN_KEY} = "${token}"`; + // Move accessToken if not after serviceUrl + if (accessTokenIdx !== serviceUrlIdx + 1) { + const accessTokenLine = lines[accessTokenIdx]; + lines.splice(accessTokenIdx, 1); + lines.splice(serviceUrlIdx + 1, 0, accessTokenLine); } } + + // Join lines and replace the table in the file content + const updatedTableContent = lines.join('\n'); + fileContent = fileContent.substring(0, tableStartIndex) + updatedTableContent + fileContent.substring(tableEndIndex); fs.writeFileSync(configFilePath, fileContent); } From a476a095863f897ee145baabf40290b494162176 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Thu, 24 Jul 2025 16:50:52 +0530 Subject: [PATCH 127/349] Move addOrReplaceConfigLine helper function outside of addDefaultModelConfig --- .../src/features/ai/utils.ts | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts index 89f92ccd547..6681e979c3c 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts @@ -158,6 +158,18 @@ function findFileCaseInsensitive(directory: string, fileName: string): string { return path.join(directory, file); } +// Helper to add or replace a config line +function addOrReplaceConfigLine(lines: string[], key: string, value: string) { + const configLine = `${key} = "${value}"`; + const idx = lines.findIndex(l => l.trim().startsWith(`${key} =`)); + if (idx === -1) { + // Add after header + lines.splice(1, 0, configLine); + } else { + lines[idx] = configLine; + } +} + function addDefaultModelConfig( projectPath: string, token: string, backendUrl: string) { const targetTable = `[ballerina.ai.wso2ProviderConfig]`; @@ -196,18 +208,6 @@ function addDefaultModelConfig( let tableContent = fileContent.substring(tableStartIndex, tableEndIndex); let lines = tableContent.split('\n'); - // Helper to add or replace a config line - function addOrReplaceConfigLine(lines: string[], key: string, value: string) { - const configLine = `${key} = "${value}"`; - const idx = lines.findIndex(l => l.trim().startsWith(`${key} =`)); - if (idx === -1) { - // Add after header - lines.splice(1, 0, configLine); - } else { - lines[idx] = configLine; - } - } - // Add or replace serviceUrl addOrReplaceConfigLine(lines, SERVICE_URL_KEY, backendUrl); // Add or replace accessToken (after serviceUrl) From ce344abab0a6553e6d055fff9580c644b6db7d0c Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Fri, 25 Jul 2025 10:11:30 +0530 Subject: [PATCH 128/349] Add error check for TOKEN_REFRESH_ONLY_SUPPORTED_FOR_BI_INTEL --- .../ballerina/ballerina-extension/src/features/ai/utils.ts | 4 ++-- .../src/features/natural-programming/utils.ts | 4 ++-- workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts index 6681e979c3c..a662c194c99 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts @@ -21,7 +21,7 @@ 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 { 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 { AIMachineEventType } from '@wso2/ballerina-core/lib/state-machine-types'; import { CONFIG_FILE_NAME, ERROR_NO_BALLERINA_SOURCES, LOGIN_REQUIRED_WARNING, PROGRESS_BAR_MESSAGE_FROM_WSO2_DEFAULT_MODEL } from './constants'; @@ -137,7 +137,7 @@ export async function getTokenForDefaultModel() { } return token; } catch (error) { - if ((error as Error).message === REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE) { + if ((error as Error).message === REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE || (error as Error).message === TOKEN_REFRESH_ONLY_SUPPORTED_FOR_BI_INTEL) { vscode.window.showWarningMessage(LOGIN_REQUIRED_WARNING); } throw error; 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 d4762159653..5084e24d0fe 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts @@ -43,7 +43,7 @@ import { OLD_BACKEND_URL } from '../ai/utils'; import { AIMachineEventType, BallerinaProject } from '@wso2/ballerina-core'; import { getCurrentBallerinaProjectFromContext } from '../config-generator/configGenerator'; import { BallerinaExtension } from 'src/core'; -import { getRefreshedAccessToken, REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE } from '../../../src/utils/ai/auth'; +import { 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'; @@ -614,7 +614,7 @@ export async function getTokenForNaturalFunction() { } return token; } catch (error) { - if ((error as Error).message === REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE) { + if ((error as Error).message === REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE || (error as Error).message === TOKEN_REFRESH_ONLY_SUPPORTED_FOR_BI_INTEL) { vscode.window.showWarningMessage(LOGIN_REQUIRED_WARNING); } throw error; diff --git a/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts b/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts index 65393877d2a..7dcc552440f 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts @@ -24,6 +24,7 @@ import { jwtDecode, JwtPayload } from 'jwt-decode'; import { AuthCredentials, LoginMethod } from '@wso2/ballerina-core'; export const REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE = "Refresh token is not available."; +export const TOKEN_REFRESH_ONLY_SUPPORTED_FOR_BI_INTEL = "Token refresh is only supported for BI Intelligence authentication"; export const AUTH_CREDENTIALS_SECRET_KEY = 'BallerinaAuthCredentials'; //TODO: What if user doesnt have github copilot. @@ -214,7 +215,7 @@ export const getRefreshedAccessToken = async (): Promise => { try { const credentials = await getAuthCredentials(); if (!credentials || credentials.loginMethod !== LoginMethod.BI_INTEL) { - throw new Error('Token refresh is only supported for BI Intel authentication'); + throw new Error(TOKEN_REFRESH_ONLY_SUPPORTED_FOR_BI_INTEL); } const { refreshToken } = credentials.secrets; From cad8b95888e30a837bfa76ff5e9942e16d66611b Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Fri, 25 Jul 2025 10:58:08 +0530 Subject: [PATCH 129/349] Fix navigation issue --- .../src/views/BI/FlowDiagram/index.tsx | 65 ++++++++++++------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index 3023e4e99cc..0a9077854e4 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -54,7 +54,6 @@ import { convertModelProviderCategoriesToSidePanelCategories, convertVectorStoreCategoriesToSidePanelCategories, convertEmbeddingProviderCategoriesToSidePanelCategories, - convertVectorKnowledgeBaseCategoriesToSidePanelCategories, } from "../../../utils/bi"; import { NodePosition, STNode } from "@wso2/syntax-tree"; import { View, ProgressRing, ProgressIndicator, ThemeColors } from "@wso2/ui-toolkit"; @@ -219,6 +218,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { setCategories(lastItem.categories); selectedNodeRef.current = lastItem.selectedNode; selectedClientName.current = lastItem.clientName; + newStack.pop(); return newStack; } newStack.pop(); @@ -704,25 +704,25 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }; const handleSearchModelProvider = async (searchText: string, functionType: FUNCTION_TYPE) => { - await handleSearch(searchText, functionType, "MODEL_PROVIDER"); + // await handleSearch(searchText, functionType, "MODEL_PROVIDER"); }; const handleSearchVectorStore = async (searchText: string, functionType: FUNCTION_TYPE) => { - await handleSearch(searchText, functionType, "VECTOR_STORE"); + // await handleSearch(searchText, functionType, "VECTOR_STORE"); }; const handleSearchEmbeddingProvider = async (searchText: string, functionType: FUNCTION_TYPE) => { - await handleSearch(searchText, functionType, "EMBEDDING_PROVIDER"); + // await handleSearch(searchText, functionType, "EMBEDDING_PROVIDER"); }; const handleSearchVectorKnowledgeBase = async (searchText: string, functionType: FUNCTION_TYPE) => { - await handleSearch(searchText, functionType, "VECTOR_KNOWLEDGE_BASE"); + // await handleSearch(searchText, functionType, "VECTOR_KNOWLEDGE_BASE"); }; - const updateCurrentArtifactLocation = async (artifacts: UpdatedArtifactsResponse) => { - console.log(">>> Updating current artifact location", artifacts); + const updateCurrentArtifactLocation = async (artifacts: UpdatedArtifactsResponse, identifier?: string) => { + console.log(">>> Updating current artifact location", { artifacts, identifier }); // Get the updated component and update the location - const currentIdentifier = (await rpcClient.getVisualizerLocation()).identifier; + const currentIdentifier = identifier || (await rpcClient.getVisualizerLocation()).identifier; // Find the correct artifact by currentIdentifier (id) let currentArtifact = artifacts.artifacts.at(0); artifacts.artifacts.forEach((artifact) => { @@ -741,22 +741,22 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }); if (currentArtifact) { console.log(">>> currentArtifact", currentArtifact); - if (currentArtifact.type === "CONNECTION" && isCreatingNewModelProvider.current) { + if (identifier && isCreatingNewModelProvider.current) { isCreatingNewModelProvider.current = false; await handleModelProviderAdded(); return; } - if (currentArtifact.type === "VARIABLE" && isCreatingNewVectorStore.current) { + if (identifier && isCreatingNewVectorStore.current) { isCreatingNewVectorStore.current = false; await handleVectorStoreAdded(); return; } - if (currentArtifact.type === "VARIABLE" && isCreatingNewEmbeddingProvider.current) { + if (identifier && isCreatingNewEmbeddingProvider.current) { isCreatingNewEmbeddingProvider.current = false; await handleEmbeddingProviderAdded(); return; } - if (currentArtifact.type === "VARIABLE" && isCreatingNewVectorKnowledgeBase.current) { + if (identifier && isCreatingNewVectorKnowledgeBase.current) { isCreatingNewVectorKnowledgeBase.current = false; await handleVectorKnowledgeBaseAdded(); return; @@ -770,6 +770,8 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { identifier: currentIdentifier, }, }); + handleOnCloseSidePanel(); + debouncedGetFlowModel(); }; const handleOnSelectNode = (nodeId: string, metadata?: any, fileName?: string) => { @@ -1004,17 +1006,14 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { console.log(">>> Updated source code", response); if (response.artifacts.length > 0) { selectedNodeRef.current = undefined; - await updateCurrentArtifactLocation(response); - - // Handle creation completion - handleOnCloseSidePanel(); + const identifier = (updatedNode.properties?.variable?.value || "") as string; + await updateCurrentArtifactLocation(response, identifier); } else { console.error(">>> Error updating source code", response); } }) .finally(() => { setShowProgressIndicator(false); - debouncedGetFlowModel(); }); }; @@ -1348,17 +1347,33 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { const handleOnAddNewVectorKnowledgeBase = () => { console.log(">>> Adding new vector knowledge base"); isCreatingNewVectorKnowledgeBase.current = true; - setShowProgressIndicator(true); // Push current state to navigation stack pushToNavigationStack(sidePanelView, categories, selectedNodeRef.current, selectedClientName.current); - // update the node type to VECTOR_KNOWLEDGE_BASE - selectedNodeMetadata.current.metadata.node.codedata.node = "VECTOR_KNOWLEDGE_BASE"; - handleOnSelectNode( - selectedNodeMetadata.current.nodeId, - selectedNodeMetadata.current.metadata, - selectedNodeMetadata.current.fileName - ); + + // Update the node type to VECTOR_KNOWLEDGE_BASE and get the template + const updatedMetadata = { ...selectedNodeMetadata.current.metadata }; + updatedMetadata.node.codedata.node = "VECTOR_KNOWLEDGE_BASE"; + selectedNodeMetadata.current.metadata = updatedMetadata; + + setShowProgressIndicator(true); + rpcClient + .getBIDiagramRpcClient() + .getNodeTemplate({ + position: targetRef.current.startLine, + filePath: model?.fileName, + id: updatedMetadata.node.codedata, + }) + .then((response) => { + console.log(">>> Vector Knowledge Base template", response); + selectedNodeRef.current = response.flowNode; + showEditForm.current = false; + setSidePanelView(SidePanelView.FORM); + setShowSidePanel(true); + }) + .finally(() => { + setShowProgressIndicator(false); + }); }; const handleOnGoToSource = (node: FlowNode) => { From 618e4cdbeab1c6a12756d4623723bde02d4b9bb3 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Fri, 25 Jul 2025 11:13:40 +0530 Subject: [PATCH 130/349] Fix suggested improvements --- .../src/components/NodeList/index.tsx | 4 ++-- .../src/views/BI/FlowDiagram/index.tsx | 8 -------- 2 files changed, 2 insertions(+), 10 deletions(-) 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 8db321c20ac..6fdee89240d 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx @@ -615,8 +615,8 @@ export function NodeList(props: NodeListProps) { ); - const isEmpty = React.Children.toArray(content.props.children).every((child) => child === null) && searchText; - return isEmpty ?
No matching results found
: content; + const isEmpty = React.Children.toArray(content.props.children).every((child) => child === null); + return isEmpty && searchText ?
No matching results found
: content; }; // filter out category items based on search text diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index 0a9077854e4..6199b3819b5 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -540,14 +540,6 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { return; } - // // HACK: change knowledge bases kind to vector knowledge base - // response.categories[1].items.forEach((item: Item) => { - // const node = item as AvailableNode; - // if (node.codedata?.node === "VECTOR_KNOWLEDGE_BASES") { - // node.codedata.node = "VECTOR_KNOWLEDGE_BASE"; - // } - // }); - // Use the utility function to filter categories const filteredCategories = transformCategories(response.categories); const convertedCategories = convertBICategoriesToSidePanelCategories(filteredCategories); From bbac2e4ca4f06f2028b9fd390c30a54943c17c48 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Fri, 25 Jul 2025 11:22:15 +0530 Subject: [PATCH 131/349] Revert beta flag remove commit --- .../ballerina-visualizer/src/components/ButtonCard/index.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/ButtonCard/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/ButtonCard/index.tsx index 0730592434f..84d9b0fe191 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/components/ButtonCard/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/components/ButtonCard/index.tsx @@ -19,6 +19,7 @@ import React from "react"; import { ThemeColors, Tooltip } from "@wso2/ui-toolkit"; import styled from "@emotion/styled"; +import { BetaSVG } from "../../views/Connectors/Marketplace/BetaSVG"; const Card = styled.div<{ active?: boolean; appearance?: ButtonCardAppearance, disabled?: boolean }>` gap: 16px; @@ -153,6 +154,7 @@ export function ButtonCard(props: ButtonCardProps) { truncate={truncate} > {title} + {isBeta && } {description && {description}} From 6bda5fe08c9cf696d4af281e22a7512b723e8d8e Mon Sep 17 00:00:00 2001 From: tharindulak Date: Fri, 25 Jul 2025 10:21:47 +0530 Subject: [PATCH 132/349] Fix trivy scan --- .github/workflows/build.yml | 108 ++++++++++++++++++++++++++++++---- .github/workflows/test-pr.yml | 1 + 2 files changed, 98 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7479ba95389..52bb4dbf92d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,6 +7,10 @@ on: description: Pull request number for commenting type: number required: false + githubToken: + description: GitHub token for PR commenting + type: string + required: false isPreRelease: default: true type: boolean @@ -208,6 +212,16 @@ jobs: sudo apt-get update sudo apt-get install trivy + - name: Update Trivy vulnerability database + run: | + echo "🔄 Updating Trivy vulnerability database..." + # Force fresh download of vulnerability database + rm -rf ~/.cache/trivy || true + trivy image --download-db-only + echo "✅ Trivy database updated successfully" + echo "📊 Database info:" + trivy version --format json | jq '.VulnerabilityDB' || trivy version + - name: Verify Trivy installation run: | trivy version @@ -228,21 +242,73 @@ jobs: echo "Current directory contents:" ls -la echo "" - echo "Checking for axios in root package.json:" - cat package.json | grep -A5 -B5 axios || echo "No axios found in root package.json" + echo "=== COMPARING WITH LOCAL ENVIRONMENT ===" + echo "" + echo "1. Trivy version comparison:" + trivy version echo "" - echo "Checking for axios in ui-toolkit package.json:" + echo "2. Checking axios in ui-toolkit package.json:" cat workspaces/common-libs/ui-toolkit/package.json | grep -A5 -B5 axios || echo "No axios found in ui-toolkit package.json" echo "" - echo "Checking pnpm-lock.yaml for axios entries:" - grep -c "axios" pnpm-lock.yaml || echo "No axios entries found in pnpm-lock.yaml" + echo "3. Axios entries in pnpm-lock.yaml:" + echo " Total axios entries: $(grep -c "axios" pnpm-lock.yaml || echo "0")" + echo " Axios 0.21.0 entries:" + grep "axios@0.21.0" pnpm-lock.yaml || echo " No axios@0.21.0 found" + echo "" + echo "4. Lock file checksums (to compare with local):" + echo " pnpm-lock.yaml: $(md5sum pnpm-lock.yaml | cut -d' ' -f1)" + echo " common/config/rush/pnpm-lock.yaml: $(md5sum common/config/rush/pnpm-lock.yaml | cut -d' ' -f1)" + echo "" + echo "5. Rush installation status:" + echo " Rush version: $(node -e "console.log(require('@microsoft/rush/package.json').version)" 2>/dev/null || echo "Not found")" + echo " PNPM version: $(pnpm --version || echo "Not found")" + echo "" + echo "6. Node modules structure:" + echo " workspaces/common-libs/ui-toolkit/node_modules exists: $(test -d workspaces/common-libs/ui-toolkit/node_modules && echo 'YES' || echo 'NO')" + if [ -d "workspaces/common-libs/ui-toolkit/node_modules" ]; then + echo " axios version installed: $(cat workspaces/common-libs/ui-toolkit/node_modules/axios/package.json | grep '"version"' || echo "Not found")" + fi + echo "" + echo "7. Environment variables that might affect scanning:" + echo " PWD: $PWD" + echo " HOME: $HOME" + echo " NODE_ENV: ${NODE_ENV:-"not set"}" echo "" - echo "Checking if axios 0.21.0 is in pnpm-lock.yaml:" - grep "axios@0.21.0" pnpm-lock.yaml || echo "No axios@0.21.0 found in pnpm-lock.yaml" + echo "8. Testing exact same command as local:" + echo " Running: trivy fs . --timeout 10m --skip-dirs common/temp --format table" + trivy fs . --timeout 10m --skip-dirs common/temp --format table | head -30 echo "" - echo "Lock file structure summary:" - echo "- pnpm-lock.yaml exists: $(test -f pnpm-lock.yaml && echo 'YES' || echo 'NO')" - echo "- common/config/rush/pnpm-lock.yaml exists: $(test -f common/config/rush/pnpm-lock.yaml && echo 'YES' || echo 'NO')" + echo "9. Detailed Trivy analysis:" + echo " Scanning specific ui-toolkit directory:" + trivy fs workspaces/common-libs/ui-toolkit --format table --severity CRITICAL,HIGH,MEDIUM,LOW + echo "" + echo "10. Check if node_modules are being scanned:" + echo " Node modules in ui-toolkit:" + ls -la workspaces/common-libs/ui-toolkit/node_modules/ | head -10 || echo "No node_modules found" + echo "" + echo "11. Rush vs PNPM difference check:" + echo " Checking if Rush installed different versions:" + find . -name "node_modules" -type d | head -5 + echo "" + echo "12. Manual CVE check on axios 0.21.0:" + echo " Checking if this specific version has known CVEs:" + trivy fs workspaces/common-libs/ui-toolkit/node_modules/axios --format table || echo "Cannot scan axios directly" + echo "" + echo "13. Force vulnerability test with minimal package.json:" + mkdir -p /tmp/vuln-test + cat > /tmp/vuln-test/package.json << 'EOFVULN' + { + "name": "vuln-test", + "version": "1.0.0", + "dependencies": { + "axios": "0.21.0" + } + } + EOFVULN + cd /tmp/vuln-test && npm install --package-lock-only + echo " Scanning minimal test case:" + trivy fs /tmp/vuln-test --format table --severity CRITICAL,HIGH,MEDIUM,LOW + cd - - name: Run Trivy vulnerability scanner run: | @@ -286,13 +352,33 @@ jobs: echo "VULN_COUNT=0" >> $GITHUB_ENV fi + - name: Debug vulnerability detection results + run: | + echo "🔍 Vulnerability Detection Results:" + echo "VULNERABILITIES_FOUND: ${VULNERABILITIES_FOUND:-"not set"}" + echo "VULN_COUNT: ${VULN_COUNT:-"not set"}" + echo "File exists: $(test -f trivy-table-results.txt && echo 'YES' || echo 'NO')" + if [ -f "trivy-table-results.txt" ]; then + echo "File size: $(wc -c < trivy-table-results.txt) bytes" + echo "CVE/GHSA lines: $(grep -c "CVE\|GHSA" trivy-table-results.txt 2>/dev/null || echo "0")" + echo "Last 10 lines of results:" + tail -10 trivy-table-results.txt + fi + - name: Create PR comment with vulnerability report if: env.VULNERABILITIES_FOUND == 'true' uses: actions/github-script@v7 continue-on-error: true with: - github-token: ${{ secrets.CHOREO_BOT_TOKEN }} + github-token: ${{ inputs.githubToken || github.token }} script: | + console.log('🔍 Token debugging:'); + console.log('inputs.githubToken available:', '${{ inputs.githubToken }}' !== ''); + console.log('github.token available:', '${{ github.token }}' !== ''); + console.log('GITHUB_TOKEN available:', '${{ secrets.GITHUB_TOKEN }}' !== ''); + console.log('CHOREO_BOT_TOKEN available:', '${{ secrets.CHOREO_BOT_TOKEN }}' !== ''); + console.log('Current token being used:', '${{ inputs.githubToken }}' !== '' ? 'inputs.githubToken' : 'github.token (fallback)'); + const fs = require('fs'); // Read the table output diff --git a/.github/workflows/test-pr.yml b/.github/workflows/test-pr.yml index f8a50275546..d35a3003839 100644 --- a/.github/workflows/test-pr.yml +++ b/.github/workflows/test-pr.yml @@ -16,4 +16,5 @@ jobs: secrets: inherit with: prNumber: ${{ github.event.pull_request.number }} + githubToken: ${{ secrets.CHOREO_BOT_TOKEN || secrets.GITHUB_TOKEN }} runE2ETests: ${{ contains(github.event.pull_request.labels.*.name, 'Checks/Run with UI Tests') }} From 83d5aeca593040df5ad044345993038590cf44e3 Mon Sep 17 00:00:00 2001 From: vimukthiRajapaksha Date: Fri, 25 Jul 2025 12:24:45 +0530 Subject: [PATCH 133/349] Resolve merge conflicts --- .../ballerina-core/src/interfaces/bi.ts | 39 +- .../src/interfaces/constants.ts | 21 +- .../src/interfaces/extended-lang-client.ts | 18 +- .../src/rpc-types/ai-agent/index.ts | 4 +- .../src/rpc-types/ai-agent/rpc-type.ts | 4 +- .../src/rpc-types/bi-diagram/index.ts | 4 + .../src/rpc-types/bi-diagram/rpc-type.ts | 4 + .../src/rpc-types/service-designer/index.ts | 3 +- .../rpc-types/service-designer/rpc-type.ts | 3 +- .../ballerina-core/src/state-machine-types.ts | 88 +++-- .../ballerina-extension/.env.example | 4 +- .../ballerina-extension/package.json | 22 +- .../src/BalExtensionContext.ts | 2 + .../ballerina-extension/src/RPCLayer.ts | 8 +- .../src/core/extended-language-client.ts | 39 +- .../ballerina-extension/src/core/extension.ts | 6 +- .../ballerina-extension/src/extension.ts | 10 +- .../src/features/ai/activator.ts | 14 + .../src/features/ai/completions.ts | 12 +- .../src/features/ai/constants.ts | 22 ++ .../src/features/ai/service/ask/ask.ts | 10 +- .../src/features/ai/service/code/code.ts | 6 +- .../src/features/ai/service/connection.ts | 117 ++++-- .../ai/service/datamapper/context_api.ts | 8 +- .../ai/service/datamapper/datamapper.ts | 10 +- .../features/ai/service/datamapper/schema.ts | 5 + .../ai/service/healthcare/healthcare.ts | 37 +- .../src/features/ai/service/libs/funcs.ts | 4 +- .../src/features/ai/service/libs/libs.ts | 4 +- .../features/ai/service/openapi/openapi.ts | 4 +- .../src/features/ai/service/test/test.ts | 4 +- .../src/features/ai/service/test/test_plan.ts | 4 +- .../src/features/ai/utils.ts | 202 +++++++++- .../src/features/bi/activator.ts | 9 +- .../config-generator/configGenerator.ts | 15 +- .../src/features/debugger/config-provider.ts | 62 ++- .../src/features/editor-support/activator.ts | 45 ++- .../editor-support/codelens-provider.ts | 183 --------- .../codelense-provider-visitor.ts | 148 -------- .../features/natural-programming/constants.ts | 1 + .../src/features/natural-programming/utils.ts | 51 +-- .../src/features/project/cmds/add.ts | 15 +- .../src/features/project/cmds/build.ts | 17 +- .../src/features/project/cmds/cloud.ts | 17 +- .../src/features/project/cmds/cmd-runner.ts | 89 ++--- .../src/features/project/cmds/configRun.ts | 12 +- .../src/features/project/cmds/doc.ts | 15 +- .../features/project/cmds/json-to-record.ts | 24 +- .../src/features/project/cmds/pack.ts | 13 +- .../src/features/project/cmds/run.ts | 19 +- .../src/features/project/cmds/test.ts | 15 +- .../features/project/cmds/xml-to-record.ts | 20 +- .../src/features/test-explorer/discover.ts | 22 +- .../src/features/test-explorer/runner.ts | 4 +- .../src/features/testing/runner.ts | 5 +- .../src/features/tryit/activator.ts | 2 +- .../src/rpc-managers/ai-agent/rpc-handler.ts | 6 +- .../src/rpc-managers/ai-agent/rpc-manager.ts | 14 +- .../src/rpc-managers/ai-panel/rpc-manager.ts | 10 +- .../src/rpc-managers/ai-panel/utils.ts | 340 ++++++++--------- .../rpc-managers/bi-diagram/rpc-handler.ts | 8 + .../rpc-managers/bi-diagram/rpc-manager.ts | 92 ++++- .../src/rpc-managers/common/rpc-manager.ts | 6 +- .../rpc-managers/lang-client/rpc-manager.ts | 4 +- .../service-designer/rpc-handler.ts | 3 + .../service-designer/rpc-manager.ts | 15 +- .../ballerina-extension/src/stateMachine.ts | 84 ++++- .../ballerina-extension/src/utils/ai/auth.ts | 121 ++++-- .../src/utils/project-artifacts.ts | 18 +- .../src/utils/project-utils.ts | 8 +- .../src/utils/runCommand.ts | 5 - .../src/utils/source-utils.ts | 45 ++- .../src/utils/state-machine-utils.ts | 27 +- .../src/utils/webview-utils.ts | 20 +- .../src/views/ai-panel/aiMachine.ts | 229 ++++++++--- .../src/views/ai-panel/auth.ts | 25 +- .../src/views/ai-panel/utils.ts | 131 +++++++ .../src/views/bbe/activator.ts | 2 +- .../src/views/graphql/graphqlViewPanel.ts | 5 +- .../src/views/notebook/notebookSerializer.ts | 6 +- .../src/views/visualizer/activate.ts | 17 +- .../test/ai/evals/code/code.test.ts | 5 +- .../test/core/ballerina-extention.test.ts | 6 +- .../test/language-server/lang-client.test.ts | 4 +- .../src/BallerinaRpcClient.ts | 5 +- .../src/rpc-clients/ai-agent/rpc-client.ts | 10 +- .../src/rpc-clients/bi-diagram/rpc-client.ts | 23 +- .../service-designer/rpc-client.ts | 7 + .../src/components/Form/index.tsx | 5 +- .../src/components/NodeList/index.tsx | 343 ++++++++++++----- .../src/components/editors/DropdownEditor.tsx | 9 +- .../ballerina-visualizer/src/MainPanel.tsx | 76 +++- .../src/views/AIPanel/AIPanel.tsx | 103 +++-- .../src/views/AIPanel/LoginPanel/index.tsx | 35 ++ .../AIPanel/WaitingForLoginSection/index.tsx | 232 +++++++++++- .../data/commandTemplates.const.ts | 2 +- .../utils/attachment/attachmentManager.ts | 2 - .../BI/AIChatAgent/AIChatAgentWizard.tsx | 14 +- .../src/views/BI/AIChatAgent/AgentConfig.tsx | 6 +- .../src/views/BI/AIChatAgent/ConfigForm.tsx | 5 +- .../BI/AIChatAgent/MemoryManagerConfig.tsx | 14 +- .../src/views/BI/AIChatAgent/ModelConfig.tsx | 31 +- .../src/views/BI/AIChatAgent/NewAgent.tsx | 16 +- .../src/views/BI/AIChatAgent/ToolConfig.tsx | 1 + .../src/views/BI/AIChatAgent/index.tsx | 2 +- .../src/views/BI/AIChatAgent/utils.ts | 18 +- .../ComponentListView/OtherArtifactsPanel.tsx | 2 +- .../ViewConfigurableVariables/index.tsx | 3 +- .../src/views/BI/DiagramWrapper/index.tsx | 355 +++++------------- .../src/views/BI/FlowDiagram/PanelManager.tsx | 21 +- .../src/views/BI/FlowDiagram/index.tsx | 62 +-- .../src/views/BI/FocusFlowDiagram/index.tsx | 55 +-- .../src/views/BI/Overview/index.tsx | 15 +- .../src/views/BI/ProjectForm/index.tsx | 18 +- .../src/views/BI/SequenceDiagram/index.tsx | 11 +- .../components/ResourceAccordionV2.tsx | 266 +++++++++++++ .../src/views/BI/ServiceDesigner/index.tsx | 103 +++-- .../src/views/BI/WelcomeView/index.tsx | 2 +- .../src/views/GraphQLDiagram/index.tsx | 7 +- .../src/views/SequenceDiagram/index.tsx | 158 -------- .../bi-diagram/src/components/Diagram.tsx | 1 - .../src/components/NodeIcon/index.tsx | 19 +- .../AgentCallNode/AgentCallNodeWidget.tsx | 22 +- .../bi-diagram/src/visitors/SizingVisitor.ts | 4 +- .../nodes/EntryNode/EntryNodeWidget.tsx | 52 ++- .../src/TypeEditor/RecordEditor.tsx | 5 +- .../src/TypeEditor/Tabs/TypeCreatorTab.tsx | 1 + workspaces/bi/bi-extension/package.json | 7 +- .../project-explorer-provider.ts | 11 + .../src/icons/bi-ai-model.svg | 25 ++ .../font-wso2-vscode/src/icons/bi-brain.svg | 21 ++ .../font-wso2-vscode/src/icons/bi-cut.svg | 21 ++ .../font-wso2-vscode/src/icons/bi-db.svg | 21 ++ .../font-wso2-vscode/src/icons/bi-doc.svg | 21 ++ .../components/Common/HelperPane/index.tsx | 9 +- .../components/Common/types/helperPane.ts | 1 + .../components/Form/ExpressionEditor.tsx | 9 +- .../components/Token/index.tsx | 97 +++-- .../ExpressionEditor/constants/token.ts | 1 + .../ExpressionEditor/types/common.ts | 2 +- .../components/ExpressionEditor/types/form.ts | 8 +- .../ExpressionEditor/types/token.ts | 4 +- .../ExpressionEditor/utils/form.tsx | 3 + .../ExpressionEditor/utils/token.ts | 16 +- .../Form/FormExpressionField/index.tsx | 9 +- .../components/Form/FormTokenEditor/index.tsx | 9 +- .../Form/HelperPane/CategoryPage.tsx | 6 +- .../Form/HelperPane/ConfigsPage.tsx | 13 +- .../Form/HelperPane/FunctionsPage.tsx | 12 +- .../src/components/Form/HelperPane/index.tsx | 205 +++++++--- .../rpc-managers/mi-visualizer/rpc-manager.ts | 8 +- .../artifactTests/artifact.spec.ts | 3 + .../ArtifactTest/BallerinaModule.ts | 9 + .../components/UnitTest.ts | 2 +- .../components/Welcome.ts | 2 +- .../multiWorkspace.spec.ts | 10 +- .../projectTests/createProject.spec.ts | 2 +- .../mi-extension/src/util/migrationUtils.ts | 48 ++- .../mi-extension/src/visualizer/activate.ts | 4 +- 159 files changed, 3577 insertions(+), 1984 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/constants.ts delete mode 100644 workspaces/ballerina/ballerina-extension/src/features/editor-support/codelens-provider.ts delete mode 100644 workspaces/ballerina/ballerina-extension/src/features/editor-support/codelense-provider-visitor.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/views/ai-panel/utils.ts create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordionV2.tsx delete mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/SequenceDiagram/index.tsx create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-ai-model.svg create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-brain.svg create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-cut.svg create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-db.svg create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-doc.svg diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts index 58e108496bd..c3c73dabb45 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts @@ -73,19 +73,29 @@ export type Metadata = { icon?: string; keywords?: string[]; draft?: boolean; // for diagram draft nodes - data?: { - isDataMappedFunction?: boolean; - isAgentTool?: boolean; - isIsolatedFunction?: boolean; - tools?: ToolData[]; - model?: ToolData; - memory?: MemoryData; - agent?: AgentData; - paramsToHide?: string[]; // List of properties keys to to hide from forms - }; + data?: NodeMetadata | ParentMetadata; functionKind?: string; }; +export type NodeMetadata = { + isDataMappedFunction?: boolean; + isAgentTool?: boolean; + isIsolatedFunction?: boolean; + tools?: ToolData[]; + model?: ToolData; + memory?: MemoryData; + agent?: AgentData; + paramsToHide?: string[]; // List of properties keys to to hide from forms +}; + +export type ParentMetadata = { + kind: string; + label: string; + accessor?: string; + parameters?: string[]; + return?: string; +}; + export type ToolData = { name: string; description?: string; @@ -224,6 +234,7 @@ export enum DIRECTORY_MAP { FUNCTION = "FUNCTION", LISTENER = "LISTENER", LOCAL_CONNECTORS = "localConnectors", + MODEL_PROVIDER = "MODEL_PROVIDER", NP_FUNCTION = "NP_FUNCTION", REMOTE = "REMOTE", RESOURCE = "RESOURCE", @@ -365,6 +376,14 @@ export type NodeKind = | "LOCK" | "LV_EXPRESSION" | "MATCH" + | "MODEL_PROVIDER" + | "VECTOR_STORE" + | "VECTOR_KNOWLEDGE_BASE" + | "EMBEDDING_PROVIDER" + | "MODEL_PROVIDERS" + | "VECTOR_STORES" + | "VECTOR_KNOWLEDGE_BASES" + | "EMBEDDING_PROVIDERS" | "NEW_CONNECTION" | "NEW_DATA" | "NP_FUNCTION" diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/constants.ts b/workspaces/ballerina/ballerina-core/src/interfaces/constants.ts index c8d90f609a7..c75642b9b13 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/constants.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/constants.ts @@ -16,16 +16,16 @@ * under the License. */ -export enum SHARED_COMMANDS { - FORCE_UPDATE_PROJECT_ARTIFACTS = 'ballerina.force.update.artifacts', - SHOW_VISUALIZER = 'ballerina.show.visualizer', - GET_STATE_CONTEXT = 'ballerina.get.stateContext', - OPEN_BI_WELCOME = 'ballerina.open.bi.welcome', - OPEN_BI_NEW_PROJECT = 'ballerina.open.bi.new', - OPEN_SERVICE_FORM = 'ballerina.open.service.form', - OPEN_AI_PANEL = 'ballerina.open.ai.panel', - CLOSE_AI_PANEL = 'ballerina.close.ai.panel', - OPEN_AGENT_CHAT = 'ballerina.open.agent.chat' +export const SHARED_COMMANDS = { + FORCE_UPDATE_PROJECT_ARTIFACTS: 'ballerina.force.update.artifacts', + SHOW_VISUALIZER: 'ballerina.showVisualizer', + GET_STATE_CONTEXT: 'ballerina.get.stateContext', + OPEN_BI_WELCOME: 'ballerina.open.bi.welcome', + OPEN_BI_NEW_PROJECT: 'ballerina.open.bi.new', + OPEN_SERVICE_FORM: 'ballerina.open.service.form', + OPEN_AI_PANEL: 'ballerina.open.ai.panel', + CLOSE_AI_PANEL: 'ballerina.close.ai.panel', + OPEN_AGENT_CHAT: 'ballerina.open.agent.chat' } export const BI_COMMANDS = { @@ -42,6 +42,7 @@ export const BI_COMMANDS = { ADD_FUNCTION: 'BI.project-explorer.add-function', OPEN_TYPE_DIAGRAM: 'BI.view.typeDiagram', ADD_CONFIGURATION: 'BI.project-explorer.add-configuration', + VIEW_CONFIGURATION: 'BI.project-explorer.view-configuration', ADD_PROJECT: 'BI.project-explorer.add', SHOW_OVERVIEW: 'BI.project-explorer.overview', SWITCH_PROJECT: 'BI.project-explorer.switch-project', 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 65df74ce13c..7a3cf34686f 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -1400,6 +1400,16 @@ export interface ResourceReturnTypesResponse { // <-------- Service Designer Related -------> +export interface FunctionFromSourceRequest { + filePath: string; + codedata: CodeData; +} + +export interface FunctionFromSourceResponse { + function: FunctionModel; + errorMsg?: string; + stacktrace?: string; +} export interface FunctionNodeRequest { projectPath?: string; @@ -1412,11 +1422,11 @@ export interface FunctionNodeResponse { // <-------- AI Agent Related -------> -export interface AIAgentOrgRequest { +export interface AiModuleOrgRequest { projectPath: string; } -export interface AIAgentOrgResponse { +export interface AiModuleOrgResponse { orgName: string; } @@ -1570,7 +1580,8 @@ export enum ARTIFACT_TYPE { Types = "Types", NaturalFunctions = "Natural Functions", DataMappers = "Data Mappers", - Configurations = "Configurations" + Configurations = "Configurations", + Variables = "Variables" } export interface Artifacts { @@ -1644,6 +1655,7 @@ export interface BIInterface extends BaseLangClientInterface { // Function APIs getFunctionNode: (params: FunctionNodeRequest) => Promise; + getFunctionFromSource: (params: FunctionFromSourceRequest) => Promise; getDesignModel: (params: BIDesignModelRequest) => Promise; getType: (params: GetTypeRequest) => Promise; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts index 15a227f1e15..1c93a7ae60f 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts @@ -16,11 +16,11 @@ * under the License. */ -import { AIAgentOrgRequest, AIAgentOrgResponse, AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest, McpToolsRequest, McpToolsResponse } from "../../interfaces/extended-lang-client"; +import { AiModuleOrgRequest, AiModuleOrgResponse, AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest, McpToolsRequest, McpToolsResponse } from "../../interfaces/extended-lang-client"; import { AIAgentRequest, AIAgentResponse, AIAgentToolsUpdateRequest, McpToolUpdateRequest } from "./interfaces"; export interface AIAgentAPI { - getAgentOrg: (params: AIAgentOrgRequest) => Promise; + getAiModuleOrg: (params: AiModuleOrgRequest) => Promise; getAllAgents: (params: AINodesRequest) => Promise; getAllModels: (params: AIModelsRequest) => Promise; getAllMemoryManagers: (params: MemoryManagersRequest) => Promise; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts index 945c8d65476..d23d1998849 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts @@ -17,12 +17,12 @@ * * THIS FILE INCLUDES AUTO GENERATED CODE */ -import { AIAgentOrgRequest, AIAgentOrgResponse, AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest, McpToolsRequest, McpToolsResponse } from "../../interfaces/extended-lang-client"; +import { AiModuleOrgRequest, AiModuleOrgResponse, AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest, McpToolsRequest, McpToolsResponse } from "../../interfaces/extended-lang-client"; import { AIAgentRequest, AIAgentResponse, AIAgentToolsUpdateRequest, McpToolUpdateRequest } from "./interfaces"; import { RequestType, NotificationType } from "vscode-messenger-common"; const _preFix = "ai-agent"; -export const getAgentOrg: RequestType = { method: `${_preFix}/getAgentOrg` }; +export const getAiModuleOrg: RequestType = { method: `${_preFix}/getAiModuleOrg` }; export const getAllAgents: RequestType = { method: `${_preFix}/getAllAgents` }; export const getAllModels: RequestType = { method: `${_preFix}/getAllModels` }; export const getAllMemoryManagers: RequestType = { method: `${_preFix}/getAllMemoryManagers` }; 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 9e0d9250ac6..8018c78d59a 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 @@ -119,6 +119,10 @@ export interface BIDiagramAPI { deleteFlowNode: (params: BISourceCodeRequest) => Promise; deleteByComponentInfo: (params: BIDeleteByComponentInfoRequest) => Promise; getAvailableNodes: (params: BIAvailableNodesRequest) => Promise; + getAvailableModelProviders: (params: BIAvailableNodesRequest) => Promise; + getAvailableVectorStores: (params: BIAvailableNodesRequest) => Promise; + getAvailableEmbeddingProviders: (params: BIAvailableNodesRequest) => Promise; + getAvailableVectorKnowledgeBases: (params: BIAvailableNodesRequest) => Promise; getEnclosedFunction: (params: BIGetEnclosedFunctionRequest) => Promise; getNodeTemplate: (params: BINodeTemplateRequest) => Promise; getAiSuggestions: (params: BIAiSuggestionsRequest) => Promise; 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 ffc81232a22..91ee5a70a44 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 @@ -121,6 +121,10 @@ export const getSourceCode: RequestType = { method: `${_preFix}/deleteFlowNode` }; export const deleteByComponentInfo: RequestType = { method: `${_preFix}/deleteByComponentInfo` }; export const getAvailableNodes: RequestType = { method: `${_preFix}/getAvailableNodes` }; +export const getAvailableModelProviders: RequestType = { method: `${_preFix}/getAvailableModelProviders` }; +export const getAvailableVectorStores: RequestType = { method: `${_preFix}/getAvailableVectorStores` }; +export const getAvailableEmbeddingProviders: RequestType = { method: `${_preFix}/getAvailableEmbeddingProviders` }; +export const getAvailableVectorKnowledgeBases: RequestType = { method: `${_preFix}/getAvailableVectorKnowledgeBases` }; export const getEnclosedFunction: RequestType = { method: `${_preFix}/getEnclosedFunction` }; export const getNodeTemplate: RequestType = { method: `${_preFix}/getNodeTemplate` }; export const getAiSuggestions: RequestType = { method: `${_preFix}/getAiSuggestions` }; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/index.ts index 65bcacb2e6d..1b0d5d6a99f 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/index.ts @@ -17,7 +17,7 @@ */ import { UpdatedArtifactsResponse } from "../../interfaces/bi"; -import { ListenerModelRequest, ListenerModelResponse, ServiceModelRequest, ServiceModelResponse, ServiceModelFromCodeRequest, ServiceModelFromCodeResponse, HttpResourceModelRequest, HttpResourceModelResponse, FunctionSourceCodeRequest, ListenerSourceCodeRequest, ListenersRequest, ListenersResponse, ServiceSourceCodeRequest, ListenerModelFromCodeRequest, ListenerModelFromCodeResponse, TriggerModelsRequest, TriggerModelsResponse, FunctionModelRequest, FunctionModelResponse, ResourceReturnTypesRequest, ResourceReturnTypesResponse } from "../../interfaces/extended-lang-client"; +import { ListenerModelRequest, ListenerModelResponse, ServiceModelRequest, ServiceModelResponse, ServiceModelFromCodeRequest, ServiceModelFromCodeResponse, HttpResourceModelRequest, HttpResourceModelResponse, FunctionSourceCodeRequest, ListenerSourceCodeRequest, ListenersRequest, ListenersResponse, ServiceSourceCodeRequest, ListenerModelFromCodeRequest, ListenerModelFromCodeResponse, TriggerModelsRequest, TriggerModelsResponse, FunctionModelRequest, FunctionModelResponse, ResourceReturnTypesRequest, ResourceReturnTypesResponse, FunctionFromSourceRequest, FunctionFromSourceResponse } from "../../interfaces/extended-lang-client"; import { ExportOASRequest, ExportOASResponse, @@ -33,6 +33,7 @@ export interface ServiceDesignerAPI { getListenerModelFromCode: (params: ListenerModelFromCodeRequest) => Promise; getServiceModel: (params: ServiceModelRequest) => Promise; getFunctionModel: (params: FunctionModelRequest) => Promise; + getFunctionFromSource: (params: FunctionFromSourceRequest) => Promise; addServiceSourceCode: (params: ServiceSourceCodeRequest) => Promise; updateServiceSourceCode: (params: ServiceSourceCodeRequest) => Promise; getServiceModelFromCode: (params: ServiceModelFromCodeRequest) => Promise; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/rpc-type.ts index 43055ce5607..dc1b7c7ebbc 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/service-designer/rpc-type.ts @@ -18,7 +18,7 @@ * THIS FILE INCLUDES AUTO GENERATED CODE */ import { UpdatedArtifactsResponse } from "../../interfaces/bi"; -import { ListenerModelRequest, ListenerModelResponse, ServiceModelRequest, ServiceModelResponse, ServiceModelFromCodeRequest, ServiceModelFromCodeResponse, HttpResourceModelRequest, HttpResourceModelResponse, FunctionSourceCodeRequest, ListenerSourceCodeRequest, ListenersRequest, ListenersResponse, ServiceSourceCodeRequest, ListenerModelFromCodeRequest, ListenerModelFromCodeResponse, TriggerModelsRequest, TriggerModelsResponse, FunctionModelRequest, FunctionModelResponse, ResourceReturnTypesRequest, ResourceReturnTypesResponse } from "../../interfaces/extended-lang-client"; +import { ListenerModelRequest, ListenerModelResponse, ServiceModelRequest, ServiceModelResponse, ServiceModelFromCodeRequest, ServiceModelFromCodeResponse, HttpResourceModelRequest, HttpResourceModelResponse, FunctionSourceCodeRequest, ListenerSourceCodeRequest, ListenersRequest, ListenersResponse, ServiceSourceCodeRequest, ListenerModelFromCodeRequest, ListenerModelFromCodeResponse, TriggerModelsRequest, TriggerModelsResponse, FunctionModelRequest, FunctionModelResponse, ResourceReturnTypesRequest, ResourceReturnTypesResponse, FunctionFromSourceRequest, FunctionFromSourceResponse } from "../../interfaces/extended-lang-client"; import { ExportOASRequest, ExportOASResponse, @@ -35,6 +35,7 @@ export const updateListenerSourceCode: RequestType = { method: `${_preFix}/getListenerModelFromCode` }; export const getServiceModel: RequestType = { method: `${_preFix}/getServiceModel` }; export const getFunctionModel: RequestType = { method: `${_preFix}/getFunctionModel` }; +export const getFunctionFromSource: RequestType = { method: `${_preFix}/getFunctionFromSource` }; export const addServiceSourceCode: RequestType = { method: `${_preFix}/addServiceSourceCode` }; export const updateServiceSourceCode: RequestType = { method: `${_preFix}/updateServiceSourceCode` }; export const getServiceModelFromCode: RequestType = { method: `${_preFix}/getServiceModelFromCode` }; diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index 69638f959f9..30d804caec3 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -77,6 +77,7 @@ export enum MACHINE_VIEW { AddConnectionWizard = "Add Connection Wizard", ViewConfigVariables = "View Config Variables", EditConfigVariables = "Edit Config Variables", + AddConfigVariables = "Add Config Variables", EditConnectionWizard = "Edit Connection Wizard", BIMainFunctionForm = "Add Automation SKIP", BIFunctionForm = "Add Function SKIP", @@ -114,6 +115,7 @@ export interface VisualizerLocation { documentUri?: string; projectUri?: string; identifier?: string; + artifactType?: DIRECTORY_MAP; position?: NodePosition; syntaxTree?: STNode; isBI?: boolean; @@ -161,9 +163,9 @@ export interface DownloadProgress { step?: number; } -export type ChatNotify = +export type ChatNotify = | ChatStart - | IntermidaryState + | IntermidaryState | ChatContent | CodeDiagnostics | CodeMessages @@ -171,37 +173,37 @@ export type ChatNotify = | ChatError; export interface ChatStart { - type : "start"; + type: "start"; } export interface IntermidaryState { - type : "intermediary_state"; - state : TestGeneratorIntermediaryState; // Smells off. Must revist later. + type: "intermediary_state"; + state: TestGeneratorIntermediaryState; // Smells off. Must revist later. } //TODO: Maybe rename content_block to content_append? export interface ChatContent { - type : "content_block" | "content_replace"; + type: "content_block" | "content_replace"; content: string; } export interface CodeDiagnostics { - type : "diagnostics"; + type: "diagnostics"; diagnostics: DiagnosticEntry[]; } //TODO: I'm not sure about messages, maybe revisit later. export interface CodeMessages { - type : "messages"; + type: "messages"; messages: any[]; } export interface ChatStop { - type : "stop"; + type: "stop"; } export interface ChatError { - type : "error"; + type: "error"; content: string; } @@ -227,42 +229,72 @@ export const breakpointChanged: NotificationType = { method: 'breakpoin export type AIMachineStateValue = | 'Initialize' // (checking auth, first load) | 'Unauthenticated' // (show login window) - | 'Authenticating' // (waiting for SSO login result after redirect) + | { Authenticating: 'determineFlow' | 'ssoFlow' | 'apiKeyFlow' | 'validatingApiKey' } // hierarchical substates | 'Authenticated' // (ready, main view) | 'Disabled'; // (optional: if AI Chat is globally unavailable) export enum AIMachineEventType { CHECK_AUTH = 'CHECK_AUTH', LOGIN = 'LOGIN', + AUTH_WITH_API_KEY = 'AUTH_WITH_API_KEY', + SUBMIT_API_KEY = 'SUBMIT_API_KEY', LOGOUT = 'LOGOUT', SILENT_LOGOUT = "SILENT_LOGOUT", - LOGIN_SUCCESS = 'LOGIN_SUCCESS', + COMPLETE_AUTH = 'COMPLETE_AUTH', CANCEL_LOGIN = 'CANCEL_LOGIN', RETRY = 'RETRY', DISPOSE = 'DISPOSE', } -export type AIMachineEventValue = - | { type: AIMachineEventType.CHECK_AUTH } - | { type: AIMachineEventType.LOGIN } - | { type: AIMachineEventType.LOGOUT } - | { type: AIMachineEventType.SILENT_LOGOUT } - | { type: AIMachineEventType.LOGIN_SUCCESS } - | { type: AIMachineEventType.CANCEL_LOGIN } - | { type: AIMachineEventType.RETRY } - | { type: AIMachineEventType.DISPOSE }; - -interface AIUsageTokens { - maxUsage: number; - remainingTokens: number; +export type AIMachineEventMap = { + [AIMachineEventType.CHECK_AUTH]: undefined; + [AIMachineEventType.LOGIN]: undefined; + [AIMachineEventType.AUTH_WITH_API_KEY]: undefined; + [AIMachineEventType.SUBMIT_API_KEY]: { apiKey: string }; + [AIMachineEventType.LOGOUT]: undefined; + [AIMachineEventType.SILENT_LOGOUT]: undefined; + [AIMachineEventType.COMPLETE_AUTH]: undefined; + [AIMachineEventType.CANCEL_LOGIN]: undefined; + [AIMachineEventType.RETRY]: undefined; + [AIMachineEventType.DISPOSE]: undefined; +}; + +export type AIMachineSendableEvent = + | { [K in keyof AIMachineEventMap]: AIMachineEventMap[K] extends undefined + ? { type: K } + : { type: K; payload: AIMachineEventMap[K] } + }[keyof AIMachineEventMap]; + +export enum LoginMethod { + BI_INTEL = 'biIntel', + ANTHROPIC_KEY = 'anthropic_key' } -export interface AIUserToken { +interface BIIntelSecrets { accessToken: string; - usageTokens?: AIUsageTokens; + refreshToken: string; +} + +interface AnthropicKeySecrets { + apiKey: string; +} + +export type AuthCredentials = + | { + loginMethod: LoginMethod.BI_INTEL; + secrets: BIIntelSecrets; + } + | { + loginMethod: LoginMethod.ANTHROPIC_KEY; + secrets: AnthropicKeySecrets; + }; + +export interface AIUserToken { + token: string; // For BI Intel, this is the access token and for Anthropic, this is the API key } export interface AIMachineContext { + loginMethod?: LoginMethod; userToken?: AIUserToken; errorMessage?: string; } @@ -275,5 +307,5 @@ export enum ColorThemeKind { } export const aiStateChanged: NotificationType = { method: 'aiStateChanged' }; -export const sendAIStateEvent: RequestType = { method: 'sendAIStateEvent' }; +export const sendAIStateEvent: RequestType = { method: 'sendAIStateEvent' }; export const currentThemeChanged: NotificationType = { method: 'currentThemeChanged' }; diff --git a/workspaces/ballerina/ballerina-extension/.env.example b/workspaces/ballerina/ballerina-extension/.env.example index 44bc69d0787..e48ddcef710 100644 --- a/workspaces/ballerina/ballerina-extension/.env.example +++ b/workspaces/ballerina/ballerina-extension/.env.example @@ -1,4 +1,4 @@ -BALLERINA_ROOT_URL=https://dev-tools.wso2.com/ballerina-copilot/v2.0 +BALLERINA_ROOT_URL=https://dev-tools.wso2.com/ballerina-copilot BALLERINA_AUTH_ORG= BALLERINA_AUTH_CLIENT_ID= -BALLERINA_AUTH_REDIRECT_URL=https://98c70105-822c-4359-8579-4da58f0ab4b7.e1-us-east-azure.choreoapps.dev \ No newline at end of file +BALLERINA_AUTH_REDIRECT_URL=https://eae690d5-80c3-4fb7-9bc5-e8d747cca11b.e1-us-east-azure.choreoapps.dev diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 1401408a45a..862ce901578 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -404,7 +404,7 @@ "icon": "$(distro-delete)" }, { - "command": "ballerina.show.visualizer", + "command": "ballerina.showVisualizer", "title": "Show Visualizer", "icon": "$(distro-design-view)", "category": "Ballerina" @@ -465,6 +465,11 @@ "title": "Check drift between code and documentation (Experimental)", "category": "Ballerina" }, + { + "command": "ballerina.configureWso2DefaultModelProvider", + "title": "Configure default WSO2 model provider", + "category": "Ballerina" + }, { "command": "ballerina.configureDefaultModelForNaturalFunctions", "title": "Configure default model for natural functions (Experimental)", @@ -527,7 +532,7 @@ "category": "Ballerina" }, { - "command": "ballerina.tryit", + "command": "ballerina.tryIt", "title": "Open Try It", "category": "Ballerina", "icon": "$(server)" @@ -645,6 +650,13 @@ "group": "navigation", "category": "BI" }, + { + "command": "BI.project-explorer.view-configuration", + "title": "View Configurations", + "icon": "$(distro-design-view)", + "group": "navigation", + "category": "BI" + }, { "command": "BI.project-explorer.switch-project", "title": "Switch Project", @@ -744,7 +756,7 @@ "when": "resourceLangId == ballerina || isBallerinaDiagram" }, { - "command": "ballerina.tryit", + "command": "ballerina.tryIt", "group": "navigation@1", "title": "Open Try It", "when": "isBIProjectRunning" @@ -763,7 +775,7 @@ }, { "when": "resourceLangId == ballerina && !isPersistModelActive", - "command": "ballerina.show.visualizer", + "command": "ballerina.showVisualizer", "group": "navigation@3" }, { @@ -846,7 +858,7 @@ "when": "editorLangId != ballerina && !isBallerinaDiagram" }, { - "command": "ballerina.show.visualizer", + "command": "ballerina.showVisualizer", "when": "editorLangId == ballerina" }, { diff --git a/workspaces/ballerina/ballerina-extension/src/BalExtensionContext.ts b/workspaces/ballerina/ballerina-extension/src/BalExtensionContext.ts index 8a4c4fa6cdb..16ee5028d23 100644 --- a/workspaces/ballerina/ballerina-extension/src/BalExtensionContext.ts +++ b/workspaces/ballerina/ballerina-extension/src/BalExtensionContext.ts @@ -20,9 +20,11 @@ import { ExtensionContext } from "vscode"; import { AgentChatContext } from "./views/agent-chat/activate"; import { AIPanelPrompt } from "@wso2/ballerina-core"; +import { BallerinaExtension } from "./core"; export class BalExtensionContext { public context!: ExtensionContext; + public ballerinaExtInstance: BallerinaExtension; public aiChatDefaultPrompt?: AIPanelPrompt; public agentChatContext?: AgentChatContext; public hasPullModuleNotification = false; diff --git a/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts b/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts index 6326f6c0cc3..4fd9649660f 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 } from '@wso2/ballerina-core'; +import { stateChanged, getVisualizerLocation, VisualizerLocation, projectContentUpdated, aiStateChanged, sendAIStateEvent, popupStateChanged, getPopupVisualizerState, PopupVisualizerLocation, breakpointChanged, AIMachineEventType, ArtifactData, onArtifactUpdatedNotification, onArtifactUpdatedRequest, currentThemeChanged, AIMachineSendableEvent } 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'; @@ -41,7 +41,7 @@ import { registerSequenceDiagramRpcHandlers } from './rpc-managers/sequence-diag import { registerInlineDataMapperRpcHandlers } from './rpc-managers/inline-data-mapper/rpc-handler'; import { registerTestManagerRpcHandlers } from './rpc-managers/test-manager/rpc-handler'; import { registerIcpServiceRpcHandlers } from './rpc-managers/icp-service/rpc-handler'; -import { ballerinaExtInstance } from './core'; +import { extension } from './BalExtensionContext'; import { registerAgentChatRpcHandlers } from './rpc-managers/agent-chat/rpc-handler'; import { ArtifactsUpdated, ArtifactNotificationHandler } from './utils/project-artifacts-handler'; @@ -94,7 +94,7 @@ export class RPCLayer { // ----- AI Webview RPC Methods registerAiPanelRpcHandlers(RPCLayer._messenger); - RPCLayer._messenger.onRequest(sendAIStateEvent, (event: AIMachineEventType) => AIStateMachine.sendEvent(event)); + RPCLayer._messenger.onRequest(sendAIStateEvent, (event: AIMachineEventType | AIMachineSendableEvent) => AIStateMachine.sendEvent(event)); // ----- Inline Data Mapper Webview RPC Methods registerInlineDataMapperRpcHandlers(RPCLayer._messenger); @@ -136,7 +136,7 @@ async function getContext(): Promise { isBISupported: context.isBISupported, haveLS: StateMachine.langClient() && true, recordFilePath: path.join(context.projectUri, "types.bal"), - enableSequenceDiagram: ballerinaExtInstance.enableSequenceDiagramView(), + enableSequenceDiagram: extension.ballerinaExtInstance.enableSequenceDiagramView(), target: context.metadata?.target }, scope: context.scope, 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 9db333804c8..2d592e2022d 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts @@ -182,8 +182,8 @@ import { FunctionModelRequest, FunctionModelResponse, TypeDataWithReferences, - AIAgentOrgRequest, - AIAgentOrgResponse, + AiModuleOrgRequest, + AiModuleOrgResponse, AINodesResponse, AIModelsRequest, AIToolsRequest, @@ -234,7 +234,9 @@ import { CopilotAllLibrariesRequest, CopilotFilterLibrariesResponse, CopilotFilterLibrariesRequest, - GetConfigVariableNodeTemplateRequest + GetConfigVariableNodeTemplateRequest, + FunctionFromSourceRequest, + FunctionFromSourceResponse } from "@wso2/ballerina-core"; import { BallerinaExtension } from "./index"; import { debug, handlePullModuleProgress } from "../utils"; @@ -299,6 +301,10 @@ enum EXTENDED_APIS { BI_DELETE_NODE = 'flowDesignService/deleteFlowNode', BI_DELETE_BY_COMPONENT_INFO = 'flowDesignService/deleteComponent', BI_AVAILABLE_NODES = 'flowDesignService/getAvailableNodes', + BI_AVAILABLE_MODEL_PROVIDERS = 'flowDesignService/getAvailableModelProviders', + BI_AVAILABLE_VECTOR_STORES = 'flowDesignService/getAvailableVectorStores', + BI_AVAILABLE_EMBEDDING_PROVIDERS = 'flowDesignService/getAvailableEmbeddingProviders', + BI_AVAILABLE_VECTOR_KNOWLEDGE_BASES = 'flowDesignService/getAvailableVectorKnowledgeBases', BI_NODE_TEMPLATE = 'flowDesignService/getNodeTemplate', BI_GEN_OPEN_API = 'flowDesignService/generateServiceFromOpenApiContract', BI_MODULE_NODES = 'flowDesignService/getModuleNodes', @@ -359,6 +365,7 @@ enum EXTENDED_APIS { BI_SERVICE_ADD_FUNCTION = 'serviceDesign/addFunction', BI_SERVICE_UPDATE_RESOURCE = 'serviceDesign/updateFunction', BI_SERVICE_SERVICE_CLASS_MODEL = 'serviceDesign/getServiceClassModelFromSource', + BI_GET_FUNCTION_FROM_SOURCE = 'serviceDesign/getFunctionFromSource', BI_UPDATE_CLASS_FIELD = 'serviceDesign/updateClassField', BI_ADD_CLASS_FIELD = 'serviceDesign/addField', BI_DESIGN_MODEL = 'designModelService/getDesignModel', @@ -370,7 +377,7 @@ enum EXTENDED_APIS { BI_ADD_TEST_FUNCTION = 'testManagerService/addTestFunction', BI_UPDATE_TEST_FUNCTION = 'testManagerService/updateTestFunction', BI_EDIT_FUNCTION_NODE = 'flowDesignService/functionDefinition', - BI_AI_AGENT_ORG = 'agentManager/getAgentOrg', + BI_AI_AGENT_ORG = 'agentManager/getAiModuleOrg', BI_AI_ALL_AGENTS = 'agentManager/getAllAgents', BI_AI_ALL_MODELS = 'agentManager/getAllModels', BI_AI_ALL_MEMORY_MANAGERS = 'agentManager/getAllMemoryManagers', @@ -878,6 +885,22 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest(EXTENDED_APIS.BI_AVAILABLE_NODES, params); } + async getAvailableModelProviders(params: BIAvailableNodesRequest): Promise { + return this.sendRequest(EXTENDED_APIS.BI_AVAILABLE_MODEL_PROVIDERS, params); + } + + async getAvailableVectorStores(params: BIAvailableNodesRequest): Promise { + return this.sendRequest(EXTENDED_APIS.BI_AVAILABLE_VECTOR_STORES, params); + } + + async getAvailableEmbeddingProviders(params: BIAvailableNodesRequest): Promise { + return this.sendRequest(EXTENDED_APIS.BI_AVAILABLE_EMBEDDING_PROVIDERS, params); + } + + async getAvailableVectorKnowledgeBases(params: BIAvailableNodesRequest): Promise { + return this.sendRequest(EXTENDED_APIS.BI_AVAILABLE_VECTOR_KNOWLEDGE_BASES, params); + } + async getEnclosedFunctionDef(params: BIGetEnclosedFunctionRequest): Promise { return this.sendRequest(EXTENDED_APIS.BI_GET_ENCLOSED_FUNCTION, params); } @@ -1027,6 +1050,10 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest(EXTENDED_APIS.BI_SERVICE_SERVICE_CLASS_MODEL, params); } + async getFunctionFromSource(params: FunctionFromSourceRequest): Promise { + return this.sendRequest(EXTENDED_APIS.BI_GET_FUNCTION_FROM_SOURCE, params); + } + async updateClassField(params: ClassFieldModifierRequest): Promise { return this.sendRequest(EXTENDED_APIS.BI_UPDATE_CLASS_FIELD, params); } @@ -1107,8 +1134,8 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest(EXTENDED_APIS.BI_ADD_FUNCTION, params); } - async getAgentOrg(params: AIAgentOrgRequest) : Promise { - return this.sendRequest(EXTENDED_APIS.BI_AI_AGENT_ORG, params); + async getAiModuleOrg(params: AiModuleOrgRequest) : Promise { + return this.sendRequest(EXTENDED_APIS.BI_AI_AGENT_ORG, params); } async getAllAgents(params: AINodesRequest): Promise { diff --git a/workspaces/ballerina/ballerina-extension/src/core/extension.ts b/workspaces/ballerina/ballerina-extension/src/core/extension.ts index 57bae14ceb4..28c1e3abe41 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extension.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extension.ts @@ -294,7 +294,7 @@ export class BallerinaExtension { debug(`Feature flags - Experimental: ${this.enabledExperimentalFeatures()}, BI: ${this.biSupported}, NP: ${this.isNPSupported}`); if (!this.ballerinaVersion.match(SWAN_LAKE_REGEX) || (this.ballerinaVersion.match(SWAN_LAKE_REGEX) && - !isSupportedVersion(ballerinaExtInstance, VERSION.BETA, 3))) { + !isSupportedVersion(this, VERSION.BETA, 3))) { this.showMessageOldBallerina(); const message = `Ballerina version ${this.ballerinaVersion} is not supported. The extension supports Ballerina Swan Lake Beta 3+ versions.`; @@ -1675,7 +1675,7 @@ export class BallerinaExtension { if (download === selection) { commands.executeCommand('vscode.open', Uri.parse(DOWNLOAD_BALLERINA)); } else if (viewLogs === selection) { - const balOutput = ballerinaExtInstance.getOutPutChannel(); + const balOutput = this.getOutPutChannel(); if (balOutput) { balOutput.show(); } @@ -2179,5 +2179,3 @@ function getShellEnvironment(): Promise { }); }); } - -export const ballerinaExtInstance = new BallerinaExtension(); diff --git a/workspaces/ballerina/ballerina-extension/src/extension.ts b/workspaces/ballerina/ballerina-extension/src/extension.ts index f4a3348f32e..51411b44a53 100644 --- a/workspaces/ballerina/ballerina-extension/src/extension.ts +++ b/workspaces/ballerina/ballerina-extension/src/extension.ts @@ -17,7 +17,7 @@ */ import { ExtensionContext, commands, window, Location, Uri, TextEditor, extensions } from 'vscode'; -import { ballerinaExtInstance, BallerinaExtension } from './core'; +import { BallerinaExtension } from './core'; import { activate as activateBBE } from './views/bbe'; import { activate as activateTelemetryListener, CMP_EXTENSION_CORE, sendTelemetryEvent, @@ -94,7 +94,7 @@ function onBeforeInit(langClient: ExtendedLangClient) { } fillClientCapabilities(capabilities: ExtendedClientCapabilities): void { capabilities.experimental = capabilities.experimental || { introspection: false, showTextDocument: false }; - capabilities.experimental.experimentalLanguageFeatures = ballerinaExtInstance.enabledExperimentalFeatures(); + capabilities.experimental.experimentalLanguageFeatures = extension.ballerinaExtInstance.enabledExperimentalFeatures(); } initialize(_capabilities: ServerCapabilities, _documentSelector: DocumentSelector | undefined): void { } @@ -112,10 +112,12 @@ export async function activate(context: ExtensionContext) { // Wait for the ballerina extension to be ready await StateMachine.initialize(); // Then return the ballerina extension context - return { ballerinaExtInstance, projectPath: StateMachine.context().projectUri }; + return { ballerinaExtInstance: extension.ballerinaExtInstance, projectPath: StateMachine.context().projectUri }; } export async function activateBallerina(): Promise { + const ballerinaExtInstance = new BallerinaExtension(); + extension.ballerinaExtInstance = ballerinaExtInstance; debug('Active the Ballerina VS Code extension.'); sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_EXTENSION_ACTIVATE, CMP_EXTENSION_CORE); ballerinaExtInstance.setContext(extension.context); @@ -242,6 +244,6 @@ export function deactivate(): Thenable | undefined { if (!langClient) { return; } - ballerinaExtInstance.telemetryReporter.dispose(); + extension.ballerinaExtInstance.telemetryReporter.dispose(); return langClient.stop(); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts index 07df9a8c2a6..d0eff4fdc50 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts @@ -16,8 +16,11 @@ * under the License. */ +import vscode from 'vscode'; import { BallerinaExtension, ExtendedLangClient } from '../../core'; import { activateCopilotLoginCommand, resetBIAuth } from './completions'; +import { addConfigFile, getConfigFilePath } from './utils'; +import { StateMachine } from "../../stateMachine"; export let langClient: ExtendedLangClient; @@ -25,4 +28,15 @@ export function activateAIFeatures(ballerinaExternalInstance: BallerinaExtension langClient = ballerinaExternalInstance.langClient; activateCopilotLoginCommand(); resetBIAuth(); + + const projectPath = StateMachine.context().projectUri; + + vscode.commands.registerCommand("ballerina.configureWso2DefaultModelProvider", async (...args: any[]) => { + const configPath = await getConfigFilePath(ballerinaExternalInstance, projectPath); + if (configPath !== null) { + addConfigFile(configPath); + } + }); } + + diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/completions.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/completions.ts index 2fb684346aa..d143bc84852 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/completions.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/completions.ts @@ -16,7 +16,7 @@ * under the License. */ -import { ballerinaExtInstance } from "./../../core"; +import { extension } from "../../BalExtensionContext"; import { commands, window } from "vscode"; import { TM_EVENT_AUTH_COPILOT, CMP_AUTH_COPILOT, sendTelemetryEvent, @@ -32,11 +32,11 @@ import { ChatNotify, onChatNotify } from "@wso2/ballerina-core"; export function activateCopilotLoginCommand() { commands.registerCommand(PALETTE_COMMANDS.LOGIN_COPILOT, async () => { try { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_AUTH_COPILOT, CMP_AUTH_COPILOT); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_AUTH_COPILOT, CMP_AUTH_COPILOT); await loginGithubCopilot(); } catch (error) { if (error instanceof Error) { - sendTelemetryException(ballerinaExtInstance, error, CMP_AUTH_COPILOT); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_AUTH_COPILOT); window.showErrorMessage(error.message); } else { window.showErrorMessage("Unkown error occurred."); @@ -47,8 +47,8 @@ export function activateCopilotLoginCommand() { export function resetBIAuth() { commands.registerCommand(PALETTE_COMMANDS.RESET_BI, async () => { - await ballerinaExtInstance.context.secrets.delete('GITHUB_TOKEN'); - await ballerinaExtInstance.context.secrets.delete('GITHUB_COPILOT_TOKEN'); - await ballerinaExtInstance.context.secrets.delete('LOGIN_ALERT_SHOWN'); + await extension.ballerinaExtInstance.context.secrets.delete('GITHUB_TOKEN'); + await extension.ballerinaExtInstance.context.secrets.delete('GITHUB_COPILOT_TOKEN'); + await extension.ballerinaExtInstance.context.secrets.delete('LOGIN_ALERT_SHOWN'); }); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/constants.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/constants.ts new file mode 100644 index 00000000000..78ed49ae313 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/constants.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. + */ + +export const CONFIG_FILE_NAME = "Config.toml"; +export const PROGRESS_BAR_MESSAGE_FROM_WSO2_DEFAULT_MODEL = "Fetching and saving access token for WSO2 default model"; +export const ERROR_NO_BALLERINA_SOURCES = "No Ballerina sources"; +export const LOGIN_REQUIRED_WARNING = "Please sign in to BI Copilot to use this feature."; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts index d4452fd897c..e9009e71d00 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts @@ -15,11 +15,11 @@ // under the License. import { generateText } from "ai"; -import { LIBS_URL } from "../../utils"; +import { BACKEND_URL } from "../../utils"; import { selectRequiredFunctions } from "../libs/funcs"; import { GenerationType, getSelectedLibraries } from "../libs/libs"; import { Library, LibraryWithUrl } from "../libs/libs_types"; -import { anthropic, ANTHROPIC_HAIKU, fetchWithAuth } from "../connection"; +import { getAnthropicClient, ANTHROPIC_HAIKU, fetchWithAuth } from "../connection"; import { z } from 'zod'; import { tool } from 'ai'; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; @@ -94,7 +94,7 @@ async function extractLearnPages(query: string): Promise { async function fetchDocumentationFromVectorStore(query: string): Promise { try { - const response = await fetchWithAuth(`${LIBS_URL}/topK`, { + const response = await fetchWithAuth(`${BACKEND_URL}/learn-docs-api/v1.0/topK`, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -219,7 +219,7 @@ export async function getAskResponse(question: string): Promise async function getToolCallsFromClaude(question: string): Promise { const { text, toolCalls } = await generateText({ - model: anthropic(ANTHROPIC_HAIKU), + model: await getAnthropicClient(ANTHROPIC_HAIKU), maxTokens: 8192, tools: tools, messages: [ @@ -244,7 +244,7 @@ async function getToolCallsFromClaude(question: string): Promise { async function getFinalResponseFromClaude(systemMessage: string, question: string): Promise { const { text } = await generateText({ - model: anthropic(ANTHROPIC_HAIKU), + model: await getAnthropicClient(ANTHROPIC_HAIKU), maxTokens: 8192, system: systemMessage, messages: [ diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index b4d5cc25555..79808272d29 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -15,7 +15,7 @@ // under the License. import { CoreMessage, generateText, streamText } from "ai"; -import { anthropic, ANTHROPIC_SONNET_4 } from "../connection"; +import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; import { GenerationType, getRelevantLibrariesAndFunctions } from "../libs/libs"; import { getRewrittenPrompt, populateHistory, transformProjectSource, getErrorMessage, extractResourceDocumentContent } from "../utils"; import { getMaximizedSelectedLibs, selectRequiredFunctions, toMaximizedLibrariesFromLibJson } from "./../libs/funcs"; @@ -75,7 +75,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler ]; const { fullStream } = streamText({ - model: anthropic(ANTHROPIC_SONNET_4), + model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxTokens: 4096*4, temperature: 0, messages: allMessages, @@ -329,7 +329,7 @@ export async function repairCode(params: RepairParams): Promise ]; const { text, usage, providerMetadata } = await generateText({ - model: anthropic(ANTHROPIC_SONNET_4), + model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxTokens: 4096 * 4, temperature: 0, messages: allMessages, diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts index ef4df70cec7..01553b83af6 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts @@ -15,9 +15,22 @@ // under the License. import { createAnthropic } from "@ai-sdk/anthropic"; -import { getAccessToken, getRefreshedAccessToken } from "../../../utils/ai/auth"; +import { getAccessToken, getLoginMethod, getRefreshedAccessToken } from "../../../utils/ai/auth"; import { AIStateMachine } from "../../../views/ai-panel/aiMachine"; -import { AIMachineEventType } from "@wso2/ballerina-core"; +import { BACKEND_URL } from "../utils"; +import { AIMachineEventType, LoginMethod } from "@wso2/ballerina-core"; + +export const ANTHROPIC_HAIKU = "claude-3-5-haiku-20241022"; +export const ANTHROPIC_SONNET_4 = "claude-sonnet-4-20250514"; +export const ANTHROPIC_SONNET_3_5 = "claude-3-5-sonnet-20241022"; + +type AnthropicModel = + | typeof ANTHROPIC_HAIKU + | typeof ANTHROPIC_SONNET_4 + | typeof ANTHROPIC_SONNET_3_5; + +let cachedAnthropic: ReturnType | null = null; +let cachedAuthMethod: LoginMethod | null = null; /** * Reusable fetch function that handles authentication with token refresh @@ -25,47 +38,73 @@ import { AIMachineEventType } from "@wso2/ballerina-core"; * @param options - Fetch options * @returns Promise */ -export async function fetchWithAuth(input: string | URL | Request, options: RequestInit = {}): Promise { - const accessToken = await getAccessToken(); - - // Ensure headers object exists - options.headers = { - ...options.headers, - 'Authorization': `Bearer ${accessToken}`, - 'User-Agent': 'Ballerina-VSCode-Plugin', - 'Connection': 'keep-alive', - }; - - let response = await fetch(input, options); - console.log("Response status: ", response.status); - - // Handle token expiration - if (response.status === 401) { - console.log("Token expired. Refreshing token..."); - const newToken = await getRefreshedAccessToken(); - if (newToken) { - options.headers = { - ...options.headers, - 'Authorization': `Bearer ${newToken}`, - }; - response = await fetch(input, options); - } else { +export async function fetchWithAuth(input: string | URL | Request, options: RequestInit = {}): Promise { + try { + const accessToken = await getAccessToken(); + + // Ensure headers object exists + options.headers = { + ...options.headers, + 'Authorization': `Bearer ${accessToken}`, + 'User-Agent': 'Ballerina-VSCode-Plugin', + 'Connection': 'keep-alive', + }; + + let response = await fetch(input, options); + console.log("Response status: ", response.status); + + // Handle token expiration + if (response.status === 401) { + console.log("Token expired. Refreshing token..."); + const newToken = await getRefreshedAccessToken(); + if (newToken) { + options.headers = { + ...options.headers, + 'Authorization': `Bearer ${newToken}`, + }; + response = await fetch(input, options); + } else { + AIStateMachine.service().send(AIMachineEventType.LOGOUT); + return; + } + } + + return response; + } catch (error: any) { + if (error?.message === "TOKEN_EXPIRED") { AIStateMachine.service().send(AIMachineEventType.LOGOUT); - throw new Error('Authentication failed: Unable to refresh token'); } + return; } - - return response; } -let url = "https://e95488c8-8511-4882-967f-ec3ae2a0f86f-prod.e1-us-east-azure.choreoapis.dev/ballerina-copilot/intelligence-api/v1.0/claude"; +/** + * Returns a singleton Anthropic client instance. + * Re-initializes the client if the login method has changed. + */ +export const getAnthropicClient = async (model: AnthropicModel) => { + const loginMethod = await getLoginMethod(); + + // Recreate client if login method has changed or no cached instance + if (!cachedAnthropic || cachedAuthMethod !== loginMethod) { + if (loginMethod === LoginMethod.BI_INTEL) { + cachedAnthropic = createAnthropic({ + baseURL: BACKEND_URL + "/intelligence-api/v1.0/claude", + apiKey: "xx", // dummy value; real auth is via fetchWithAuth + fetch: fetchWithAuth, + }); + } else if (loginMethod === LoginMethod.ANTHROPIC_KEY) { + const apiKey = await getAccessToken(); + cachedAnthropic = createAnthropic({ + baseURL: "https://api.anthropic.com/v1", + apiKey: apiKey, + }); + } else { + throw new Error(`Unsupported login method: ${loginMethod}`); + } -export const anthropic = createAnthropic({ - baseURL: url, - apiKey: "xx", //TODO: Gives error without this. see if we can remove, - fetch: fetchWithAuth, -}); + cachedAuthMethod = loginMethod; + } -export const ANTHROPIC_HAIKU = "claude-3-5-haiku-20241022"; -export const ANTHROPIC_SONNET_4 = "claude-sonnet-4-20250514"; -export const ANTHROPIC_SONNET_3_5 = "claude-3-5-sonnet-20241022"; + return cachedAnthropic(model); +}; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts index 764516f5546..fdbbc67a4ec 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts @@ -15,7 +15,7 @@ // under the License. import { generateText, CoreMessage } from "ai"; -import { anthropic, ANTHROPIC_SONNET_4 } from "../connection"; +import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; // Types @@ -425,7 +425,7 @@ async function extractionUsingClaude({ pdfData, processType }: { pdfData: string ]; const { text } = await generateText({ - model: anthropic(ANTHROPIC_SONNET_4), + model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxTokens: 8192, temperature: 0, messages: messages, @@ -467,7 +467,7 @@ async function imageExtractionUsingClaude({ ]; const { text } = await generateText({ - model: anthropic(ANTHROPIC_SONNET_4), + model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxTokens: 8192, temperature: 0, messages: messages, @@ -494,7 +494,7 @@ async function textExtractionUsingClaude({ ]; const { text } = await generateText({ - model: anthropic(ANTHROPIC_SONNET_4), + model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxTokens: 8192, temperature: 0, messages: messages, 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 index 8cc63533652..2a434b60ae9 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts @@ -16,7 +16,7 @@ import { generateText, CoreMessage, generateObject } from "ai"; import { getDataMappingPrompt } from "./prompt"; -import { anthropic, ANTHROPIC_SONNET_4 } from "../connection"; +import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; import { Payload, DatamapperResponse, @@ -35,7 +35,7 @@ import { Structure, ChatResponse, } from "./types"; -import { DataMappingSchema } from "./schema"; +import { MappingSchema } from "./schema"; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; // ============================================================================= @@ -293,15 +293,15 @@ async function getAutoMappings( try { const { object } = await generateObject({ - model: anthropic(ANTHROPIC_SONNET_4), + model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxTokens: 4096, temperature: 0, messages: messages, - schema: DataMappingSchema, + schema: MappingSchema, abortSignal: AIPanelAbortController.getInstance().signal, }); - const generatedMappings = object as AIDataMappings; + const generatedMappings = object.generatedMappings as AIDataMappings; return generatedMappings; } catch (error) { console.error("Failed to parse response:", error); diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/schema.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/schema.ts index e4522337c40..eae58bd7d50 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/schema.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/schema.ts @@ -54,3 +54,8 @@ export const DataMappingSchema = z.record( ]) ); +// Top-level schema for the data mapping +export const MappingSchema = z.object({ + generatedMappings: DataMappingSchema +}); + 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 index 1cc3664af84..a2c9d75974f 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts @@ -15,7 +15,7 @@ // under the License. import { CoreMessage, generateObject, streamText } from "ai"; -import { anthropic, ANTHROPIC_HAIKU, ANTHROPIC_SONNET_4 } from "../connection"; +import { getAnthropicClient, ANTHROPIC_HAIKU, ANTHROPIC_SONNET_4 } from "../connection"; import { GenerationType, getRelevantLibrariesAndFunctions } from "../libs/libs"; import { getRewrittenPrompt, populateHistory, transformProjectSource, getErrorMessage } from "../utils"; import { libraryContains } from "../libs/funcs"; @@ -35,9 +35,8 @@ import { ProjectSource, SourceFiles, OperationType, - PostProcessResponse, } from "@wso2/ballerina-core"; -import { getProjectSource, postProcess } from "../../../../rpc-managers/ai-panel/rpc-manager"; +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"; @@ -81,8 +80,8 @@ export async function generateHealthcareCodeCore( ]; const { fullStream } = streamText({ - model: anthropic(ANTHROPIC_SONNET_4), - maxTokens: 4096*2, + model: await getAnthropicClient(ANTHROPIC_SONNET_4), + maxTokens: 4096 * 2, temperature: 0, messages: allMessages, abortSignal: AIPanelAbortController.getInstance().signal, @@ -108,7 +107,7 @@ export async function generateHealthcareCodeCore( const finishReason = part.finishReason; console.log("Finish reason: ", finishReason); if (finishReason === "error") { - // Already handled in error case. + // Already handled in error case. break; } eventHandler({ type: "stop" }); @@ -147,7 +146,7 @@ function getSystemPromptSuffix(langlibs: Library[]) { ${JSON.stringify(langlibs)} -If the query doesn't require code examples, answer the code by utilzing the api documentation. +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: @@ -178,7 +177,7 @@ If the query requires code, Follow these steps to generate the Ballerina code: 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). + - 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. @@ -201,13 +200,13 @@ Important reminders: - 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. +- 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. +- 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. +- 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. @@ -234,10 +233,10 @@ Important reminders: \`\`\ - 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. +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. +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: @@ -269,11 +268,11 @@ function getUserPrompt( fileInstructions = `4. File Upload Contents. : Contents of the file which the user uploaded as addtional information for the query. ${fileUploadContents - .map( - (file) => `File Name: ${file.fileName} + .map( + (file) => `File Name: ${file.fileName} Content: ${file.content}` - ) - .join("\n")}`; + ) + .join("\n")}`; } return `QUERY: The query you need to answer using the provided api documentation. @@ -357,7 +356,7 @@ Think step-by-step to choose the required types in order to solve the given ques ]; try { const { object } = await generateObject({ - model: anthropic(ANTHROPIC_HAIKU), + model: await getAnthropicClient(ANTHROPIC_HAIKU), maxTokens: 8192, temperature: 0, messages: messages, diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts index 860ba6bf94f..d898a0b36b4 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts @@ -19,7 +19,7 @@ import { generateObject, CoreMessage } from "ai"; import { GetFunctionResponse, GetFunctionsRequest, GetFunctionsResponse, getFunctionsResponseSchema, MinifiedClient, MinifiedRemoteFunction, MinifiedResourceFunction } from "./funcs_inter_types"; import { Client, GetTypeResponse, Library, RemoteFunction, ResourceFunction } from "./libs_types"; import { TypeDefinition, AbstractFunction, Type, RecordTypeDefinition } from "./libs_types"; -import { anthropic, ANTHROPIC_HAIKU } from "../connection"; +import { getAnthropicClient, ANTHROPIC_HAIKU } from "../connection"; import { GenerationType } from "./libs"; import { getRequiredTypesFromLibJson } from "../healthcare/healthcare"; import { langClient } from "../../activator"; @@ -199,7 +199,7 @@ Now, based on the provided libraries, clients, and functions, and the user query ]; try { const { object } = await generateObject({ - model: anthropic(ANTHROPIC_HAIKU), + model: await getAnthropicClient(ANTHROPIC_HAIKU), maxTokens: 8192, temperature: 0, messages: messages, 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 index 6e93227c10b..a0dc70913f6 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts @@ -23,7 +23,7 @@ import { } from "@wso2/ballerina-core"; import { Library } from "./libs_types"; import { selectRequiredFunctions } from "./funcs"; -import { anthropic, ANTHROPIC_HAIKU } from "../connection"; +import { getAnthropicClient, ANTHROPIC_HAIKU } from "../connection"; import { langClient } from "../../activator"; import { getGenerationMode } from "../utils"; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; @@ -80,7 +80,7 @@ export async function getSelectedLibraries(prompt: string, generationType: Gener //TODO: Add thinking and test with claude haiku const startTime = Date.now(); const { object } = await generateObject({ - model: anthropic(ANTHROPIC_HAIKU), + model: await getAnthropicClient(ANTHROPIC_HAIKU), maxTokens: 4096, temperature: 0, messages: messages, diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts index 56dd43dd820..f14f35266c8 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts @@ -16,7 +16,7 @@ import { GenerateOpenAPIRequest } from "@wso2/ballerina-core"; import { streamText } from "ai"; -import { anthropic, ANTHROPIC_HAIKU } from "../connection"; +import { getAnthropicClient, ANTHROPIC_HAIKU } from "../connection"; import { getErrorMessage, populateHistory } from "../utils"; import { CopilotEventHandler, createWebviewEventHandler } from "../event"; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; @@ -29,7 +29,7 @@ export async function generateOpenAPISpecCore( // Populate chat history and add user message const historyMessages = populateHistory(params.chatHistory); const { fullStream } = streamText({ - model: anthropic(ANTHROPIC_HAIKU), + model: await getAnthropicClient(ANTHROPIC_HAIKU), maxTokens: 8192, temperature: 0, messages: [ 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 index c7deeede90d..823ca0e19ba 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts @@ -15,7 +15,7 @@ // under the License. import { generateText, CoreMessage } from "ai"; -import { anthropic } from "../connection"; +import { getAnthropicClient } from "../connection"; import { getServiceTestGenerationSystemPrompt, getServiceTestDiagnosticsSystemPrompt, @@ -103,7 +103,7 @@ async function getStreamedTestResponse(request: TestGenerationRequest1): Promise } const { text } = await generateText({ - model: anthropic("claude-sonnet-4-20250514"), + model: await getAnthropicClient("claude-sonnet-4-20250514"), maxTokens: 16384, temperature: 0, system: systemPrompt, 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 index bb01764a329..9c224e4f22c 100644 --- 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 @@ -15,7 +15,7 @@ // under the License. import { CoreMessage, streamText } from "ai"; -import { anthropic, ANTHROPIC_SONNET_4 } from "../connection"; +import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; import { getErrorMessage } from "../utils"; import { TestGenerationTarget, TestPlanGenerationRequest } from "@wso2/ballerina-core"; import { generateTest, getDiagnostics } from "../../testGenerator"; @@ -122,7 +122,7 @@ export async function generateTestPlanCore( }, ]; const { fullStream } = streamText({ - model: anthropic(ANTHROPIC_SONNET_4), + model: await getAnthropicClient(ANTHROPIC_SONNET_4), maxTokens: 8192, temperature: 0, messages: allMessages, diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts index 63f8db8d6ab..ddef12d66f5 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts @@ -18,9 +18,16 @@ import * as fs from 'fs'; import path from "path"; -import { Uri, workspace } from 'vscode'; +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 { AIMachineEventType } from '@wso2/ballerina-core/lib/state-machine-types'; +import { CONFIG_FILE_NAME, ERROR_NO_BALLERINA_SOURCES, LOGIN_REQUIRED_WARNING, PROGRESS_BAR_MESSAGE_FROM_WSO2_DEFAULT_MODEL } from './constants'; +import { getCurrentBallerinaProjectFromContext } from '../config-generator/configGenerator'; +import { BallerinaProject } from '@wso2/ballerina-core'; +import { BallerinaExtension } from 'src/core'; const config = workspace.getConfiguration('ballerina'); export const BACKEND_URL : string = config.get('rootUrl') || process.env.BALLERINA_ROOT_URL; @@ -28,8 +35,8 @@ export const AUTH_ORG : string = config.get('authOrg') || process.env.BALLERINA_ export const AUTH_CLIENT_ID : string = config.get('authClientID') || process.env.BALLERINA_AUTH_CLIENT_ID; export const AUTH_REDIRECT_URL : string = config.get('authRedirectURL') || process.env.BALLERINA_AUTH_REDIRECT_URL; -// Add new config exports for other services -export const LIBS_URL : string = "https://e95488c8-8511-4882-967f-ec3ae2a0f86f-prod.e1-us-east-azure.choreoapis.dev/ballerina-copilot/ballerina-learn-docs-api/v1.0"; +// This refers to old backend before FE Migration. We need to eventually remove this. +export const OLD_BACKEND_URL : string = BACKEND_URL + "/v2.0"; export async function closeAllBallerinaFiles(dirPath: string): Promise { // Check if the directory exists @@ -44,17 +51,17 @@ export async function closeAllBallerinaFiles(dirPath: string): Promise { // Function to recursively find and close .bal files async function processDir(currentPath: string): Promise { const entries = fs.readdirSync(currentPath, { withFileTypes: true }); - + for (const entry of entries) { const entryPath = path.join(currentPath, entry.name); - + if (entry.isDirectory()) { // Recursively process subdirectories await processDir(entryPath); } else if (entry.isFile() && entry.name.endsWith('.bal')) { // Convert file path to URI const fileUri = Uri.file(entryPath).toString(); - + // Call didClose for this Ballerina file await langClient.didClose({ textDocument: { uri: fileUri } @@ -76,3 +83,186 @@ export async function closeAllBallerinaFiles(dirPath: string): Promise { // Start the recursive processing await processDir(dirPath); } + +export async function getConfigFilePath(ballerinaExtInstance: BallerinaExtension, rootPath: string): Promise { + if (await isBallerinaProjectAsync(rootPath)) { + return rootPath; + } + + const activeTextEditor = vscode.window.activeTextEditor; + const currentProject = ballerinaExtInstance.getDocumentContext().getCurrentProject(); + let activeFilePath = ""; + let configPath = ""; + + if (rootPath !== "") { + return rootPath; + } + + if (activeTextEditor) { + activeFilePath = activeTextEditor.document.uri.fsPath; + } + + if (currentProject == null && activeFilePath == "") { + return await showNoBallerinaSourceWarningMessage(); + } + + try { + const currentBallerinaProject: BallerinaProject = await getCurrentBallerinaProjectFromContext(ballerinaExtInstance); + + if (!currentBallerinaProject) { + return await showNoBallerinaSourceWarningMessage(); + } + + if (currentBallerinaProject.kind == 'SINGLE_FILE_PROJECT') { + configPath = path.dirname(currentBallerinaProject.path); + } else { + configPath = currentBallerinaProject.path; + } + + if (configPath == undefined || configPath == "") { + return await showNoBallerinaSourceWarningMessage(); + } + return configPath; + } catch (error) { + return await showNoBallerinaSourceWarningMessage(); + } +} + +export async function getTokenForDefaultModel() { + try { + const token = await getRefreshedAccessToken(); + if (!token) { + vscode.window.showWarningMessage(LOGIN_REQUIRED_WARNING); + return null; + } + return token; + } catch (error) { + if ((error as Error).message === REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE) { + vscode.window.showWarningMessage(LOGIN_REQUIRED_WARNING); + } + throw error; + } +} + +export async function getBackendURL(): Promise { + return new Promise(async (resolve) => { + resolve(OLD_BACKEND_URL); + }); +} + +// Function to find a file in a case-insensitive way +function findFileCaseInsensitive(directory: string, fileName: string): string { + const files = fs.readdirSync(directory); + const targetFile = files.find(file => file.toLowerCase() === fileName.toLowerCase()); + const file = targetFile ? targetFile : fileName; + return path.join(directory, file); +} + +function addDefaultModelConfig( + projectPath: string, token: string, backendUrl: string) { + const targetTable = `[ballerina.ai.wso2ProviderConfig]`; + const urlLine = `serviceUrl = "${backendUrl}"`; + const accessTokenLine = `accessToken = "${token}"`; + const configFilePath = findFileCaseInsensitive(projectPath, CONFIG_FILE_NAME); + + let fileContent = ''; + + if (fs.existsSync(configFilePath)) { + fileContent = fs.readFileSync(configFilePath, 'utf-8'); + } + + const tableStartIndex = fileContent.indexOf(targetTable); + + if (tableStartIndex === -1) { + // Table doesn't exist, create it + if (fileContent.length > 0 && !fileContent.endsWith('\n')) { + fileContent += '\n\n'; + } + fileContent += `\n${targetTable}\n${urlLine}\n${accessTokenLine}\n`; + fs.writeFileSync(configFilePath, fileContent); + return; + } + + // Table exists, update it + const tableEndIndex = fileContent.indexOf('\n', tableStartIndex); + + let updatedTableContent = `${targetTable}\n${urlLine}\n${accessTokenLine}`; + + let urlLineIndex = fileContent.indexOf('url =', tableStartIndex); + let accessTokenLineIndex = fileContent.indexOf('accessToken =', tableStartIndex); + + if (urlLineIndex !== -1 && accessTokenLineIndex !== -1) { + // url and accessToken lines exist, replace them + const existingUrlLineEnd = fileContent.indexOf('\n', urlLineIndex); + const existingAccessTokenLineEnd = fileContent.indexOf('\n', accessTokenLineIndex); + + fileContent = + fileContent.substring(0, urlLineIndex) + + urlLine + + fileContent.substring(existingUrlLineEnd, accessTokenLineIndex) + + accessTokenLine + + fileContent.substring(existingAccessTokenLineEnd); + fs.writeFileSync(configFilePath, fileContent); + return; + } + + // If url or accessToken line does not exist, just replace the entire table + let nextTableStartIndex = fileContent.indexOf('[', tableEndIndex + 1); + if (nextTableStartIndex === -1) { + fileContent = fileContent.substring(0, tableStartIndex) + + updatedTableContent + fileContent.substring(tableEndIndex + 1); + } else { + let nextLineBreakIndex = fileContent.substring(tableEndIndex + 1).indexOf('\n'); + if (nextLineBreakIndex === -1) { + fileContent = fileContent.substring(0, tableStartIndex) + updatedTableContent; + } else { + fileContent = fileContent.substring(0, tableStartIndex) + + updatedTableContent + fileContent.substring(tableEndIndex + 1); + } + } + fs.writeFileSync(configFilePath, fileContent); +} + +export async function addConfigFile(configPath: string) { + await vscode.window.withProgress( + { + location: vscode.ProgressLocation.Notification, + title: PROGRESS_BAR_MESSAGE_FROM_WSO2_DEFAULT_MODEL, + cancellable: false, + }, + async () => { + try { + const token: string | null = await getTokenForDefaultModel(); + if (token === null) { + AIStateMachine.service().send(AIMachineEventType.LOGOUT); + return; + } + addDefaultModelConfig(configPath, token, await getBackendURL()); + } catch (error) { + AIStateMachine.service().send(AIMachineEventType.LOGOUT); + return; + } + } + ); +} + +export async function isBallerinaProjectAsync(rootPath: string): Promise { + try { + if (!fs.existsSync(rootPath)) { + return false; + } + + const files = fs.readdirSync(rootPath); + return files.some(file => + file.toLowerCase() === 'ballerina.toml' || + file.toLowerCase().endsWith('.bal') + ); + } catch (error) { + console.error(`Error checking Ballerina project: ${error}`); + return false; + } +} + +async function showNoBallerinaSourceWarningMessage() { + return await vscode.window.showWarningMessage(ERROR_NO_BALLERINA_SOURCES); +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/bi/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/bi/activator.ts index 4f5073260fb..b58a0af51db 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/bi/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/bi/activator.ts @@ -34,7 +34,7 @@ import { BiDiagramRpcManager } from "../../rpc-managers/bi-diagram/rpc-manager"; import { readFileSync, readdirSync, statSync } from "fs"; import path from "path"; import { isPositionEqual, isPositionWithinDeletedComponent } from "../../utils/history/util"; -import { startDebugging } from "../editor-support/codelens-provider"; +import { startDebugging } from "../editor-support/activator"; const FOCUS_DEBUG_CONSOLE_COMMAND = 'workbench.debug.action.focusRepl'; @@ -69,10 +69,13 @@ export function activate(context: BallerinaExtension) { }); commands.registerCommand(BI_COMMANDS.ADD_CONFIGURATION, () => { - // Trigger to open the configuration setup view - openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.ViewConfigVariables }); + openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.AddConfigVariables }); }); + commands.registerCommand(BI_COMMANDS.VIEW_CONFIGURATION, () => { + openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.ViewConfigVariables }); + }); + commands.registerCommand(BI_COMMANDS.SHOW_OVERVIEW, () => { openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.Overview }); }); diff --git a/workspaces/ballerina/ballerina-extension/src/features/config-generator/configGenerator.ts b/workspaces/ballerina/ballerina-extension/src/features/config-generator/configGenerator.ts index 1438f0fa8a5..decb3f62705 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/config-generator/configGenerator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/config-generator/configGenerator.ts @@ -16,18 +16,19 @@ * under the License. */ -import { window, Uri, commands, workspace } from "vscode"; -import { existsSync, openSync, readFileSync, writeFile } from "fs"; -import { BAL_TOML, BAL_CONFIG_FILE, PALETTE_COMMANDS, clearTerminal } from "../project"; -import { BallerinaExtension, ballerinaExtInstance, ExtendedLangClient } from "../../core"; +import { window, Uri, commands } from "vscode"; +import { existsSync, readFileSync, writeFile } from "fs"; +import { BAL_CONFIG_FILE, PALETTE_COMMANDS, clearTerminal } from "../project"; +import { BallerinaExtension, ExtendedLangClient } from "../../core"; +import { extension } from "../../BalExtensionContext"; import { getCurrentBallerinaProject } from "../../utils/project-utils"; -import { parseTomlToConfig, typeOfComment } from "./utils"; +import { typeOfComment } from "./utils"; import { ConfigProperty, ConfigTypes, Constants, Property } from "./model"; import { BallerinaProject, ConfigVariableResponse, EVENT_TYPE, MACHINE_VIEW, PackageConfigSchema, ProjectDiagnosticsResponse, SyntaxTree } from "@wso2/ballerina-core"; import { TextDocumentEdit } from "vscode-languageserver-types"; import { modifyFileContent } from "../../utils/modification"; import { fileURLToPath } from "url"; -import { startDebugging } from "../editor-support/codelens-provider"; +import { startDebugging } from "../editor-support/activator"; import { openView } from "../../stateMachine"; import * as path from "path"; @@ -227,7 +228,7 @@ async function executeRunCommand(ballerinaExtInstance: BallerinaExtension, fileP export async function cleanAndValidateProject(langClient: ExtendedLangClient, path: string): Promise { try { // Get initial project diagnostics - const projectPath = ballerinaExtInstance?.getDocumentContext()?.getCurrentProject()?.path || path; + const projectPath = extension.ballerinaExtInstance?.getDocumentContext()?.getCurrentProject()?.path || path; let response: ProjectDiagnosticsResponse = await langClient.getProjectDiagnostics({ projectRootIdentifier: { uri: Uri.file(projectPath).toString() 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 34a6d0e3e4a..f68b9130a32 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/debugger/config-provider.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/debugger/config-provider.ts @@ -33,7 +33,7 @@ import * as child_process from "child_process"; import { getPortPromise } from 'portfinder'; import * as path from "path"; import { - ballerinaExtInstance, BallerinaExtension, LANGUAGE, OLD_BALLERINA_VERSION_DEBUGGER_RUNINTERMINAL, + BallerinaExtension, LANGUAGE, OLD_BALLERINA_VERSION_DEBUGGER_RUNINTERMINAL, UNSUPPORTED_DEBUGGER_RUNINTERMINAL_KIND, INVALID_DEBUGGER_RUNINTERMINAL_KIND } from '../../core'; import { ExtendedLangClient } from '../../core/extended-language-client'; @@ -61,6 +61,7 @@ import { notifyBreakpointChange } from '../../RPCLayer'; import { VisualizerWebview } from '../../views/visualizer/webview'; import { URI } from 'vscode-uri'; import { prepareAndGenerateConfig, cleanAndValidateProject } from '../config-generator/configGenerator'; +import { extension } from '../../BalExtensionContext'; const BALLERINA_COMMAND = "ballerina.command"; const EXTENDED_CLIENT_CAPABILITIES = "capabilities"; @@ -97,7 +98,7 @@ class DebugConfigProvider implements DebugConfigurationProvider { return Promise.resolve({ request: '', type: '', name: '' }); } - if (config.noDebug && (ballerinaExtInstance.enabledRunFast() || StateMachine.context().isBI)) { + if (config.noDebug && (extension.ballerinaExtInstance.enabledRunFast() || StateMachine.context().isBI)) { await handleMainFunctionParams(config); } return getModifiedConfigs(_folder, config); @@ -109,7 +110,7 @@ function getValueFromProgramArgs(programArgs: string[], idx: number) { } async function handleMainFunctionParams(config: DebugConfiguration) { - const res = await ballerinaExtInstance.langClient?.getMainFunctionParams({ + const res = await extension.ballerinaExtInstance.langClient?.getMainFunctionParams({ projectRootIdentifier: { uri: "file://" + StateMachine.context().projectUri } @@ -235,9 +236,9 @@ async function getModifiedConfigs(workspaceFolder: WorkspaceFolder, config: Debu const debuggeePort = config.debuggeePort ?? await findFreePort(); config.debuggeePort = debuggeePort.toString(); - const ballerinaHome = ballerinaExtInstance.getBallerinaHome(); + const ballerinaHome = extension.ballerinaExtInstance.getBallerinaHome(); config['ballerina.home'] = ballerinaHome; - config[BALLERINA_COMMAND] = ballerinaExtInstance.getBallerinaCmd(); + config[BALLERINA_COMMAND] = extension.ballerinaExtInstance.getBallerinaCmd(); config[EXTENDED_CLIENT_CAPABILITIES] = { supportsReadOnlyEditors: true, supportsFastRun: isFastRunEnabled() }; if (!config.type) { @@ -253,7 +254,7 @@ async function getModifiedConfigs(workspaceFolder: WorkspaceFolder, config: Debu const activeTextEditor = window.activeTextEditor; if (activeTextEditor && activeTextEditor.document.fileName.endsWith(BAL_NOTEBOOK)) { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_START_NOTEBOOK_DEBUG, CMP_NOTEBOOK); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_START_NOTEBOOK_DEBUG, CMP_NOTEBOOK); let activeTextEditorUri = activeTextEditor.document.uri; if (activeTextEditorUri.scheme === NOTEBOOK_CELL_SCHEME) { activeTextEditorUri = Uri.file(getTempFile()); @@ -297,11 +298,11 @@ async function getModifiedConfigs(workspaceFolder: WorkspaceFolder, config: Debu } } } else { - ballerinaExtInstance.showMessageInvalidProject(); + extension.ballerinaExtInstance.showMessageInvalidProject(); return Promise.reject(); } - let langClient = ballerinaExtInstance.langClient; + let langClient = extension.ballerinaExtInstance.langClient; if (langClient.initializeResult) { const { experimental } = langClient.initializeResult!.capabilities; if (experimental && experimental.introspection && experimental.introspection.port > 0) { @@ -319,7 +320,7 @@ async function getModifiedConfigs(workspaceFolder: WorkspaceFolder, config: Debu } if (config.terminal) { - var balVersion: decimal = parseFloat(ballerinaExtInstance.ballerinaVersion); + var balVersion: decimal = parseFloat(extension.ballerinaExtInstance.ballerinaVersion); if (balVersion < 2201.3) { window.showWarningMessage(OLD_BALLERINA_VERSION_DEBUGGER_RUNINTERMINAL); } else if (config.terminal.toLowerCase() === "external") { @@ -350,7 +351,7 @@ export async function constructDebugConfig(uri: Uri, testDebug: boolean, args?: const debugConfigs: DebugConfiguration[] = launchConfig.configurations; if (debugConfigs.length == 0) { - const initialConfigurations: DebugConfiguration[] = ballerinaExtInstance.extension.packageJSON.contributes.debuggers[0].initialConfigurations; + const initialConfigurations: DebugConfiguration[] = extension.ballerinaExtInstance.extension.packageJSON.contributes.debuggers[0].initialConfigurations; debugConfigs.push(...initialConfigurations); launchConfig.update('configurations', debugConfigs, ConfigurationTarget.WorkspaceFolder, true); @@ -377,7 +378,7 @@ export async function constructDebugConfig(uri: Uri, testDebug: boolean, args?: } export function activateDebugConfigProvider(ballerinaExtInstance: BallerinaExtension) { - let context = ballerinaExtInstance.context; + let context = extension.ballerinaExtInstance.context; context.subscriptions.push(debug.registerDebugConfigurationProvider('ballerina', new DebugConfigProvider())); @@ -492,7 +493,7 @@ class BallerinaDebugAdapterTrackerFactory implements DebugAdapterTrackerFactory const workspaceRoot = workspace.workspaceFolders && workspace.workspaceFolders[0].uri.fsPath; if (workspaceRoot) { // Get the component list - const components: BallerinaProjectComponents = await ballerinaExtInstance?.langClient?.getBallerinaProjectComponents({ + const components: BallerinaProjectComponents = await extension.ballerinaExtInstance?.langClient?.getBallerinaProjectComponents({ documentIdentifiers: [{ uri: URI.file(workspaceRoot).toString() }] }); @@ -566,14 +567,14 @@ class BallerinaDebugAdapterDescriptorFactory implements DebugAdapterDescriptorFa async createDebugAdapterDescriptor(session: DebugSession, executable: DebugAdapterExecutable | undefined): Promise { // Check if the project contains errors(and fix the possible ones) before starting the debug session - const langClient = ballerinaExtInstance.langClient; + const langClient = extension.ballerinaExtInstance.langClient; const projectRoot = await getCurrentRoot(); await cleanAndValidateProject(langClient, projectRoot); // Check if config generation is required before starting the debug session - await prepareAndGenerateConfig(ballerinaExtInstance, session.configuration.script, false, StateMachine.context().isBI, false); + await prepareAndGenerateConfig(extension.ballerinaExtInstance, session.configuration.script, false, StateMachine.context().isBI, false); - if (session.configuration.noDebug && ballerinaExtInstance.enabledRunFast()) { + if (session.configuration.noDebug && extension.ballerinaExtInstance.enabledRunFast()) { return new Promise((resolve) => { resolve(new DebugAdapterInlineImplementation(new FastRunDebugAdapter())); }); @@ -596,7 +597,7 @@ class BallerinaDebugAdapterDescriptorFactory implements DebugAdapterDescriptorFa opt.env = Object.assign({}, process.env, configEnv); try { - log(`Starting debug adapter: '${this.ballerinaExtInstance.getBallerinaCmd()} start-debugger-adapter ${port.toString()}`); + log(`Starting debug adapter: '${extension.ballerinaExtInstance.getBallerinaCmd()} start-debugger-adapter ${port.toString()}`); const serverProcess = child_process.spawn(cmd, args, opt); await new Promise((resolve) => { @@ -611,17 +612,17 @@ class BallerinaDebugAdapterDescriptorFactory implements DebugAdapterDescriptorFa debugLog(`${data}`); }); }); - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_START_DEBUG_SESSION, CMP_DEBUGGER); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_START_DEBUG_SESSION, CMP_DEBUGGER); this.registerLogTraceNotificationHandler(session); return new DebugAdapterServer(port); } catch (error) { - sendTelemetryException(ballerinaExtInstance, error as Error, CMP_DEBUGGER); + sendTelemetryException(extension.ballerinaExtInstance, error as Error, CMP_DEBUGGER); return await Promise.reject(error); } } private registerLogTraceNotificationHandler(session: DebugSession) { - const langClient = ballerinaExtInstance.langClient; + const langClient = extension.ballerinaExtInstance.langClient; const notificationHandler = langClient.onNotification('$/logTrace', (params: any) => { if (params.verbose === "stopped") { // do nothing @@ -636,10 +637,10 @@ class BallerinaDebugAdapterDescriptorFactory implements DebugAdapterDescriptorFa } getScriptPath(args: string[]): string { args.push('start-debugger-adapter'); - return this.ballerinaExtInstance.getBallerinaCmd(); + return extension.ballerinaExtInstance.getBallerinaCmd(); } getCurrentWorkingDir(): string { - return path.join(this.ballerinaExtInstance.ballerinaHome, "bin"); + return path.join(extension.ballerinaExtInstance.ballerinaHome, "bin"); } } @@ -650,7 +651,7 @@ class FastRunDebugAdapter extends LoggingDebugSession { programArgs: string[] = []; protected launchRequest(response: DebugProtocol.LaunchResponse, args: DebugProtocol.LaunchRequestArguments, request?: DebugProtocol.Request): void { - const langClient = ballerinaExtInstance.langClient; + const langClient = extension.ballerinaExtInstance.langClient; const notificationHandler = langClient.onNotification('$/logTrace', (params: any) => { if (params.verbose === "stopped") { // even if a single channel (stderr,stdout) stopped, we stop the debug session notificationHandler!.dispose(); @@ -694,23 +695,14 @@ class BIRunAdapter extends LoggingDebugSession { task: 'run' }; - const ballerinaHome = ballerinaExtInstance.getConfiguredBallerinaHome(); - const pluginDevModeEnabled = ballerinaExtInstance.overrideBallerinaHome(); - - let runCommand: string; - if (pluginDevModeEnabled && ballerinaHome) { - runCommand = path.join(ballerinaHome, 'bin', ballerinaExtInstance.getBallerinaCmd()); - } else { - runCommand = ballerinaExtInstance.getBallerinaCmd(); - } - runCommand += ' run'; + let runCommand: string = `${extension.ballerinaExtInstance.getBallerinaCmd()} run`; const programArgs = (args as any).programArgs; if (programArgs && programArgs.length > 0) { runCommand = `${runCommand} -- ${programArgs.join(' ')}`; } - if (isSupportedSLVersion(ballerinaExtInstance, 2201130) && ballerinaExtInstance.enabledExperimentalFeatures()) { + if (isSupportedSLVersion(extension.ballerinaExtInstance, 2201130) && extension.ballerinaExtInstance.enabledExperimentalFeatures()) { runCommand = `${runCommand} --experimental`; } @@ -776,7 +768,7 @@ async function runFast(root: string, options: { debugPort?: number; env?: Map { - return await ballerinaExtInstance.langClient.executeCommand({ + return await extension.ballerinaExtInstance.langClient.executeCommand({ command: "STOP", arguments: [ { key: "path", value: root! }] }); diff --git a/workspaces/ballerina/ballerina-extension/src/features/editor-support/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/editor-support/activator.ts index 96e0fbb34dc..c9d997b64b1 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/editor-support/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/editor-support/activator.ts @@ -17,17 +17,20 @@ */ import { isSupportedVersion, VERSION } from "../../utils"; -import { languages, workspace } from "vscode"; -import { BallerinaExtension, LANGUAGE } from "../../core"; -import { ExecutorCodeLensProvider } from "./codelens-provider"; +import { commands, debug, DebugConfiguration, Uri, window, workspace, WorkspaceFolder } from "vscode"; +import { BallerinaExtension } from "../../core"; import { ReadOnlyContentProvider } from "./readonly-content-provider"; -import { StringSplitFeature, StringSplitter } from "./split-provider"; import * as gitStatus from "./git-status"; +import { INTERNAL_DEBUG_COMMAND, clearTerminal, FOCUS_DEBUG_CONSOLE_COMMAND, SOURCE_DEBUG_COMMAND, TEST_DEBUG_COMMAND } from "../project"; +import { sendTelemetryEvent, TM_EVENT_SOURCE_DEBUG_CODELENS, CMP_EXECUTOR_CODELENS, TM_EVENT_TEST_DEBUG_CODELENS } from "../telemetry"; +import { constructDebugConfig } from "../debugger"; +import { StringSplitFeature, StringSplitter } from "./split-provider"; export function activate(ballerinaExtInstance: BallerinaExtension) { if (!ballerinaExtInstance.context || !ballerinaExtInstance.langClient) { return; } + if (isSupportedVersion(ballerinaExtInstance, VERSION.ALPHA, 5)) { ballerinaExtInstance.context!.subscriptions.push(new StringSplitFeature(new StringSplitter(), ballerinaExtInstance)); @@ -43,7 +46,37 @@ export function activate(ballerinaExtInstance: BallerinaExtension) { return; } if (ballerinaExtInstance.isAllCodeLensEnabled() && isSupportedVersion(ballerinaExtInstance, VERSION.BETA, 1)) { - languages.registerCodeLensProvider([{ language: LANGUAGE.BALLERINA, scheme: 'file' }], - new ExecutorCodeLensProvider(ballerinaExtInstance)); + // TODO: Remove this once LS changes are merged + // languages.registerCodeLensProvider([{ language: LANGUAGE.BALLERINA, scheme: 'file' }], + // new ExecutorCodeLensProvider(ballerinaExtInstance)); + + commands.registerCommand(INTERNAL_DEBUG_COMMAND, async () => { + sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_SOURCE_DEBUG_CODELENS, CMP_EXECUTOR_CODELENS); + clearTerminal(); + commands.executeCommand(FOCUS_DEBUG_CONSOLE_COMMAND); + startDebugging(window.activeTextEditor!.document.uri, false); + }); + + commands.registerCommand(SOURCE_DEBUG_COMMAND, async () => { + commands.executeCommand(INTERNAL_DEBUG_COMMAND); + return; + }); + + commands.registerCommand(TEST_DEBUG_COMMAND, async () => { + sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_TEST_DEBUG_CODELENS, CMP_EXECUTOR_CODELENS); + clearTerminal(); + commands.executeCommand(FOCUS_DEBUG_CONSOLE_COMMAND); + startDebugging(window.activeTextEditor!.document.uri, true); + }); } } + + +export async function startDebugging(uri: Uri, testDebug: boolean = false, suggestTryit: boolean = false, noDebugMode: boolean = false): Promise { + const workspaceFolder: WorkspaceFolder | undefined = workspace.getWorkspaceFolder(uri); + const debugConfig: DebugConfiguration = await constructDebugConfig(uri, testDebug); + debugConfig.suggestTryit = suggestTryit; + debugConfig.noDebug = noDebugMode; + + return debug.startDebugging(workspaceFolder, debugConfig); +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/editor-support/codelens-provider.ts b/workspaces/ballerina/ballerina-extension/src/features/editor-support/codelens-provider.ts deleted file mode 100644 index 3e22b7680aa..00000000000 --- a/workspaces/ballerina/ballerina-extension/src/features/editor-support/codelens-provider.ts +++ /dev/null @@ -1,183 +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 { BallerinaExtension, ExtendedLangClient, LANGUAGE } from '../../core'; -import { - CancellationToken, CodeLens, CodeLensProvider, commands, debug, DebugConfiguration, Event, EventEmitter, - ExtensionContext, - ProviderResult, Range, TextDocument, Uri, window, workspace, WorkspaceFolder -} from 'vscode'; -import { BAL_TOML, clearTerminal, PALETTE_COMMANDS } from '../project'; -import { - CMP_EXECUTOR_CODELENS, sendTelemetryEvent, TM_EVENT_SOURCE_DEBUG_CODELENS, TM_EVENT_TEST_DEBUG_CODELENS -} from '../telemetry'; -import { constructDebugConfig } from '../debugger'; -import { ExecutorPosition, ExecutorPositionsResponse, SyntaxTree } from '@wso2/ballerina-core'; -import { traversNode } from '@wso2/syntax-tree'; -import { CodeLensProviderVisitor } from './codelense-provider-visitor'; - -export enum EXEC_POSITION_TYPE { - SOURCE = 'source', - TEST = 'test' -} - -enum EXEC_TYPE { - RUN = 'Run', - DEBUG = 'Debug' -} - -enum EXEC_ARG { - TESTS = '--tests' -} - -export const INTERNAL_DEBUG_COMMAND = "ballerina.internal.debug"; - -const SOURCE_DEBUG_COMMAND = "ballerina.source.debug"; -const TEST_DEBUG_COMMAND = "ballerina.test.debug"; -const FOCUS_DEBUG_CONSOLE_COMMAND = 'workbench.debug.action.focusRepl'; - -export class ExecutorCodeLensProvider implements CodeLensProvider { - - private _onDidChangeCodeLenses: EventEmitter = new EventEmitter(); - public readonly onDidChangeCodeLenses: Event = this._onDidChangeCodeLenses.event; - private activeTextEditorUri: Uri | undefined; - - private ballerinaExtension: BallerinaExtension; - - constructor(extensionInstance: BallerinaExtension) { - this.ballerinaExtension = extensionInstance; - - workspace.onDidOpenTextDocument((document) => { - if (document.languageId === LANGUAGE.BALLERINA || document.fileName.endsWith(BAL_TOML)) { - this._onDidChangeCodeLenses.fire(); - } - }); - - workspace.onDidChangeTextDocument((activatedTextEditor) => { - if (activatedTextEditor && activatedTextEditor.document.languageId === LANGUAGE.BALLERINA || - activatedTextEditor.document.fileName.endsWith(BAL_TOML)) { - this._onDidChangeCodeLenses.fire(); - } - }); - - commands.registerCommand(INTERNAL_DEBUG_COMMAND, async () => { - sendTelemetryEvent(this.ballerinaExtension, TM_EVENT_SOURCE_DEBUG_CODELENS, CMP_EXECUTOR_CODELENS); - clearTerminal(); - commands.executeCommand(FOCUS_DEBUG_CONSOLE_COMMAND); - startDebugging(this.activeTextEditorUri!, false); - }); - - commands.registerCommand(SOURCE_DEBUG_COMMAND, async () => { - this.activeTextEditorUri = window.activeTextEditor!.document.uri; - commands.executeCommand(INTERNAL_DEBUG_COMMAND); - return; - }); - - commands.registerCommand(TEST_DEBUG_COMMAND, async () => { - sendTelemetryEvent(this.ballerinaExtension, TM_EVENT_TEST_DEBUG_CODELENS, CMP_EXECUTOR_CODELENS); - clearTerminal(); - commands.executeCommand(FOCUS_DEBUG_CONSOLE_COMMAND); - startDebugging(window.activeTextEditor!.document.uri, true); - }); - } - - provideCodeLenses(_document: TextDocument, _token: CancellationToken): ProviderResult { - if (this.ballerinaExtension.langClient && window.activeTextEditor) { - return this.getCodeLensList(); - } - return []; - } - - private async getCodeLensList(): Promise { - let codeLenses: CodeLens[] = []; - let langClient: ExtendedLangClient | undefined = this.ballerinaExtension.langClient; - - if (!langClient) { - return codeLenses; - } - - const activeEditorUri = window.activeTextEditor!.document.uri; - const fileUri = activeEditorUri.toString(); - - try { - const response = await langClient!.getExecutorPositions({ - documentIdentifier: { - uri: fileUri - } - }) as ExecutorPositionsResponse; - if (response.executorPositions) { - response.executorPositions.forEach(position => { - if (position.kind === EXEC_POSITION_TYPE.SOURCE) { - codeLenses.push(this.createCodeLens(position, EXEC_TYPE.RUN)); - codeLenses.push(this.createCodeLens(position, EXEC_TYPE.DEBUG)); - } - }); - } - } catch (error) { - } - - // Open in diagram code lenses - try { - const syntaxTreeResponse = await langClient!.getSyntaxTree({ - documentIdentifier: { - uri: fileUri - } - }); - const response = syntaxTreeResponse as SyntaxTree; - if (response.parseSuccess && response.syntaxTree) { - const syntaxTree = response.syntaxTree; - - const visitor = new CodeLensProviderVisitor(activeEditorUri); - traversNode(syntaxTree, visitor, undefined); - codeLenses.push(...visitor.getCodeLenses()); - } - } catch (error) { - } - - return codeLenses; - } - - private createCodeLens(execPosition: ExecutorPosition, execType: EXEC_TYPE): CodeLens { - const startLine = execPosition.range.startLine.line; - const startColumn = execPosition.range.startLine.offset; - const endLine = execPosition.range.endLine.line; - const endColumn = execPosition.range.endLine.offset; - const codeLens = new CodeLens(new Range(startLine, startColumn, endLine, endColumn)); - const textDocument = window.activeTextEditor!.document; - this.activeTextEditorUri = textDocument.uri; - codeLens.command = { - title: execType.toString(), - tooltip: `${execType.toString()} ${execPosition.name}`, - command: execPosition.kind === EXEC_POSITION_TYPE.SOURCE ? (execType === EXEC_TYPE.RUN ? - PALETTE_COMMANDS.RUN : SOURCE_DEBUG_COMMAND) : (execType === EXEC_TYPE.RUN ? PALETTE_COMMANDS.TEST : - TEST_DEBUG_COMMAND), - arguments: execPosition.kind === EXEC_POSITION_TYPE.SOURCE ? [textDocument.uri] : (execType === EXEC_TYPE.RUN ? - [EXEC_ARG.TESTS, execPosition.name] : [execPosition.name]) - }; - return codeLens; - } -} - -export async function startDebugging(uri: Uri, testDebug: boolean = false, suggestTryit: boolean = false, noDebugMode: boolean = false): Promise { - const workspaceFolder: WorkspaceFolder | undefined = workspace.getWorkspaceFolder(uri); - const debugConfig: DebugConfiguration = await constructDebugConfig(uri, testDebug); - debugConfig.suggestTryit = suggestTryit; - debugConfig.noDebug = noDebugMode; - - return debug.startDebugging(workspaceFolder, debugConfig); -} diff --git a/workspaces/ballerina/ballerina-extension/src/features/editor-support/codelense-provider-visitor.ts b/workspaces/ballerina/ballerina-extension/src/features/editor-support/codelense-provider-visitor.ts deleted file mode 100644 index 2df98e9b58b..00000000000 --- a/workspaces/ballerina/ballerina-extension/src/features/editor-support/codelense-provider-visitor.ts +++ /dev/null @@ -1,148 +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 { - STNode, - Visitor, - FunctionDefinition, - ServiceDeclaration, - ObjectMethodDefinition, - ResourceAccessorDefinition, - STKindChecker, - TypeDefinition -} from "@wso2/syntax-tree"; -import { PALETTE_COMMANDS } from "../project"; -import { CodeLens, Range, Uri } from "vscode"; -import { checkIsPersistModelFile } from "../../views/persist-layer-diagram/activator"; -import { SHARED_COMMANDS } from "@wso2/ballerina-core"; - -export class CodeLensProviderVisitor implements Visitor { - activeEditorUri: Uri; - codeLenses: CodeLens[] = []; - supportedServiceTypes: string[] = ["http", "ai", "graphql"]; - - constructor(activeEditorUri: Uri) { - this.activeEditorUri = activeEditorUri; - } - - public beginVisitFunctionDefinition(node: FunctionDefinition, parent?: STNode): void { - this.createVisulizeCodeLens(node.functionName.position, node.position); - } - - public beginVisitServiceDeclaration(node: ServiceDeclaration, parent?: STNode): void { - if (node.expressions.length > 0) { - const expr = node.expressions[0]; - if ((STKindChecker.isExplicitNewExpression(expr) && - expr.typeDescriptor && - STKindChecker.isQualifiedNameReference(expr.typeDescriptor) && - this.supportedServiceTypes.includes(expr.typeDescriptor.modulePrefix.value)) || - (STKindChecker.isSimpleNameReference(expr) && - this.supportedServiceTypes.includes(expr.typeData.typeSymbol.moduleID.moduleName))) { - this.createTryItCodeLens(node.position, node.serviceKeyword.position, node.absoluteResourcePath.map((path) => path.value).join(''), node.expressions.map((exp) => exp.source.trim()).join(',')); - if (expr?.typeData?.typeSymbol?.signature?.includes("graphql")) { - this.createVisulizeGraphqlCodeLens(node.serviceKeyword.position, node.position); - } else { - this.createVisulizeCodeLens(node.serviceKeyword.position, node.position); - } - } - } - } - - public beginVisitTypeDefinition(node: TypeDefinition, parent?: STNode): void { - if (STKindChecker.isRecordTypeDesc(node.typeDescriptor) && checkIsPersistModelFile(this.activeEditorUri)) { - this.createVisualizeERCodeLens(node.position, node.typeName.value); - } - } - - public beginVisitObjectMethodDefinition(node: ObjectMethodDefinition, parent?: STNode): void { - this.createVisulizeCodeLens(node.functionKeyword.position, node.position); - } - - public beginVisitResourceAccessorDefinition(node: ResourceAccessorDefinition, parent?: STNode): void { - this.createVisulizeCodeLens(node.qualifierList[0].position, node.position); - } - - private createVisulizeCodeLens(range: any, position: any) { - const codeLens = new CodeLens(new Range( - range.startLine, - range.startColumn, - range.endLine, - range.endColumn - )); - codeLens.command = { - title: "Visualize", - tooltip: "Visualize code block", - command: SHARED_COMMANDS.SHOW_VISUALIZER, - arguments: [this.activeEditorUri.fsPath, position] - }; - this.codeLenses.push(codeLens); - } - - private createVisulizeGraphqlCodeLens(range: any, position: any) { - const codeLens = new CodeLens(new Range( - range.startLine, - range.startColumn, - range.endLine, - range.endColumn - )); - codeLens.command = { - title: "Visualize", - tooltip: "Visualize code block", - command: SHARED_COMMANDS.SHOW_VISUALIZER, - arguments: [this.activeEditorUri.fsPath, position] - }; - this.codeLenses.push(codeLens); - } - - private createVisualizeERCodeLens(range: any, recordName: string) { - const codeLens = new CodeLens(new Range( - range.startLine, - range.startColumn, - range.endLine, - range.endColumn - )); - codeLens.command = { - title: "Visualize", - tooltip: "View this entity in the Entity Relationship diagram", - command: PALETTE_COMMANDS.SHOW_ENTITY_DIAGRAM, - arguments: [this.activeEditorUri.fsPath, recordName] - }; - this.codeLenses.push(codeLens); - } - - private createTryItCodeLens(range: any, position: any, basePath: string, listener: string) { - const codeLens = new CodeLens(new Range( - position.startLine, - position.startColumn, - position.endLine, - position.endColumn - )); - - codeLens.command = { - title: "Try it", - tooltip: "Try running this service", - command: PALETTE_COMMANDS.TRY_IT, - arguments: [false, undefined, { basePath, listener }, this.activeEditorUri.fsPath] - }; - this.codeLenses.push(codeLens); - } - - public getCodeLenses(): CodeLens[] { - return this.codeLenses; - } -} diff --git a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/constants.ts b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/constants.ts index 194021104ef..da00b99fc89 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/constants.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/constants.ts @@ -47,3 +47,4 @@ export const MONITERED_EXTENSIONS = [ export const CONFIG_FILE_NAME = "Config.toml"; export const DEFAULT_MODULE = "DEFAULT_MODULE"; export const ERROR_NO_BALLERINA_SOURCES = "No Ballerina sources"; +export const LOGIN_REQUIRED_WARNING = "Please sign in to BI Copilot to use this feature."; 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 f38c91b7268..d4762159653 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts @@ -34,25 +34,26 @@ import { DEFAULT_MODULE, MISSING_README_FILE_WARNING, README_DOCUMENTATION_IS_MISSING, MISSING_REQUIREMENT_FILE, MISSING_API_DOCS, API_DOCUMENTATION_IS_MISSING, PROGRESS_BAR_MESSAGE_FOR_NP_TOKEN, - ERROR_NO_BALLERINA_SOURCES + ERROR_NO_BALLERINA_SOURCES, + LOGIN_REQUIRED_WARNING } from "./constants"; import { isError, isNumber } from 'lodash'; import { HttpStatusCode } from 'axios'; -import { BACKEND_URL } from '../ai/utils'; +import { OLD_BACKEND_URL } from '../ai/utils'; import { AIMachineEventType, BallerinaProject } from '@wso2/ballerina-core'; import { getCurrentBallerinaProjectFromContext } from '../config-generator/configGenerator'; import { BallerinaExtension } from 'src/core'; -import { getRefreshedAccessToken } from '../../../src/utils/ai/auth'; +import { getRefreshedAccessToken, REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE } from '../../../src/utils/ai/auth'; import { AIStateMachine } from '../../../src/views/ai-panel/aiMachine'; import { fetchWithAuth } from '../ai/service/connection'; let controller = new AbortController(); export async function getLLMDiagnostics(projectUri: string, diagnosticCollection - : vscode.DiagnosticCollection): Promise { + : vscode.DiagnosticCollection): Promise { const ballerinaProjectSource: BallerinaSource = await getBallerinaProjectSourceFiles(projectUri); - const sourcesOfNonDefaultModulesWithReadme: BallerinaSource[] - = getSourcesOfNonDefaultModulesWithReadme(path.join(projectUri, "modules")); + const sourcesOfNonDefaultModulesWithReadme: BallerinaSource[] + = getSourcesOfNonDefaultModulesWithReadme(path.join(projectUri, "modules")); const sources: BallerinaSource[] = [ballerinaProjectSource, ...sourcesOfNonDefaultModulesWithReadme]; const backendurl = await getBackendURL(); @@ -72,9 +73,9 @@ export async function getLLMDiagnostics(projectUri: string, diagnosticCollection } async function getLLMResponses(sources: BallerinaSource[], token: string, backendurl: string) - : Promise { + : Promise { let promises: Promise[] = []; - const nonDefaultModulesWithReadmeFiles: string[] + const nonDefaultModulesWithReadmeFiles: string[] = sources.map(source => source.moduleName).filter(name => name != DEFAULT_MODULE); const commentResponsePromise = fetchWithAuth( @@ -116,8 +117,8 @@ async function getLLMResponses(sources: BallerinaSource[], token: string, backen let responses: (Response | Error)[] = await Promise.all(promises); const firstResponse = responses[0]; - const filteredResponses: Response[] - = responses.filter(response => !isError(response) && response.ok) as Response[]; + const filteredResponses: Response[] + = responses.filter(response => !isError(response) && response.ok) as Response[]; if (filteredResponses.length === 0) { if (isError(firstResponse)) { @@ -138,8 +139,8 @@ async function getLLMResponses(sources: BallerinaSource[], token: string, backen return extractedResponses; } -async function createDiagnosticCollection(responses: any[], projectUri: string, - diagnosticCollection: vscode.DiagnosticCollection) { +async function createDiagnosticCollection(responses: any[], projectUri: string, + diagnosticCollection: vscode.DiagnosticCollection) { let diagnosticsMap = new Map(); for (const response of responses) { @@ -258,8 +259,8 @@ async function createDiagnostic(result: ResultItem, uri: Uri): Promise { const ballerinaProjectSource: BallerinaSource = await getBallerinaProjectSourceFiles(projectUri); - const sourcesOfNonDefaultModulesWithReadme: BallerinaSource[] - = getSourcesOfNonDefaultModulesWithReadme(path.join(projectUri, "modules")); + const sourcesOfNonDefaultModulesWithReadme: BallerinaSource[] + = getSourcesOfNonDefaultModulesWithReadme(path.join(projectUri, "modules")); const sources: BallerinaSource[] = [ballerinaProjectSource, ...sourcesOfNonDefaultModulesWithReadme]; const backendurl = await getBackendURL(); @@ -498,7 +499,7 @@ export function getPluginConfig(): BallerinaPluginConfig { export async function getBackendURL(): Promise { return new Promise(async (resolve) => { - resolve(BACKEND_URL); + resolve(OLD_BACKEND_URL); }); } @@ -539,7 +540,7 @@ function findFileCaseInsensitive(directory, fileName) { } export function addDefaultModelConfigForNaturalFunctions( - projectPath: string, token: string, backendUrl: string, isNaturalFunctionsAvailableInBallerinaOrg: boolean) { + projectPath: string, token: string, backendUrl: string, isNaturalFunctionsAvailableInBallerinaOrg: boolean) { const moduleOrg = isNaturalFunctionsAvailableInBallerinaOrg ? "ballerina" : "ballerinax"; const targetTable = `[${moduleOrg}.np.defaultModelConfig]`; const urlLine = `url = "${backendUrl}"`; @@ -604,10 +605,18 @@ export function addDefaultModelConfigForNaturalFunctions( fs.writeFileSync(configFilePath, fileContent); } -export function getTokenForNaturalFunction() { +export async function getTokenForNaturalFunction() { try { - return getRefreshedAccessToken(); + const token = await getRefreshedAccessToken(); + if (!token) { + vscode.window.showWarningMessage(LOGIN_REQUIRED_WARNING); + return null; + } + return token; } catch (error) { + if ((error as Error).message === REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE) { + vscode.window.showWarningMessage(LOGIN_REQUIRED_WARNING); + } throw error; } } @@ -660,7 +669,7 @@ export async function getConfigFilePath(ballerinaExtInstance: BallerinaExtension if (!currentBallerinaProject) { return await showNoBallerinaSourceWarningMessage(); } - + if (currentBallerinaProject.kind == 'SINGLE_FILE_PROJECT') { configPath = path.dirname(currentBallerinaProject.path); } else { @@ -711,8 +720,8 @@ async function isBallerinaProjectAsync(rootPath: string): Promise { } const files = fs.readdirSync(rootPath); - return files.some(file => - file.toLowerCase() === 'ballerina.toml' || + return files.some(file => + file.toLowerCase() === 'ballerina.toml' || file.toLowerCase().endsWith('.bal') ); } catch (error) { diff --git a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/add.ts b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/add.ts index 848df90dd81..968f564e229 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/add.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/add.ts @@ -16,7 +16,8 @@ * under the License. */ -import { ballerinaExtInstance, LANGUAGE } from "../../../core"; +import { LANGUAGE } from "../../../core"; +import { extension } from "../../../BalExtensionContext"; import { commands, window } from "vscode"; import { TM_EVENT_PROJECT_ADD, TM_EVENT_ERROR_EXECUTE_PROJECT_ADD, CMP_PROJECT_ADD, sendTelemetryEvent, sendTelemetryException, getMessageObject @@ -28,18 +29,18 @@ function activateAddCommand() { // register ballerina add handler commands.registerCommand(PALETTE_COMMANDS.ADD, async () => { try { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_PROJECT_ADD, CMP_PROJECT_ADD); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_PROJECT_ADD, CMP_PROJECT_ADD); if (window.activeTextEditor && window.activeTextEditor.document.languageId != LANGUAGE.BALLERINA) { window.showErrorMessage(MESSAGES.NOT_IN_PROJECT); return; } - const currentProject = ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await - getCurrentBallerinaProject(ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) + const currentProject = extension.ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await + getCurrentBallerinaProject(extension.ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) : await getCurrentBallerinaProject(); if (currentProject.kind === PROJECT_TYPE.SINGLE_FILE || !currentProject.path) { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_ERROR_EXECUTE_PROJECT_ADD, CMP_PROJECT_ADD, + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_ERROR_EXECUTE_PROJECT_ADD, CMP_PROJECT_ADD, getMessageObject(MESSAGES.NOT_IN_PROJECT)); window.showErrorMessage(MESSAGES.NOT_IN_PROJECT); return; @@ -47,13 +48,13 @@ function activateAddCommand() { const moduleName = await window.showInputBox({ placeHolder: MESSAGES.MODULE_NAME }); if (moduleName && moduleName.trim().length > 0) { - runCommand(currentProject, ballerinaExtInstance.getBallerinaCmd(), BALLERINA_COMMANDS.ADD, + runCommand(currentProject, extension.ballerinaExtInstance.getBallerinaCmd(), BALLERINA_COMMANDS.ADD, moduleName); } } catch (error) { if (error instanceof Error) { - sendTelemetryException(ballerinaExtInstance, error, CMP_PROJECT_ADD); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_PROJECT_ADD); window.showErrorMessage(error.message); } else { window.showErrorMessage("Unkown error occurred."); diff --git a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/build.ts b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/build.ts index e282a6b7af2..50eb77e5998 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/build.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/build.ts @@ -16,7 +16,8 @@ * under the License. */ -import { ballerinaExtInstance, LANGUAGE } from "../../../core"; +import { LANGUAGE } from "../../../core"; +import { extension } from "../../../BalExtensionContext"; import { commands, window } from "vscode"; import { TM_EVENT_PROJECT_BUILD, CMP_PROJECT_BUILD, sendTelemetryEvent, sendTelemetryException @@ -31,34 +32,34 @@ export function activateBuildCommand() { // register run project build handler commands.registerCommand(PALETTE_COMMANDS.BUILD, async () => { try { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_PROJECT_BUILD, CMP_PROJECT_BUILD); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_PROJECT_BUILD, CMP_PROJECT_BUILD); if (window.activeTextEditor && window.activeTextEditor.document.languageId != LANGUAGE.BALLERINA) { window.showErrorMessage(MESSAGES.NOT_IN_PROJECT); return; } - const currentProject = ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await - getCurrentBallerinaProject(ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) + const currentProject = extension.ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await + getCurrentBallerinaProject(extension.ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) : await getCurrentBallerinaProject(); let balCommand = BALLERINA_COMMANDS.BUILD; - if (isSupportedSLVersion(ballerinaExtInstance, 2201130) && ballerinaExtInstance.enabledExperimentalFeatures()) { + if (isSupportedSLVersion(extension.ballerinaExtInstance, 2201130) && extension.ballerinaExtInstance.enabledExperimentalFeatures()) { balCommand = BALLERINA_COMMANDS.BUILD_WITH_EXPERIMENTAL; } if (currentProject.kind !== PROJECT_TYPE.SINGLE_FILE) { - runCommand(currentProject, ballerinaExtInstance.getBallerinaCmd(), balCommand, + runCommand(currentProject, extension.ballerinaExtInstance.getBallerinaCmd(), balCommand, currentProject.path!); } else { - runCommand(getCurrenDirectoryPath(), ballerinaExtInstance.getBallerinaCmd(), + runCommand(getCurrenDirectoryPath(), extension.ballerinaExtInstance.getBallerinaCmd(), balCommand, getCurrentBallerinaFile()); } } catch (error) { if (error instanceof Error) { - sendTelemetryException(ballerinaExtInstance, error, CMP_PROJECT_BUILD); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_PROJECT_BUILD); window.showErrorMessage(error.message); } else { window.showErrorMessage("Unkown error occurred."); 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 4280e2e0392..29fc636363e 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/cloud.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/cloud.ts @@ -16,7 +16,8 @@ * under the License. */ -import { ballerinaExtInstance, LANGUAGE } from "../../../core"; +import { LANGUAGE } from "../../../core"; +import { extension } from "../../../BalExtensionContext"; import { commands, window } from "vscode"; import { outputChannel } from "../../../utils"; import { @@ -35,16 +36,16 @@ export function activateCloudCommand() { // register create Cloud.toml command handler commands.registerCommand(PALETTE_COMMANDS.CLOUD, async () => { try { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_PROJECT_CLOUD, CMP_PROJECT_CLOUD); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_PROJECT_CLOUD, CMP_PROJECT_CLOUD); if (window.activeTextEditor && window.activeTextEditor.document.languageId != LANGUAGE.BALLERINA) { window.showErrorMessage(MESSAGES.NOT_IN_PROJECT); return; } - const isDiagram: boolean = ballerinaExtInstance.getDocumentContext().isActiveDiagram(); + const isDiagram: boolean = extension.ballerinaExtInstance.getDocumentContext().isActiveDiagram(); const currentProject = isDiagram ? await - getCurrentBallerinaProject(ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) + getCurrentBallerinaProject(extension.ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) : await getCurrentBallerinaProject(); if (currentProject.kind !== PROJECT_TYPE.SINGLE_FILE) { @@ -53,27 +54,27 @@ export function activateCloudCommand() { if (!fs.existsSync(cloudTomlPath)) { const commandArgs = { key: "uri", - value: isDiagram ? ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString() + 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(ballerinaExtInstance, TM_EVENT_ERROR_EXECUTE_PROJECT_CLOUD, + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_ERROR_EXECUTE_PROJECT_CLOUD, CMP_PROJECT_CLOUD, getMessageObject(message)); window.showErrorMessage(message); } } } else { const message = `Cloud.toml is not supported for single file projects.`; - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_ERROR_EXECUTE_PROJECT_CLOUD, CMP_PROJECT_CLOUD, + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_ERROR_EXECUTE_PROJECT_CLOUD, CMP_PROJECT_CLOUD, getMessageObject(message)); window.showErrorMessage(message); } } catch (error) { if (error instanceof Error) { - sendTelemetryException(ballerinaExtInstance, error, CMP_PROJECT_CLOUD); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_PROJECT_CLOUD); window.showErrorMessage(error.message); } else { window.showErrorMessage("Unkown error occurred."); diff --git a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/cmd-runner.ts b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/cmd-runner.ts index ab92d8ff176..8dcdc8a3c69 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/cmd-runner.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/cmd-runner.ts @@ -19,44 +19,49 @@ import { BallerinaProject } from "@wso2/ballerina-core"; import { Terminal, window, workspace } from "vscode"; import { isSupportedSLVersion, isWindows } from "../../../utils"; -import { ballerinaExtInstance } from "../../../core"; - - -export enum PALETTE_COMMANDS { - ADD = 'ballerina.project.add', - BUILD = 'ballerina.project.build', - PACK = 'ballerina.project.pack', - CLOUD = 'ballerina.create.cloud', - LOGIN_COPILOT = "ballerina.login.copilot", - RESET_BI = "ballerina.reset.bi", - DOC = 'ballerina.project.doc', - FOCUS_EXPLORER = 'ballerinaExplorerTreeView.focus', - RUN_CMD = 'ballerina.project.run.cmd', - RUN = 'ballerina.project.run', - SAVE_ALL = 'workbench.action.files.saveFiles', - TEST = 'ballerina.project.test', - PASTE_JSON_AS_RECORD = 'ballerina.pasteAsRecord', - PASTE_XML_AS_RECORD = 'ballerina.pasteXMLAsRecord', - CHOREO_SIGNIN = 'ballerina.choreo.signin', - CHOREO_ANON_SIGNIN = 'ballerina.choreo.anonymous.signin', - CHOREO_SIGNOUT = 'ballerina.choreo.signout', - FOCUS_SOURCE_CONTROL = 'workbench.view.scm', - CHOREO_SYNC_CHANGES = 'ballerina.choreo.sync', - PERFORMANCE_FORECAST_ENABLE = 'performance.forecasting.enable', - PERFORMANCE_FORECAST_DISABLE = 'performance.forecasting.disable', - TRY_IT = 'ballerina.tryit', - OPEN_IN_DIAGRAM = 'ballerina.openIn.diagram', - SHOW_DIAGRAM = 'ballerina.show.diagram', - SHOW_SOURCE = 'ballerina.show.source', - SHOW_ARCHITECTURE_VIEW = 'ballerina.view.architectureView', - SHOW_EXAMPLES = 'ballerina.showExamples', - REFRESH_SHOW_ARCHITECTURE_VIEW = "ballerina.view.architectureView.refresh", - RUN_CONFIG = 'ballerina.project.run.config', - CONFIG_CREATE_COMMAND = 'ballerina.project.config.create', - SHOW_ENTITY_DIAGRAM = 'ballerina.view.entityDiagram', - SHOW_SERVICE_DESIGNER_VIEW = 'ballerina.view.serviceDesigner', - SHOW_GRAPHQL_DESIGNER_VIEW = 'ballerina.view.graphqlDesigner' -} +import { extension } from "../../../BalExtensionContext"; + + +export const PALETTE_COMMANDS = { + ADD: 'ballerina.project.add', + BUILD: 'ballerina.project.build', + PACK: 'ballerina.project.pack', + CLOUD: 'ballerina.create.cloud', + LOGIN_COPILOT: "ballerina.login.copilot", + RESET_BI: "ballerina.reset.bi", + DOC: 'ballerina.project.doc', + FOCUS_EXPLORER: 'ballerinaExplorerTreeView.focus', + RUN_CMD: 'ballerina.project.run.cmd', + RUN: 'ballerina.project.run', + SAVE_ALL: 'workbench.action.files.saveFiles', + TEST: 'ballerina.project.test', + PASTE_JSON_AS_RECORD: 'ballerina.pasteAsRecord', + PASTE_XML_AS_RECORD: 'ballerina.pasteXMLAsRecord', + CHOREO_SIGNIN: 'ballerina.choreo.signin', + CHOREO_ANON_SIGNIN: 'ballerina.choreo.anonymous.signin', + CHOREO_SIGNOUT: 'ballerina.choreo.signout', + FOCUS_SOURCE_CONTROL: 'workbench.view.scm', + CHOREO_SYNC_CHANGES: 'ballerina.choreo.sync', + PERFORMANCE_FORECAST_ENABLE: 'performance.forecasting.enable', + PERFORMANCE_FORECAST_DISABLE: 'performance.forecasting.disable', + TRY_IT: 'ballerina.tryIt', + OPEN_IN_DIAGRAM: 'ballerina.openIn.diagram', + SHOW_DIAGRAM: 'ballerina.show.diagram', + SHOW_SOURCE: 'ballerina.show.source', + SHOW_ARCHITECTURE_VIEW: 'ballerina.view.architectureView', + SHOW_EXAMPLES: 'ballerina.showExamples', + REFRESH_SHOW_ARCHITECTURE_VIEW: "ballerina.view.architectureView.refresh", + RUN_CONFIG: 'ballerina.project.run.config', + CONFIG_CREATE_COMMAND: 'ballerina.project.config.create', + SHOW_ENTITY_DIAGRAM: 'ballerina.view.entityDiagram', + SHOW_SERVICE_DESIGNER_VIEW: 'ballerina.view.serviceDesigner', + SHOW_GRAPHQL_DESIGNER_VIEW: 'ballerina.view.graphqlDesigner' +}; + +export const INTERNAL_DEBUG_COMMAND = "ballerina.internal.debug"; +export const SOURCE_DEBUG_COMMAND = "ballerina.source.debug"; +export const TEST_DEBUG_COMMAND = "ballerina.test.debug"; +export const FOCUS_DEBUG_CONSOLE_COMMAND = 'workbench.debug.action.focusRepl'; export enum BALLERINA_COMMANDS { TEST = "test", BUILD = "build", FORMAT = "format", RUN = "run", RUN_WITH_WATCH = "run --watch", DOC = "doc", @@ -168,7 +173,7 @@ export function runCommandWithConf(file: BallerinaProject | string, executor: st terminal.sendText(commandText, true); } -export function runTerminalCommand(executor: string, file?: BallerinaProject | string, env? : { [key: string]:string }) { +export function runTerminalCommand(executor: string, file?: BallerinaProject | string, env?: { [key: string]: string }) { let filePath = ''; typeof file === 'string' ? filePath = file : filePath = file?.path!; if (!terminal) { @@ -183,16 +188,16 @@ export function clearTerminal(): void { } } -export function createTerminal(path: string, env? : { [key: string]:string }): void { +export function createTerminal(path: string, env?: { [key: string]: string }): void { if (terminal) { terminal = window.createTerminal({ name: TERMINAL_NAME, cwd: path, env: env }); } } export function getRunCommand(): BALLERINA_COMMANDS { - if (isSupportedSLVersion(ballerinaExtInstance, 2201130) && ballerinaExtInstance.enabledExperimentalFeatures()) { + if (isSupportedSLVersion(extension.ballerinaExtInstance, 2201130) && extension.ballerinaExtInstance.enabledExperimentalFeatures()) { return BALLERINA_COMMANDS.RUN_WITH_EXPERIMENTAL; - } else if (ballerinaExtInstance.enabledLiveReload()) { + } else if (extension.ballerinaExtInstance.enabledLiveReload()) { return BALLERINA_COMMANDS.RUN_WITH_WATCH; } return BALLERINA_COMMANDS.RUN; 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 1dec715093a..d8787db53b1 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/configRun.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/configRun.ts @@ -17,17 +17,17 @@ */ import { commands, languages, Uri, window, workspace } from "vscode"; -import { BALLERINA_COMMANDS, getRunCommand, PALETTE_COMMANDS, runCommand } from "./cmd-runner"; -import { ballerinaExtInstance } from "../../../core"; +import { getRunCommand, 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"; function activateConfigRunCommand() { // register the config view run command commands.registerCommand(PALETTE_COMMANDS.RUN_CONFIG, async (filePath: Uri) => { - const currentProject = ballerinaExtInstance.getDocumentContext().getCurrentProject(); + const currentProject = extension.ballerinaExtInstance.getDocumentContext().getCurrentProject(); if (currentProject) { - runCommand(currentProject, ballerinaExtInstance.getBallerinaCmd(), + runCommand(currentProject, extension.ballerinaExtInstance.getBallerinaCmd(), getRunCommand(), currentProject.path!); return; @@ -54,10 +54,10 @@ function activateConfigRunCommand() { languages.registerCompletionItemProvider({ language: 'toml' }, { async provideCompletionItems(document, position, token, context) { - const currentProject = ballerinaExtInstance.getDocumentContext().getCurrentProject(); + const currentProject = extension.ballerinaExtInstance.getDocumentContext().getCurrentProject(); const filePath = window.activeTextEditor.document; const path = filePath.uri.fsPath; - const suggestions = await getConfigCompletions(ballerinaExtInstance, currentProject ? currentProject.path! : path, document, position); + const suggestions = await getConfigCompletions(extension.ballerinaExtInstance, currentProject ? currentProject.path! : path, document, position); return suggestions; } }); 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 165bc1f5d70..45580f45267 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/doc.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/doc.ts @@ -16,7 +16,7 @@ * under the License. */ -import { ballerinaExtInstance, LANGUAGE } from "../../../core"; +import { extension } from "../../../BalExtensionContext"; import { commands, window } from "vscode"; import { TM_EVENT_PROJECT_DOC, TM_EVENT_ERROR_EXECUTE_PROJECT_DOC, CMP_PROJECT_DOC, sendTelemetryEvent, @@ -25,33 +25,34 @@ import { } from "../../telemetry"; import { runCommand, BALLERINA_COMMANDS, MESSAGES, PROJECT_TYPE, PALETTE_COMMANDS } from "./cmd-runner"; import { getCurrentBallerinaProject } from "../../../utils/project-utils"; +import { LANGUAGE } from "../../../core"; function activateDocCommand() { // register ballerina doc handler commands.registerCommand(PALETTE_COMMANDS.DOC, async () => { try { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_PROJECT_DOC, CMP_PROJECT_DOC); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_PROJECT_DOC, CMP_PROJECT_DOC); if (window.activeTextEditor && window.activeTextEditor.document.languageId != LANGUAGE.BALLERINA) { window.showErrorMessage(MESSAGES.NOT_IN_PROJECT); return; } - const currentProject = await ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await - getCurrentBallerinaProject(ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) + const currentProject = await extension.ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await + getCurrentBallerinaProject(extension.ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) : await getCurrentBallerinaProject(); if (currentProject.kind === PROJECT_TYPE.SINGLE_FILE) { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_ERROR_EXECUTE_PROJECT_DOC, CMP_PROJECT_DOC, + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_ERROR_EXECUTE_PROJECT_DOC, CMP_PROJECT_DOC, getMessageObject(MESSAGES.NOT_IN_PROJECT)); window.showErrorMessage(MESSAGES.NOT_IN_PROJECT); return; } - runCommand(currentProject, ballerinaExtInstance.getBallerinaCmd(), BALLERINA_COMMANDS.DOC, + runCommand(currentProject, extension.ballerinaExtInstance.getBallerinaCmd(), BALLERINA_COMMANDS.DOC, currentProject.path!); } catch (error) { if (error instanceof Error) { - sendTelemetryException(ballerinaExtInstance, error, CMP_PROJECT_DOC); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_PROJECT_DOC); window.showErrorMessage(error.message); } else { window.showErrorMessage("Unkown error occurred."); diff --git a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/json-to-record.ts b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/json-to-record.ts index d38554cd284..20e8d51634e 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/json-to-record.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/json-to-record.ts @@ -20,48 +20,48 @@ import { sendTelemetryEvent, sendTelemetryException, TM_EVENT_PASTE_AS_RECORD, CMP_JSON_TO_RECORD, } from "../../telemetry"; import { commands, window, env } from "vscode"; -import { ballerinaExtInstance, DIAGNOSTIC_SEVERITY } from "../../../core"; +import { extension } from "../../../BalExtensionContext"; import { PALETTE_COMMANDS, MESSAGES } from "./cmd-runner"; -import { JsonToRecord } from "@wso2/ballerina-core"; +import { DIAGNOSTIC_SEVERITY, JsonToRecord } from "@wso2/ballerina-core"; const MSG_NOT_SUPPORT = "Paste JSON as a Ballerina record feature is not supported"; export function activatePasteJsonAsRecord() { - if (!ballerinaExtInstance.langClient) { + if (!extension.ballerinaExtInstance.langClient) { return; } commands.registerCommand(PALETTE_COMMANDS.PASTE_JSON_AS_RECORD, () => { // This command is only available since Swan Lake Beta 2 // Check the version before registering the command - const balVersion = ballerinaExtInstance.ballerinaVersion.toLowerCase(); + const balVersion = extension.ballerinaExtInstance.ballerinaVersion.toLowerCase(); if (!balVersion.includes("alpha") && !balVersion.includes("preview")) { if (balVersion.includes("beta")) { // check if SL Beta version >= 2 - const digits = ballerinaExtInstance.ballerinaVersion.replace(/[^0-9]/g, ""); + const digits = extension.ballerinaExtInstance.ballerinaVersion.replace(/[^0-9]/g, ""); const versionNumber = +digits; if (versionNumber < 2) { - window.showErrorMessage(`${MSG_NOT_SUPPORT} in ${ballerinaExtInstance.ballerinaVersion}`); + window.showErrorMessage(`${MSG_NOT_SUPPORT} in ${extension.ballerinaExtInstance.ballerinaVersion}`); return; } } } else { - window.showErrorMessage(`${MSG_NOT_SUPPORT} in ${ballerinaExtInstance.ballerinaVersion}`); + window.showErrorMessage(`${MSG_NOT_SUPPORT} in ${extension.ballerinaExtInstance.ballerinaVersion}`); return; } if (!window.activeTextEditor || !window.activeTextEditor?.document.fileName.endsWith('.bal')) { window.showErrorMessage("Target is not a Ballerina file!"); return; } - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_PASTE_AS_RECORD, CMP_JSON_TO_RECORD); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_PASTE_AS_RECORD, CMP_JSON_TO_RECORD); env.clipboard.readText() .then(clipboardText => { - if (!ballerinaExtInstance.langClient) { + if (!extension.ballerinaExtInstance.langClient) { window.showErrorMessage("Ballerina language client not found."); return; } - ballerinaExtInstance.langClient!.convertJsonToRecord({ jsonString: clipboardText, isClosed: false, isRecordTypeDesc: false, recordName: "", forceFormatRecordFields: false }) + extension.ballerinaExtInstance.langClient!.convertJsonToRecord({ jsonString: clipboardText, isClosed: false, isRecordTypeDesc: false, recordName: "", forceFormatRecordFields: false }) .then(lSResponse => { const response = lSResponse as JsonToRecord; if (!response) { @@ -96,12 +96,12 @@ export function activatePasteJsonAsRecord() { }, error => { window.showErrorMessage(error.message); - sendTelemetryException(ballerinaExtInstance, error, CMP_JSON_TO_RECORD); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_JSON_TO_RECORD); }); }, error => { window.showErrorMessage(error.message); - sendTelemetryException(ballerinaExtInstance, error, CMP_JSON_TO_RECORD); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_JSON_TO_RECORD); }); }); } 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 394cd10a040..89d55cca0f1 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/pack.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/pack.ts @@ -16,7 +16,7 @@ * under the License. */ -import { ballerinaExtInstance, LANGUAGE } from "../../../core"; +import { extension } from "../../../BalExtensionContext"; import { commands, window } from "vscode"; import { CMP_PROJECT_PACK, sendTelemetryEvent, sendTelemetryException, TM_EVENT_PROJECT_PACK @@ -25,23 +25,24 @@ import { runCommand, BALLERINA_COMMANDS, PROJECT_TYPE, PALETTE_COMMANDS, MESSAGE from "./cmd-runner"; import { getCurrentBallerinaProject } from "../../../utils/project-utils"; +import { LANGUAGE } from "../../../core"; export function activatePackCommand() { // register run project build handler commands.registerCommand(PALETTE_COMMANDS.PACK, async () => { try { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_PROJECT_PACK, CMP_PROJECT_PACK); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_PROJECT_PACK, CMP_PROJECT_PACK); if (window.activeTextEditor && window.activeTextEditor.document.languageId != LANGUAGE.BALLERINA) { window.showErrorMessage(MESSAGES.NOT_IN_PROJECT); return; } - const currentProject = ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await - getCurrentBallerinaProject(ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) + const currentProject = extension.ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await + getCurrentBallerinaProject(extension.ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) : await getCurrentBallerinaProject(); if (currentProject.kind !== PROJECT_TYPE.SINGLE_FILE) { - runCommand(currentProject, ballerinaExtInstance.getBallerinaCmd(), BALLERINA_COMMANDS.PACK, + runCommand(currentProject, extension.ballerinaExtInstance.getBallerinaCmd(), BALLERINA_COMMANDS.PACK, currentProject.path!); } else { window.showErrorMessage(MESSAGES.INVALID_PACK); @@ -49,7 +50,7 @@ export function activatePackCommand() { } catch (error) { if (error instanceof Error) { - sendTelemetryException(ballerinaExtInstance, error, CMP_PROJECT_PACK); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_PROJECT_PACK); window.showErrorMessage(error.message); } else { window.showErrorMessage("Unkown error occurred."); diff --git a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/run.ts b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/run.ts index 731bf7c2666..55733dc3d59 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/run.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/run.ts @@ -16,7 +16,7 @@ * under the License. */ -import { ballerinaExtInstance, LANGUAGE } from "../../../core"; +import { extension } from "../../../BalExtensionContext"; import { commands, Uri, window } from "vscode"; import { TM_EVENT_PROJECT_RUN, CMP_PROJECT_RUN, sendTelemetryEvent, sendTelemetryException @@ -24,11 +24,12 @@ import { import { runCommand, BALLERINA_COMMANDS, PROJECT_TYPE, PALETTE_COMMANDS, runCommandWithConf, MESSAGES, getRunCommand } from "./cmd-runner"; import { getCurrentBallerinaProject, getCurrentBallerinaFile, getCurrenDirectoryPath } from "../../../utils/project-utils"; import { prepareAndGenerateConfig } from '../../config-generator/configGenerator'; +import { LANGUAGE } from "../../../core"; function activateRunCmdCommand() { commands.registerCommand(PALETTE_COMMANDS.RUN, async (filePath: Uri) => { - prepareAndGenerateConfig(ballerinaExtInstance, filePath?.fsPath); + prepareAndGenerateConfig(extension.ballerinaExtInstance, filePath?.fsPath); }); // register ballerina run handler @@ -38,7 +39,7 @@ function activateRunCmdCommand() { async function run(args: any[]) { try { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_PROJECT_RUN, CMP_PROJECT_RUN); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_PROJECT_RUN, CMP_PROJECT_RUN); if (window.activeTextEditor && window.activeTextEditor.document.isDirty) { await commands.executeCommand(PALETTE_COMMANDS.SAVE_ALL); } @@ -51,7 +52,7 @@ function activateRunCmdCommand() { } currentProject = await getCurrentBallerinaProject(); } else { - const document = ballerinaExtInstance.getDocumentContext().getLatestDocument(); + const document = extension.ballerinaExtInstance.getDocumentContext().getLatestDocument(); if (document) { currentProject = await getCurrentBallerinaProject(document.fsPath); } else { @@ -70,9 +71,9 @@ function activateRunCmdCommand() { } if (currentProject.kind !== PROJECT_TYPE.SINGLE_FILE) { - const configPath: string = ballerinaExtInstance.getBallerinaConfigPath(); - ballerinaExtInstance.setBallerinaConfigPath(''); - runCommandWithConf(currentProject, ballerinaExtInstance.getBallerinaCmd(), + const configPath: string = extension.ballerinaExtInstance.getBallerinaConfigPath(); + extension.ballerinaExtInstance.setBallerinaConfigPath(''); + runCommandWithConf(currentProject, extension.ballerinaExtInstance.getBallerinaCmd(), getRunCommand(), configPath, currentProject.path!, ...args); } else { @@ -81,7 +82,7 @@ function activateRunCmdCommand() { } catch (error) { if (error instanceof Error) { - sendTelemetryException(ballerinaExtInstance, error, CMP_PROJECT_RUN); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_PROJECT_RUN); window.showErrorMessage(error.message); } else { window.showErrorMessage("Unkown error occurred."); @@ -91,7 +92,7 @@ function activateRunCmdCommand() { } function runCurrentFile() { - runCommand(getCurrenDirectoryPath(), ballerinaExtInstance.getBallerinaCmd(), + runCommand(getCurrenDirectoryPath(), extension.ballerinaExtInstance.getBallerinaCmd(), getRunCommand(), getCurrentBallerinaFile()); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/test.ts b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/test.ts index 01c8b79d09b..66522c964e8 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/test.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/test.ts @@ -16,7 +16,7 @@ * under the License. */ -import { ballerinaExtInstance, LANGUAGE } from "../../../core"; +import { extension } from "../../../BalExtensionContext"; import { commands, window } from "vscode"; import { TM_EVENT_PROJECT_TEST, CMP_PROJECT_TEST, sendTelemetryEvent, sendTelemetryException @@ -24,12 +24,13 @@ import { import { runCommand, BALLERINA_COMMANDS, PROJECT_TYPE, PALETTE_COMMANDS, MESSAGES } from "./cmd-runner"; import { getCurrentBallerinaProject, getCurrentBallerinaFile, getCurrenDirectoryPath } from "../../../utils/project-utils"; +import { LANGUAGE } from "../../../core"; export function activateTestRunner() { // register run project tests handler commands.registerCommand(PALETTE_COMMANDS.TEST, async (...args: any[]) => { try { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_PROJECT_TEST, CMP_PROJECT_TEST); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_PROJECT_TEST, CMP_PROJECT_TEST); if (window.activeTextEditor && window.activeTextEditor.document.isDirty) { await commands.executeCommand(PALETTE_COMMANDS.SAVE_ALL); } @@ -39,19 +40,19 @@ export function activateTestRunner() { return; } // get Ballerina Project path for current Ballerina file - const currentProject = await ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await - getCurrentBallerinaProject(ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) + const currentProject = await extension.ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await + getCurrentBallerinaProject(extension.ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) : await getCurrentBallerinaProject(); if (currentProject.kind !== PROJECT_TYPE.SINGLE_FILE) { - runCommand(currentProject, ballerinaExtInstance.getBallerinaCmd(), BALLERINA_COMMANDS.TEST, + runCommand(currentProject, extension.ballerinaExtInstance.getBallerinaCmd(), BALLERINA_COMMANDS.TEST, ...args, currentProject.path!); } else { - runCommand(getCurrenDirectoryPath(), ballerinaExtInstance.getBallerinaCmd(), + runCommand(getCurrenDirectoryPath(), extension.ballerinaExtInstance.getBallerinaCmd(), BALLERINA_COMMANDS.TEST, ...args, getCurrentBallerinaFile()); } } catch (error) { if (error instanceof Error) { - sendTelemetryException(ballerinaExtInstance, error, CMP_PROJECT_TEST); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_PROJECT_TEST); window.showErrorMessage(error.message); } else { window.showErrorMessage("Unkown error occurred."); diff --git a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/xml-to-record.ts b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/xml-to-record.ts index 6cd8ed89f51..294569cef24 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/xml-to-record.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/xml-to-record.ts @@ -20,37 +20,37 @@ import { sendTelemetryEvent, sendTelemetryException, TM_EVENT_PASTE_AS_RECORD, CMP_XML_TO_RECORD, } from "../../telemetry"; import { commands, window, env } from "vscode"; -import { ballerinaExtInstance, DIAGNOSTIC_SEVERITY } from "../../../core"; +import { extension } from "../../../BalExtensionContext"; import { PALETTE_COMMANDS, MESSAGES } from "./cmd-runner"; import { isSupportedSLVersion } from "../../../utils"; -import { XMLToRecord } from "@wso2/ballerina-core"; +import { DIAGNOSTIC_SEVERITY, XMLToRecord } from "@wso2/ballerina-core"; const MSG_NOT_SUPPORT = "Paste XML as a Ballerina record feature is not supported"; export function activatePasteXMLAsRecord() { - if (!ballerinaExtInstance.langClient) { + if (!extension.ballerinaExtInstance.langClient) { return; } commands.registerCommand(PALETTE_COMMANDS.PASTE_XML_AS_RECORD, () => { // This command is only available since Swan Lake Update 7 patch 2 - if (!isSupportedSLVersion(ballerinaExtInstance, 220172)) { - window.showErrorMessage(`${MSG_NOT_SUPPORT} in ${ballerinaExtInstance.ballerinaVersion}`); + if (!isSupportedSLVersion(extension.ballerinaExtInstance, 220172)) { + window.showErrorMessage(`${MSG_NOT_SUPPORT} in ${extension.ballerinaExtInstance.ballerinaVersion}`); return; } if (!window.activeTextEditor || !window.activeTextEditor?.document.fileName.endsWith('.bal')) { window.showErrorMessage("Target is not a Ballerina file!"); return; } - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_PASTE_AS_RECORD, CMP_XML_TO_RECORD); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_PASTE_AS_RECORD, CMP_XML_TO_RECORD); env.clipboard.readText() .then(clipboardText => { - if (!ballerinaExtInstance.langClient) { + if (!extension.ballerinaExtInstance.langClient) { window.showErrorMessage("Ballerina language client not found."); return; } - ballerinaExtInstance.langClient.convertXMLToRecord({ + extension.ballerinaExtInstance.langClient.convertXMLToRecord({ xmlValue: clipboardText, isClosed: false, isRecordTypeDesc: false, @@ -91,13 +91,13 @@ export function activatePasteXMLAsRecord() { }); error => { window.showErrorMessage(error.message); - sendTelemetryException(ballerinaExtInstance, error, CMP_XML_TO_RECORD); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_XML_TO_RECORD); }; }); }, error => { window.showErrorMessage(error.message); - sendTelemetryException(ballerinaExtInstance, error, CMP_XML_TO_RECORD); + sendTelemetryException(extension.ballerinaExtInstance, error, CMP_XML_TO_RECORD); }); }); } 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 aa9ea9171f7..cc31b0a2d61 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/discover.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/discover.ts @@ -25,10 +25,10 @@ import { Position, Range, TestController, Uri, TestItem, commands } from "vscode let groups: string[] = []; -export async function discoverTestFunctionsInProject(ballerinaExtInstance: BallerinaExtension, +export async function discoverTestFunctionsInProject(ballerinaExtInstance: BallerinaExtension, testController: TestController) { groups.push(testController.id); - const filePath : string = path.join(StateMachine.context().projectUri); + const filePath: string = path.join(StateMachine.context().projectUri); const request: TestsDiscoveryRequest = { filePath }; @@ -55,7 +55,7 @@ function createTests(response: TestsDiscoveryResponse, testController: TestContr for (const [group, testFunctions] of entries) { // Create a test item for the group const groupId = `group:${group}`; - let groupItem : TestItem = testController.items.get(groupId); + let groupItem: TestItem = testController.items.get(groupId); if (!groupItem) { // If the group doesn't exist, create it @@ -65,16 +65,16 @@ function createTests(response: TestsDiscoveryResponse, testController: TestContr } // Ensure testFunctions is iterable (convert to an array if necessary) - const testFunctionsArray = Array.isArray(testFunctions) - ? testFunctions // If it's already an array, use it directly - : Object.values(testFunctions); // If it's an object, convert to an array + const testFunctionsArray = Array.isArray(testFunctions) + ? testFunctions // If it's already an array, use it directly + : Object.values(testFunctions); // If it's an object, convert to an array // Iterate over the test functions in the group for (const tf of testFunctionsArray) { - const testFunc : FunctionTreeNode = tf as FunctionTreeNode; + const testFunc: FunctionTreeNode = tf as FunctionTreeNode; // Generate a unique ID for the test item using the function name const fileName: string = testFunc.lineRange.fileName; - const fileUri = Uri.file(path.join(projectDir, fileName)); + const fileUri = Uri.file(path.join(projectDir, fileName)); const testId = `test:${path.basename(fileUri.path)}:${testFunc.functionName}`; // Create a test item for the test function @@ -95,12 +95,12 @@ function createTests(response: TestsDiscoveryResponse, testController: TestContr groupItem.children.add(testItem); } } - } + } } -export async function handleFileChange(ballerinaExtInstance: BallerinaExtension, - uri: Uri, testController: TestController) { +export async function handleFileChange(ballerinaExtInstance: BallerinaExtension, + uri: Uri, testController: TestController) { const request: TestsDiscoveryRequest = { filePath: uri.path }; diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/runner.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/runner.ts index b1363a6882c..e6c03cd9b4e 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/runner.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/runner.ts @@ -22,7 +22,7 @@ import { CancellationToken, TestRunRequest, TestMessage, TestRun, TestItem, debu import { testController } from './activator'; import { StateMachine } from "../../stateMachine"; import { isTestFunctionItem, isTestGroupItem } from './discover'; -import { ballerinaExtInstance } from '../../core'; +import { extension } from '../../BalExtensionContext'; import { constructDebugConfig } from "../debugger"; const fs = require('fs'); import path from 'path'; @@ -58,7 +58,7 @@ export async function runHandler(request: TestRunRequest, token: CancellationTok run.started(test); let command: string; - const executor = ballerinaExtInstance.getBallerinaCmd(); + const executor = extension.ballerinaExtInstance.getBallerinaCmd(); if (isTestGroupItem(test)) { let testCaseNames: string[] = []; let testItems : TestItem[] = []; diff --git a/workspaces/ballerina/ballerina-extension/src/features/testing/runner.ts b/workspaces/ballerina/ballerina-extension/src/features/testing/runner.ts index d4ce8cfa2f1..b136c9560ae 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/testing/runner.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/testing/runner.ts @@ -23,7 +23,7 @@ import { log } from "console"; import fileUriToPath from "file-uri-to-path"; -import { ballerinaExtInstance, LANGUAGE } from "../../core"; +import { LANGUAGE } from "../../core"; import { DEBUG_REQUEST, DEBUG_CONFIG, constructDebugConfig } from "../debugger"; import { Uri, WorkspaceFolder, workspace, DebugConfiguration, debug, window, CancellationToken, TestItem, TestMessage, TestRunProfileKind, TestRunRequest } from "vscode"; import child_process from 'child_process'; @@ -33,6 +33,7 @@ import path from 'path'; import { BALLERINA_COMMANDS } from "../project"; import { discoverTests, gatherTestItems } from "./discover"; import { testController, projectRoot } from "./activator"; +import { extension } from "../../BalExtensionContext"; enum EXEC_ARG { TESTS = '--tests', @@ -70,7 +71,7 @@ export function runHandler(request: TestRunRequest, cancellation: CancellationTo let testsJson: JSON | undefined = undefined; try { // execute test - const executor = ballerinaExtInstance.getBallerinaCmd(); + const executor = extension.ballerinaExtInstance.getBallerinaCmd(); const commandText = `${executor} ${BALLERINA_COMMANDS.TEST} ${EXEC_ARG.TESTS} ${testNames} ${EXEC_ARG.COVERAGE}`; await runCommand(commandText, projectRoot); diff --git a/workspaces/ballerina/ballerina-extension/src/features/tryit/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/tryit/activator.ts index c1e2eefd8c3..36106b1ab85 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tryit/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tryit/activator.ts @@ -25,7 +25,7 @@ import { BallerinaExtension } from "src/core"; import Handlebars from "handlebars"; import { clientManager, findRunningBallerinaProcesses, handleError, HTTPYAC_CONFIG_TEMPLATE, TRYIT_TEMPLATE, waitForBallerinaService } from "./utils"; import { BIDesignModelResponse, OpenAPISpec } from "@wso2/ballerina-core"; -import { startDebugging } from "../editor-support/codelens-provider"; +import { startDebugging } from "../editor-support/activator"; import { v4 as uuidv4 } from "uuid"; import { createGraphqlView } from "../../views/graphql"; diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts index ab46244ae75..c69e9f0922a 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts @@ -18,7 +18,7 @@ * THIS FILE INCLUDES AUTO GENERATED CODE */ import { - AIAgentOrgRequest, + AiModuleOrgRequest, AIAgentRequest, AIAgentToolsUpdateRequest, AIGentToolsRequest, @@ -27,7 +27,7 @@ import { AIToolsRequest, createAIAgent, genTool, - getAgentOrg, + getAiModuleOrg, getAllAgents, getAllMemoryManagers, getAllModels, @@ -45,7 +45,7 @@ import { AiAgentRpcManager } from "./rpc-manager"; export function registerAiAgentRpcHandlers(messenger: Messenger) { const rpcManger = new AiAgentRpcManager(); - messenger.onRequest(getAgentOrg, (args: AIAgentOrgRequest) => rpcManger.getAgentOrg(args)); + messenger.onRequest(getAiModuleOrg, (args: AiModuleOrgRequest) => rpcManger.getAiModuleOrg(args)); messenger.onRequest(getAllAgents, (args: AINodesRequest) => rpcManger.getAllAgents(args)); messenger.onRequest(getAllModels, (args: AIModelsRequest) => rpcManger.getAllModels(args)); messenger.onRequest(getAllMemoryManagers, (args: MemoryManagersRequest) => rpcManger.getAllMemoryManagers(args)); diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts index 9ab9ac5a67f..75d4a2e2c65 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts @@ -17,8 +17,8 @@ */ import { AIAgentAPI, - AIAgentOrgRequest, - AIAgentOrgResponse, + AiModuleOrgRequest, + AiModuleOrgResponse, AIAgentRequest, AIAgentResponse, AIAgentToolsUpdateRequest, @@ -157,14 +157,14 @@ export class AiAgentRpcManager implements AIAgentAPI { } // Create the model Second - const agentOrg = await StateMachine.langClient().getAgentOrg({ projectPath: projectUri }); - const allAgents = (await StateMachine.langClient().getAllAgents({ filePath, orgName: agentOrg.orgName})); + const aiModuleOrg = await StateMachine.langClient().getAiModuleOrg({ projectPath: projectUri }); + const allAgents = (await StateMachine.langClient().getAllAgents({ filePath, orgName: aiModuleOrg.orgName})); console.log("All Agents: ", allAgents); const fixedAgentCodeData = allAgents.agents.at(0); if (params.modelState === 1) { - const allModels = await StateMachine.langClient().getAllModels({ agent: fixedAgentCodeData.object, filePath, orgName: agentOrg.orgName }); + const allModels = await StateMachine.langClient().getAllModels({ agent: fixedAgentCodeData.object, filePath, orgName: aiModuleOrg.orgName }); const modelCodeData = allModels.models.find(val => val.object === params.selectedModel); const modelFlowNode = (await StateMachine.langClient().getNodeTemplate({ filePath, id: modelCodeData, position: { line: 0, offset: 0 } })).flowNode; @@ -393,11 +393,11 @@ export class AiAgentRpcManager implements AIAgentAPI { } } - async getAgentOrg(params: AIAgentOrgRequest): Promise { + async getAiModuleOrg(params: AiModuleOrgRequest): Promise { return new Promise(async (resolve) => { const context = StateMachine.context(); try { - const res: AIAgentOrgResponse = await context.langClient.getAgentOrg(params); + const res: AiModuleOrgResponse = await context.langClient.getAiModuleOrg(params); resolve(res); } catch (error) { console.log(error); 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 2b68afaaaa0..c1fcd68d602 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 @@ -88,7 +88,7 @@ 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 { BACKEND_URL, closeAllBallerinaFiles } from "../../features/ai/utils"; +import { closeAllBallerinaFiles, OLD_BACKEND_URL } from "../../features/ai/utils"; import { getLLMDiagnosticArrayAsString, handleChatSummaryFailure } from "../../features/natural-programming/utils"; import { StateMachine, updateView } from "../../stateMachine"; import { getAccessToken, getRefreshedAccessToken, loginGithubCopilot } from "../../utils/ai/auth"; @@ -113,7 +113,7 @@ export class AiPanelRpcManager implements AIPanelAPI { // ================================== async getBackendUrl(): Promise { return new Promise(async (resolve) => { - resolve(BACKEND_URL); + resolve(OLD_BACKEND_URL); }); } @@ -142,7 +142,7 @@ export class AiPanelRpcManager implements AIPanelAPI { async getAccessToken(): Promise { return new Promise(async (resolve, reject) => { try { - const accessToken = getAccessToken(); + const accessToken = await getAccessToken(); if (!accessToken) { reject(new Error("Access Token is undefined")); return; @@ -722,14 +722,14 @@ export class AiPanelRpcManager implements AIPanelAPI { diagnostics: cleanDiagnosticMessages(content.diagnostics) }; - const response = await fetchWithAuth(`${BACKEND_URL}/feedback`, { + const response = await fetchWithAuth(`${OLD_BACKEND_URL}/feedback`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); - + if (response.ok) { resolve(true); } else { 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 66903577579..8d4a5da89ad 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 @@ -80,7 +80,7 @@ export function handleStop() { export async function getParamDefinitions( fnSt: FunctionDefinition, fileUri: string -): Promise { +): Promise { let inputs: { [key: string]: any } = {}; let inputMetadata: { [key: string]: any } = {}; let output: { [key: string]: any } = {}; @@ -139,7 +139,7 @@ export async function getParamDefinitions( if ('types' in inputTypeDefinition && !inputTypeDefinition.types[0].hasOwnProperty('type')) { if (STKindChecker.isQualifiedNameReference(parameter.typeName)) { throw new Error(`"${parameter.typeName["identifier"].value}" does not exist in the package "${parameter.typeName["modulePrefix"].value}". Please verify the record name or ensure that the correct package is imported.`); - } + } return INVALID_PARAMETER_TYPE; } @@ -175,7 +175,7 @@ export async function getParamDefinitions( if (isErrorCode(inputDefinition)) { return inputDefinition as ErrorCode; } - + inputs = { ...inputs, [paramName]: (inputDefinition as RecordDefinitonObject).recordFields }; inputMetadata = { ...inputMetadata, @@ -232,9 +232,9 @@ export async function getParamDefinitions( } else { if (!STKindChecker.isSimpleNameReference(fnSt.functionSignature.returnTypeDesc.type) && !STKindChecker.isQualifiedNameReference(fnSt.functionSignature.returnTypeDesc.type)) { - return INVALID_PARAMETER_TYPE; + return INVALID_PARAMETER_TYPE; } - } + } let returnType = fnSt.functionSignature.returnTypeDesc.type; @@ -272,7 +272,7 @@ export async function getParamDefinitions( if ('types' in outputTypeDefinition && !outputTypeDefinition.types[0].hasOwnProperty('type')) { if (STKindChecker.isQualifiedNameReference(returnType)) { throw new Error(`"${returnType["identifier"].value}" does not exist in the package "${returnType["modulePrefix"].value}". Please verify the record name or ensure that the correct package is imported.`); - } + } return INVALID_PARAMETER_TYPE; } @@ -325,7 +325,7 @@ export async function processMappings( if (isErrorCode(mappedResult)) { return mappedResult as ErrorCode; } - parameterDefinitions = mappedResult as ParameterMetadata; + parameterDefinitions = mappedResult as ParameterMetadata; } const codeObject = await getDatamapperCode(parameterDefinitions); @@ -380,7 +380,7 @@ export async function processMappings( } -export async function generateBallerinaCode(response: object, parameterDefinitions: ParameterMetadata | ErrorCode, nestedKey: string = "", nestedKeyArray: string[]): Promise { +export async function generateBallerinaCode(response: object, parameterDefinitions: ParameterMetadata | ErrorCode, nestedKey: string = "", nestedKeyArray: string[]): Promise { let recordFields: { [key: string]: any } = {}; const arrayRecords = [ "record[]", "record[]|()", "(readonly&record)[]", "(readonly&record)[]|()", @@ -393,7 +393,7 @@ export async function generateBallerinaCode(response: object, parameterDefinitio "(record|())[]", "(record|())[]|()", "(readonly&record|())[]", "(readonly&record|())[]|()", ]; const unionEnumIntersectionTypes = [ - "enum", "union", "intersection", "enum[]", + "enum", "union", "intersection", "enum[]", "enum[]|()", "union[]", "union[]|()", "intersection[]", "intersection[]|()"]; if (response.hasOwnProperty("code") && response.hasOwnProperty("message")) { @@ -404,7 +404,7 @@ export async function generateBallerinaCode(response: object, parameterDefinitio let path = await getMappingString(response, parameterDefinitions, nestedKey, recordTypes, unionEnumIntersectionTypes, arrayRecords, arrayEnumUnion, nestedKeyArray); if (isErrorCode(path)) { return {}; - } + } if (path === "") { return {}; } @@ -418,7 +418,7 @@ export async function generateBallerinaCode(response: object, parameterDefinitio for (let index = 0; index < objectKeys.length; index++) { let key = objectKeys[index]; let subRecord = response[key]; - + if (!subRecord.hasOwnProperty("operation") && !subRecord.hasOwnProperty("parameters") && !subRecord.hasOwnProperty("targetType")) { nestedKeyArray.push(key); let responseRecord = await generateBallerinaCode(subRecord, parameterDefinitions, key, nestedKeyArray); @@ -466,11 +466,11 @@ function isUnionType(type: string): boolean { return validUnionTypes.includes(sortedType); // Check against Set } -async function getMappingString(mapping: object, parameterDefinitions: ParameterMetadata | ErrorCode, nestedKey:string, recordTypes: string[], unionEnumIntersectionTypes: string[], arrayRecords: string[], arrayEnumUnion: string[], nestedKeyArray: string[]): Promise { +async function getMappingString(mapping: object, parameterDefinitions: ParameterMetadata | ErrorCode, nestedKey: string, recordTypes: string[], unionEnumIntersectionTypes: string[], arrayRecords: string[], arrayEnumUnion: string[], nestedKeyArray: string[]): Promise { let operation: string = mapping["operation"]; let targetType: string = mapping["targetType"]; let parameters: string[] = mapping["parameters"]; - + let path: string = ""; let modifiedPaths: string[] = []; let inputTypeName: string = ""; @@ -505,7 +505,7 @@ async function getMappingString(mapping: object, parameterDefinitions: Parameter outputObject = parameterDefinitions["outputMetadata"][nestedKey]; } - baseTargetType= targetType.replace(/\|\(\)$/, ""); + baseTargetType = targetType.replace(/\|\(\)$/, ""); inputTypeName = modifiedInput["typeName"]; baseType = inputTypeName.replace(/\|\(\)$/, ""); @@ -525,21 +525,21 @@ async function getMappingString(mapping: object, parameterDefinitions: Parameter if (recordTypes.includes(baseType)) { // Both baseType and baseTargetType either contain "[]" or do not if (!(hasArrayNotation(baseType) === hasArrayNotation(baseTargetType)) && !(baseTargetType === "int")) { - return ""; - } + return ""; + } } else if (unionEnumIntersectionTypes.includes(baseOutputType)) { // Both baseInputType and baseOutputType either contain "[]" or do not if (!(hasArrayNotation(baseInputType) === hasArrayNotation(baseOutputType))) { return ""; - } + } } modifiedPaths = await accessMetadata( - paths, - parameterDefinitions, - outputObject, - baseType, + paths, + parameterDefinitions, + outputObject, + baseType, baseTargetType, - nestedKey, + nestedKey, operation, unionEnumIntersectionTypes, recordTypes, @@ -590,19 +590,19 @@ async function getMappingString(mapping: object, parameterDefinitions: Parameter function convertUnionTypes(inputType: string, targetType: string, variablePath: string) { const inputTypes = inputType.split("|").filter(type => primitiveTypes.includes(type)); - + if (targetType === "string") { return `(${variablePath}).toString()`; } - + if (inputTypes.includes("string") && ["int", "float", "decimal", "boolean"].includes(targetType)) { return `(${variablePath}) is string ? check ${targetType}:fromString((${variablePath}).toString()) : check (${variablePath}).ensureType()`; } - + if (["int", "float", "decimal", "boolean"].includes(targetType)) { return `check (${variablePath}).ensureType()`; } - + return `${variablePath}`; } @@ -650,12 +650,12 @@ async function getMappingString(mapping: object, parameterDefinitions: Parameter return ""; } modifiedPaths = await accessMetadata( - paths, - parameterDefinitions, - outputObject, - baseType, + paths, + parameterDefinitions, + outputObject, + baseType, baseTargetType, - nestedKey, + nestedKey, operation, unionEnumIntersectionTypes, recordTypes, @@ -674,12 +674,12 @@ async function getMappingString(mapping: object, parameterDefinitions: Parameter return ""; } modifiedPaths = await accessMetadata( - paths, - parameterDefinitions, - outputObject, - baseType, + paths, + parameterDefinitions, + outputObject, + baseType, baseTargetType, - nestedKey, + nestedKey, operation, unionEnumIntersectionTypes, recordTypes, @@ -728,19 +728,19 @@ interface VisitorContext { // Implementation of the visitor class TypeInfoVisitorImpl implements TypeInfoVisitor { - constructor() {} + constructor() { } visitField(field: FormField, context: VisitorContext): void { // Reset state for each field this.resetContext(context); - + const typeName = field.typeName; - + if (!typeName) { this.handleTypeInfo(field, context); return; } - + switch (typeName) { case "record": this.visitRecord(field, context); @@ -760,7 +760,7 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { break; } } - + visitMember(member: any, context: VisitorContext): { typeName: string, member: any } { let typeName: string; if (member.typeName === "record" && member.fields) { @@ -778,11 +778,11 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { } return { typeName, member }; } - + visitRecord(field: FormField, context: VisitorContext): void { const temporaryRecord = navigateTypeInfo(field.fields, false); context.isRecord = true; - + const fieldName = getBalRecFieldName(field.name); context.recordFields[fieldName] = (temporaryRecord as RecordDefinitonObject).recordFields; context.recordFieldsMetadata[fieldName] = { @@ -794,14 +794,14 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { fields: (temporaryRecord as RecordDefinitonObject).recordFieldsMetadata }; } - + visitUnionOrIntersection(field: FormField, context: VisitorContext): void { let memberTypeNames: string[] = []; let resolvedTypeName: string = ""; - + // Check for record fields in union members and handle appropriately this.processUnionMembers(field.members, context); - + for (const member of field.members) { const result = this.visitMember(member, context); memberTypeNames.push(result.typeName); @@ -816,26 +816,26 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { context.memberFieldsMetadata = {}; return; } - + resolvedTypeName = this.getResolvedTypeName(field.typeName, memberTypeNames); - + this.buildFieldMetadata(field, resolvedTypeName, context); this.setFieldAndMetadata(field, resolvedTypeName, context); } - + visitArray(field: FormField, context: VisitorContext): void { - if (field.memberType.hasOwnProperty("members") && + if (field.memberType.hasOwnProperty("members") && ["union", "intersection", "enum"].includes(field.memberType.typeName)) { - + // Handle array with union/intersection/enum member type this.processUnionMembers(field.memberType.members, context); - + if (field.memberType.members.length === 0) { context.memberRecordFields = {}; context.memberFieldsMetadata = {}; return; } - + this.handleArrayWithCompositeType(field, context); } else if (field.memberType.hasOwnProperty("fields") && field.memberType.typeName === "record") { this.handleArrayWithRecordType(field, context); @@ -843,24 +843,24 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { this.handleSimpleArray(field, context); } } - + visitEnum(field: FormField, context: VisitorContext): void { let memberTypeNames: string[] = []; - + for (const member of field.members) { const result = this.visitMember(member, context); memberTypeNames.push(result.typeName); } - + const resolvedTypeName = memberTypeNames.join("|"); - + this.buildFieldMetadata(field, resolvedTypeName, context); this.setFieldAndMetadata(field, resolvedTypeName, context); } - + visitPrimitive(field: FormField, context: VisitorContext): void { const typeName = field.typeName; - + if (field.hasOwnProperty("name")) { const fieldName = getBalRecFieldName(field.name); context.recordFields[fieldName] = { type: typeName, comment: "" }; @@ -882,7 +882,7 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { }; } } - + private handleTypeInfo(field: FormField, context: VisitorContext): void { const fieldName = getBalRecFieldName(field.name); context.recordFields[fieldName] = { type: field.typeInfo.name, comment: "" }; @@ -894,12 +894,12 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { optional: field.optional }; } - + private handleRecordMember(member: any, context: VisitorContext): string { const temporaryRecord = navigateTypeInfo(member.fields, false); context.isRecord = true; let memberName: string; - + if (context.isUnion && member.hasOwnProperty("name")) { memberName = member.name; const fieldName = getBalRecFieldName(memberName); @@ -910,7 +910,7 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { type: "record", typeInstance: fieldName, typeName: member.typeName, - fields: (temporaryRecord as RecordDefinitonObject).recordFieldsMetadata + fields: (temporaryRecord as RecordDefinitonObject).recordFieldsMetadata }; } else { memberName = "record"; @@ -923,14 +923,14 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { ...((temporaryRecord as RecordDefinitonObject).recordFieldsMetadata) }; } - + return memberName; } - + private handleArrayMember(member: any, context: VisitorContext): { typeName: string, member: any } { context.isArray = true; let memberName: string; - + if (member.memberType.hasOwnProperty("fields") && member.memberType.typeName === "record") { const temporaryRecord = navigateTypeInfo(member.memberType.fields, false); memberName = `${member.memberType.typeName}[]`; @@ -942,12 +942,12 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { ...context.memberFieldsMetadata, ...((temporaryRecord as RecordDefinitonObject).recordFieldsMetadata) }; - } else if (member.memberType.hasOwnProperty("members") && - ["union", "intersection", "enum"].includes(member.memberType.typeName)) { - + } else if (member.memberType.hasOwnProperty("members") && + ["union", "intersection", "enum"].includes(member.memberType.typeName)) { + // Process union members to handle records appropriately this.processUnionMembers(member.memberType.members, context); - + if (member.memberType.members.length === 0) { memberName = ""; member = []; @@ -958,73 +958,73 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { if (member.memberType.hasOwnProperty("name") && !member.memberType.hasOwnProperty("typeName")) { memberName = `${member.memberType.name}[]`; } else { - memberName = "record[]"; + memberName = "record[]"; } } else { memberName = `${member.memberType.typeName}[]`; } - + return { typeName: memberName, member }; } - + private handleArrayWithCompositeTypeMember(member: any, context: VisitorContext): string { let memberTypes: string[] = []; const members = member.memberType.members; - + this.determineIfUnion(members, context); - + for (const innerMember of members) { const result = this.visitMember(innerMember, context); memberTypes.push(result.typeName); } - + context.isSimple = false; - + if (member.memberType.typeName === "intersection") { return `(${memberTypes.join("&")})[]`; } else { return `(${memberTypes.join("|")})[]`; } } - + private handleCompositeMember(member: any, context: VisitorContext): string { let memberTypeNames: string[] = []; - + for (const innerMember of member.members) { const result = this.visitMember(innerMember, context); memberTypeNames.push(result.typeName); } - + if (member.typeName === "intersection") { return `${memberTypeNames.join("&")}`; } else { return `${memberTypeNames.join("|")}`; } } - + private handleNullMember(member: any, context: VisitorContext): string { const memberName = member.typeName; - + if (context.isArray) { context.isArrayNullable = true; - } + } if (context.isRecord) { context.isRecordNullable = true; - } - if (context.isSimple) { + } + if (context.isSimple) { context.isNullable = true; } - + return memberName; } - + private handleSimpleMember(member: any, context: VisitorContext): string { context.isSimple = true; let memberName: string; - + if (member.hasOwnProperty("typeName")) { memberName = member.typeName; - + if (member.hasOwnProperty("name")) { this.addNamedSimpleMember(member, memberName, context); } else { @@ -1033,10 +1033,10 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { } else { memberName = member.name; } - + return memberName; } - + private addNamedSimpleMember(member: any, memberName: string, context: VisitorContext): void { const fieldName = getBalRecFieldName(member.name); context.memberRecordFields = { @@ -1057,7 +1057,7 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { } }; } - + private addUnnamedSimpleMember(memberName: string, member: any, context: VisitorContext): void { // Check if typeName is not one of the BasicTypes types const BasicTypes = ["int", "string", "float", "boolean", "decimal", "readonly"]; @@ -1075,18 +1075,18 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { }; } } - + private handleArrayWithCompositeType(field: FormField, context: VisitorContext): void { let memberTypeNames: string[] = []; - + for (const member of field.memberType.members) { const result = this.visitMember(member, context); memberTypeNames.push(result.typeName); } - + context.isArray = true; let resolvedTypeName: string = ""; - + if (field.memberType.typeName === "intersection") { resolvedTypeName = `${memberTypeNames.join("&")}`; } else { @@ -1094,20 +1094,20 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { } const fieldName = getBalRecFieldName(field.name); - context.recordFields[fieldName] = Object.keys(context.memberRecordFields).length > 0 - ? context.memberRecordFields - : { type: `(${resolvedTypeName})[]`, comment: "" }; - + context.recordFields[fieldName] = Object.keys(context.memberRecordFields).length > 0 + ? context.memberRecordFields + : { type: `(${resolvedTypeName})[]`, comment: "" }; + this.buildArrayFieldMetadata(field, resolvedTypeName, context); } - + private handleArrayWithRecordType(field: FormField, context: VisitorContext): void { const temporaryRecord = navigateTypeInfo(field.memberType.fields, false); const fieldName = getBalRecFieldName(field.name); context.recordFields[fieldName] = (temporaryRecord as RecordDefinitonObject).recordFields; context.isArray = true; context.isRecord = true; - + context.fieldMetadata = { optional: field.optional, typeName: "record[]", @@ -1115,20 +1115,20 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { typeInstance: fieldName, fields: (temporaryRecord as RecordDefinitonObject).recordFieldsMetadata }; - + this.applyNullabilityToFieldMetadata(context); context.recordFieldsMetadata[field.name] = context.fieldMetadata; } - + private handleSimpleArray(field: FormField, context: VisitorContext): void { let typeName: string; - + if (field.memberType.hasOwnProperty("typeInfo")) { typeName = "record[]"; } else { typeName = `${field.memberType.typeName}[]`; } - + if (field.memberType.members && field.memberType.members.length === 0) { context.memberRecordFields = {}; context.memberFieldsMetadata = {}; @@ -1144,10 +1144,10 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { }; } } - + private processUnionMembers(members: any[], context: VisitorContext): void { this.determineIfUnion(members, context); - + if (members.length > 2) { // If at least one member has fields, remove that field for (let i = members.length - 1; i >= 0; i--) { @@ -1166,7 +1166,7 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { } } } - + private determineIfUnion(members: any[], context: VisitorContext): void { if (members.length > 2) { context.isUnion = members.some((member) => member.typeName === "()"); @@ -1176,7 +1176,7 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { context.isUnion = false; } } - + private getResolvedTypeName(typeName: string, memberTypeNames: string[]): string { if (typeName === "intersection") { return `${memberTypeNames.join("&")}`; @@ -1184,7 +1184,7 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { return `${memberTypeNames.join("|")}`; } } - + private buildFieldMetadata(field: FormField, resolvedTypeName: string, context: VisitorContext): void { context.fieldMetadata = { optional: field.optional, @@ -1196,10 +1196,10 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { typeInstance: field.name, ...(Object.keys(context.memberFieldsMetadata).length > 0 && { members: context.memberFieldsMetadata }) }; - + this.applyNullabilityToFieldMetadata(context); } - + private buildArrayFieldMetadata(field: FormField, resolvedTypeName: string, context: VisitorContext): void { context.fieldMetadata = { optional: field.optional, @@ -1208,12 +1208,12 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { typeInstance: field.name, ...(Object.keys(context.memberFieldsMetadata).length > 0 && { members: context.memberFieldsMetadata }) }; - + this.applyNullabilityToFieldMetadata(context); const fieldName = getBalRecFieldName(field.name); context.recordFieldsMetadata[fieldName] = context.fieldMetadata; } - + private applyNullabilityToFieldMetadata(context: VisitorContext): void { // Apply nullableArray property if (context.isArray) { @@ -1223,7 +1223,7 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { context.fieldMetadata.nullableArray = context.isNullable; } } - + // Apply nullable property if (context.isArray) { context.fieldMetadata.nullable = context.isArrayNullable; @@ -1233,15 +1233,15 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { context.fieldMetadata.nullable = context.isNullable; } } - + private setFieldAndMetadata(field: FormField, resolvedTypeName: string, context: VisitorContext): void { const fieldName = getBalRecFieldName(field.name); - context.recordFields[fieldName] = Object.keys(context.memberRecordFields).length > 0 - ? context.memberRecordFields - : { type: resolvedTypeName, comment: "" }; + context.recordFields[fieldName] = Object.keys(context.memberRecordFields).length > 0 + ? context.memberRecordFields + : { type: resolvedTypeName, comment: "" }; context.recordFieldsMetadata[fieldName] = context.fieldMetadata; } - + private resetContext(context: VisitorContext): void { context.memberRecordFields = {}; context.memberFieldsMetadata = {}; @@ -1276,16 +1276,16 @@ function navigateTypeInfo( isSimple: false, isUnion: false }; - + const visitor = new TypeInfoVisitorImpl(); for (const field of typeInfos) { visitor.visitField(field, context); } - - return { - "recordFields": context.recordFields, - "recordFieldsMetadata": context.recordFieldsMetadata + + return { + "recordFields": context.recordFields, + "recordFieldsMetadata": context.recordFieldsMetadata }; } @@ -1303,8 +1303,8 @@ export async function getDatamapperCode(parameterDefinitions: ErrorCode | Parame let response: DatamapperResponse = await sendDatamapperRequest(parameterDefinitions, accessToken); let intermediateMapping = response.mappings; - let finalCode = await generateBallerinaCode(intermediateMapping, parameterDefinitions, "", nestedKeyArray); - return finalCode; + let finalCode = await generateBallerinaCode(intermediateMapping, parameterDefinitions, "", nestedKeyArray); + return finalCode; } catch (error) { console.error(error); return TIMEOUT; @@ -1312,7 +1312,7 @@ export async function getDatamapperCode(parameterDefinitions: ErrorCode | Parame } export async function constructRecord(codeObject: object): Promise<{ recordString: string; isCheckError: boolean; }> { - let recordString: string = ""; + let recordString: string = ""; let isCheckError: boolean = false; let objectKeys = Object.keys(codeObject); for (let index = 0; index < objectKeys.length; index++) { @@ -1320,7 +1320,7 @@ export async function constructRecord(codeObject: object): Promise<{ recordStrin let mapping = codeObject[key]; if (typeof mapping === "string") { if (mapping.includes("check ")) { - isCheckError = true; + isCheckError = true; } if (recordString !== "") { recordString += ",\n"; @@ -1329,7 +1329,7 @@ export async function constructRecord(codeObject: object): Promise<{ recordStrin } else { let subRecordResult = await constructRecord(mapping); if (subRecordResult.isCheckError) { - isCheckError = true; + isCheckError = true; } if (recordString !== "") { recordString += ",\n"; @@ -1354,7 +1354,7 @@ export function notifyNoGeneratedMappings() { } async function sendDatamapperRequest(parameterDefinitions: ParameterMetadata | ErrorCode, accessToken: string | ErrorCode): Promise { - const response : DatamapperResponse= await generateAutoMappings(parameterDefinitions as Payload); + const response: DatamapperResponse = await generateAutoMappings(parameterDefinitions as Payload); return response; } @@ -1365,7 +1365,7 @@ export async function searchDocumentation(message: string): Promise { let responseContent: string; if (referenceSources.length > 0) { responseContent = `${finalResponse} \nreference sources: \n${referenceSources.join(' \n')}`; - }else{ + } else { responseContent = finalResponse; } @@ -1376,12 +1376,12 @@ export async function filterDocumentation(resp: Response): Promise { let responseContent: string; if (resp.status == 200 || resp.status == 201) { const data = (await resp.json()) as any; - console.log("data",data.response); + console.log("data", data.response); const finalResponse = await (data.response.content).replace(/[\s\S]*?<\/thinking>/g, ''); const referenceSources = data.response.references; if (referenceSources.length > 0) { responseContent = `${finalResponse} \nreference sources: \n${referenceSources.join(' \n')}`; - }else{ + } else { responseContent = finalResponse; } @@ -1390,7 +1390,7 @@ export async function filterDocumentation(resp: Response): Promise { throw new Error(AIChatError.UNKNOWN_CONNECTION_ERROR); } -async function filterMappingResponse(resp: Response): Promise { +async function filterMappingResponse(resp: Response): Promise { if (resp.status == 200 || resp.status == 201) { const data = (await resp.json()) as any; return data.file_content; @@ -1404,7 +1404,7 @@ async function filterMappingResponse(resp: Response): Promise return PARSING_ERROR; } if (resp.status == 429) { return TOO_MANY_REQUESTS; - } + } if (resp.status == 500) { return SERVER_ERROR; } else { @@ -1534,7 +1534,7 @@ async function accessMetadata( if (!["enum", "enum|()"].includes(inputMetadataType)) { isUsingDefault = false; } - + if (arrayRecords.includes(metadataTypeName) || arrayEnumUnion.includes(inputMetadataType)) { if (isInputRecordNullableArray) { isUsingArray = true; @@ -1563,23 +1563,23 @@ async function accessMetadata( if (isInputRecordNullable && isInputRecordOptional) { newPath[index - 1] = `${paths[index - 1]}?`; } - // Handle enum, union, and intersection types + // Handle enum, union, and intersection types } else if (unionEnumIntersectionTypes.includes(inputMetadataType)) { if (isInputRecordNullable && isInputRecordOptional) { newPath[index - 1] = `${paths[index - 1]}?`; - } + } if (inputMetadataType.includes("[]") && operation === "LENGTH") { let lastInputObject = await resolveMetadata(parameterDefinitions, paths, paths[paths.length - 1], "inputMetadata"); let inputDataType = lastInputObject["type"].replace(/\|\(\)$/, ""); defaultValue = await getDefaultValue(inputDataType); newPath[paths.length - 1] = `${paths[paths.length - 1]}?:${defaultValue}`; - } else if (!isOutputNullable && !isOutputOptional) { + } else if (!isOutputNullable && !isOutputOptional) { if (unionEnumIntersectionTypes.includes(inputObject["type"]) && inputObject["members"]) { - if (!isInputRecordNullableArray || isOutputRecordNullable){ + if (!isInputRecordNullableArray || isOutputRecordNullable) { let typeName = inputMetadataType.includes("[]") ? inputMetadataType.replace(/\|\(\)$/, "") : (inputObject as any).members[Object.keys((inputObject as any).members)[0]].typeName; - + let defaultValue = await getDefaultValue(typeName); newPath[paths.length - 1] = `${paths[paths.length - 1]}?:${defaultValue !== "void" ? defaultValue : JSON.stringify(typeName)}`; } @@ -1590,10 +1590,10 @@ async function accessMetadata( } else { if (isUsingDefault && unionEnumIntersectionTypes.includes(inputObject["type"]) && inputObject["members"]) { if (!isOutputNullable && !isOutputOptional) { - let typeName = inputMetadataType.includes("[]") - ? inputMetadataType.replace("|()", "") + let typeName = inputMetadataType.includes("[]") + ? inputMetadataType.replace("|()", "") : (inputObject as any).members[Object.keys((inputObject as any).members)[0]].typeName; - + let defaultValue = await getDefaultValue(typeName); newPath[paths.length - 1] = `${paths[paths.length - 1]}?:${defaultValue !== "void" ? defaultValue : JSON.stringify(typeName)}`; } @@ -1605,11 +1605,11 @@ async function accessMetadata( } if (!primitiveTypes.includes(baseType)) { if (baseType.includes("[]")) { - if (!isInputNullableArray || isOutputRecordNullable){ + if (!isInputNullableArray || isOutputRecordNullable) { defaultValue = `[]`; } } else { - let cleanedBaseType = baseType.replace(/[\[\]()]*/g, ""); + let cleanedBaseType = baseType.replace(/[\[\]()]*/g, ""); if (cleanedBaseType.includes("|")) { modifiedBaseType = cleanedBaseType.split("|")[0].trim(); } else { @@ -1619,7 +1619,7 @@ async function accessMetadata( } } else { defaultValue = await getDefaultValue(baseType); - } + } if (isUsingArray) { newPath[index] = `${pathIndex}?:${defaultValue}`; @@ -1627,7 +1627,7 @@ async function accessMetadata( if (isUsingDefault && !isOutputNullable && !isOutputOptional) { newPath[index] = `${pathIndex}?:${defaultValue}`; - } else if ((isInputNullable || isInputOptional)) { + } else if ((isInputNullable || isInputOptional)) { if (!isOutputNullable && !isOutputOptional) { if (!isInputNullableArray && isOutputRecordNullable) { newPath[index] = `${pathIndex}?:${defaultValue}`; @@ -1695,11 +1695,11 @@ async function getNestedType(paths: string[], metadata: object): Promise return currentMetadata; } -async function resolveMetadata(parameterDefinitions: ParameterMetadata | ErrorCode, nestedKeyArray: string[], key: string, metadataKey: "inputMetadata" | "outputMetadata"): Promise { +async function resolveMetadata(parameterDefinitions: ParameterMetadata | ErrorCode, nestedKeyArray: string[], key: string, metadataKey: "inputMetadata" | "outputMetadata"): Promise { let metadata = parameterDefinitions[metadataKey]; for (let nk of nestedKeyArray) { if (metadata[nk] && (metadata[nk]["fields"] || metadata[nk]["members"])) { - if (nk === key){ + if (nk === key) { return metadata[nk]; } metadata = metadata[nk]["fields"] || metadata[nk]["members"]; @@ -1734,7 +1734,7 @@ async function handleRecordArrays(key: string, nestedKey: string, responseRecord outputMetadataType = modifiedOutput["type"]; let isDeeplyNested = (arrayRecords.includes(outputMetadataTypeName) || arrayEnumUnion.includes(outputMetadataType)); - let { itemKey: currentItemKey, combinedKey: currentCombinedKey, inputArrayNullable:currentArrayNullable } = await extractKeys(responseRecord[subObjectKey], parameterDefinitions, arrayRecords, arrayEnumUnion); + let { itemKey: currentItemKey, combinedKey: currentCombinedKey, inputArrayNullable: currentArrayNullable } = await extractKeys(responseRecord[subObjectKey], parameterDefinitions, arrayRecords, arrayEnumUnion); if (currentItemKey.includes('?')) { currentItemKey = currentItemKey.replace('?', ''); } @@ -1742,14 +1742,14 @@ async function handleRecordArrays(key: string, nestedKey: string, responseRecord if (isDeeplyNested) { const subArrayRecord = responseRecord[subObjectKey]; const isCombinedKeyModified = currentCombinedKey.endsWith('?'); - const replacementKey = currentArrayNullable || isCombinedKeyModified - ? `${currentItemKey}Item?.` + const replacementKey = currentArrayNullable || isCombinedKeyModified + ? `${currentItemKey}Item?.` : `${currentItemKey}Item.`; - + const regex = new RegExp( currentCombinedKey.replace(/\?/g, '\\?').replace(/\./g, '\\.') + '\\.', 'g' ); - + formattedRecordsArray.push( `${subObjectKey}: ${subArrayRecord.replace(regex, replacementKey)}` ); @@ -1792,10 +1792,10 @@ async function filterResponse(resp: Response): Promise { const data = (await resp.json()) as any; console.log(data); return PARSING_ERROR; - } + } if (resp.status == 429) { return TOO_MANY_REQUESTS; - } + } if (resp.status == 500) { return SERVER_ERROR; } else { @@ -1862,13 +1862,13 @@ async function extractKeys( } async function processParentKey( - innerKey: string, - parameterDefinitions: ParameterMetadata | ErrorCode, + innerKey: string, + parameterDefinitions: ParameterMetadata | ErrorCode, arrayRecords: string[], arrayEnumUnion: string[] -): Promise<{ - itemKey: string; - combinedKey: string; +): Promise<{ + itemKey: string; + combinedKey: string; inputArrayNullable: boolean; }> { let inputMetadataType: string = ""; @@ -1988,7 +1988,7 @@ async function processCombinedKey( if (nextOptional) { isinputArrayOptional = true; } } else { if (arrayRecords.includes(nextMetadataTypeName) || arrayEnumUnion.includes(nextMetadataType)) { - if (nextNullableArray && (nextIndex === (index - 1))) {isinputNullableArray = true;} + if (nextNullableArray && (nextIndex === (index - 1))) { isinputNullableArray = true; } } return { isinputRecordArrayNullable, isinputRecordArrayOptional, isinputArrayNullable, isinputArrayOptional, isinputNullableArray }; } @@ -1998,11 +1998,13 @@ async function processCombinedKey( } export async function requirementsSpecification(filepath: string): Promise { - if (!filepath) { - throw new Error("File is undefined"); + if (!filepath) { + throw new Error("File is undefined"); } - const fileData = await attatchmentToFileData({name: path.basename(filepath), - content: getBase64FromFile(filepath), status: AttachmentStatus.UnknownError}); + const fileData = await attatchmentToFileData({ + name: path.basename(filepath), + content: getBase64FromFile(filepath), status: AttachmentStatus.UnknownError + }); const params: DataMapperRequest = { file: fileData, processType: "requirements", 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 6693f588596..aac325f1039 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 @@ -82,7 +82,11 @@ import { generateOpenApiClient, getAiSuggestions, getAllImports, + getAvailableEmbeddingProviders, + getAvailableModelProviders, getAvailableNodes, + getAvailableVectorKnowledgeBases, + getAvailableVectorStores, getBreakpointInfo, getConfigVariableNodeTemplate, getConfigVariables, @@ -142,6 +146,10 @@ export function registerBiDiagramRpcHandlers(messenger: Messenger) { messenger.onRequest(deleteFlowNode, (args: BISourceCodeRequest) => rpcManger.deleteFlowNode(args)); messenger.onRequest(deleteByComponentInfo, (args: BIDeleteByComponentInfoRequest) => rpcManger.deleteByComponentInfo(args)); messenger.onRequest(getAvailableNodes, (args: BIAvailableNodesRequest) => rpcManger.getAvailableNodes(args)); + messenger.onRequest(getAvailableModelProviders, (args: BIAvailableNodesRequest) => rpcManger.getAvailableModelProviders(args)); + messenger.onRequest(getAvailableVectorStores, (args: BIAvailableNodesRequest) => rpcManger.getAvailableVectorStores(args)); + messenger.onRequest(getAvailableEmbeddingProviders, (args: BIAvailableNodesRequest) => rpcManger.getAvailableEmbeddingProviders(args)); + messenger.onRequest(getAvailableVectorKnowledgeBases, (args: BIAvailableNodesRequest) => rpcManger.getAvailableVectorKnowledgeBases(args)); messenger.onRequest(getEnclosedFunction, (args: BIGetEnclosedFunctionRequest) => rpcManger.getEnclosedFunction(args)); messenger.onRequest(getNodeTemplate, (args: BINodeTemplateRequest) => rpcManger.getNodeTemplate(args)); messenger.onRequest(getAiSuggestions, (args: BIAiSuggestionsRequest) => rpcManger.getAiSuggestions(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 e163771284b..c10f529d34d 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 @@ -139,6 +139,7 @@ import * as fs from "fs"; import * as path from 'path'; import * as vscode from "vscode"; +import { ICreateComponentCmdParams, IWso2PlatformExtensionAPI, CommandIds as PlatformExtCommandIds } from "@wso2/wso2-platform-core"; import { ShellExecution, Task, @@ -149,21 +150,17 @@ 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 { ballerinaExtInstance } from "../../core"; +import { OLD_BACKEND_URL } from "../../features/ai/utils"; +import { cleanAndValidateProject, getCurrentBIProject } from "../../features/config-generator/configGenerator"; import { BreakpointManager } from "../../features/debugger/breakpoint-manager"; import { StateMachine, updateView } from "../../stateMachine"; import { getCompleteSuggestions } from '../../utils/ai/completions'; import { README_FILE, createBIAutomation, createBIFunction, createBIProjectPure } from "../../utils/bi"; import { writeBallerinaFileDidOpen } from "../../utils/modification"; -import { BACKEND_URL } from "../../features/ai/utils"; -import { ICreateComponentCmdParams, IWso2PlatformExtensionAPI, CommandIds as PlatformExtCommandIds } from "@wso2/wso2-platform-core"; -import { cleanAndValidateProject, getCurrentBIProject } from "../../features/config-generator/configGenerator"; import { updateSourceCode } from "../../utils/source-utils"; -import { getRefreshedAccessToken } from "../../../src/utils/ai/auth"; -import { applyBallerinaTomlEdit } from "./utils"; -import { fetchWithAuth } from "../../../src/features/ai/service/connection"; export class BiDiagramRpcManager implements BIDiagramAPI { OpenConfigTomlRequest: (params: OpenConfigTomlRequest) => Promise; @@ -320,6 +317,79 @@ export class BiDiagramRpcManager implements BIDiagramAPI { }); } + + async getAvailableModelProviders(params: BIAvailableNodesRequest): Promise { + console.log(">>> requesting bi available model providers from ls", params); + return new Promise((resolve) => { + StateMachine.langClient() + .getAvailableModelProviders(params) + .then((model) => { + console.log(">>> bi available model providers from ls", model); + resolve(model); + }) + .catch((error) => { + console.log(">>> error fetching available model providers from ls", error); + return new Promise((resolve) => { + resolve(undefined); + }); + }); + }); + } + + async getAvailableVectorStores(params: BIAvailableNodesRequest): Promise { + console.log(">>> requesting bi available vector stores from ls", params); + return new Promise((resolve) => { + StateMachine.langClient() + .getAvailableVectorStores(params) + .then((model) => { + console.log(">>> bi available vector stores from ls", model); + resolve(model); + }) + .catch((error) => { + console.log(">>> error fetching available vector stores from ls", error); + return new Promise((resolve) => { + resolve(undefined); + }); + }); + }); + } + + async getAvailableEmbeddingProviders(params: BIAvailableNodesRequest): Promise { + console.log(">>> requesting bi available embedding providers from ls", params); + return new Promise((resolve) => { + StateMachine.langClient() + .getAvailableEmbeddingProviders(params) + .then((model) => { + console.log(">>> bi available embedding providers from ls", model); + resolve(model); + }) + .catch((error) => { + console.log(">>> error fetching available embedding providers from ls", error); + return new Promise((resolve) => { + resolve(undefined); + }); + }); + }); + } + + async getAvailableVectorKnowledgeBases(params: BIAvailableNodesRequest): Promise { + console.log(">>> requesting bi available vector knowledge bases from ls", params); + return new Promise((resolve) => { + StateMachine.langClient() + .getAvailableVectorKnowledgeBases(params) + .then((model) => { + console.log(">>> bi available vector knowledge bases from ls", model); + resolve(model); + }) + .catch((error) => { + console.log(">>> error fetching available vector knowledge bases from ls", error); + return new Promise((resolve) => { + resolve(undefined); + }); + }); + }); + } + async getNodeTemplate(params: BINodeTemplateRequest): Promise { console.log(">>> requesting bi node template from ls", params); params.forceAssign = true; // TODO: remove this @@ -400,7 +470,7 @@ export class BiDiagramRpcManager implements BIDiagramAPI { return new Promise(async (resolve) => { const { filePath, position, prompt } = params; - const enableAiSuggestions = ballerinaExtInstance.enableAiSuggestions(); + const enableAiSuggestions = extension.ballerinaExtInstance.enableAiSuggestions(); if (!enableAiSuggestions) { resolve(undefined); return; @@ -436,7 +506,7 @@ export class BiDiagramRpcManager implements BIDiagramAPI { }; console.log(">>> request ai suggestion", { request: requestBody }); // generate new nodes - const response = await fetchWithAuth(BACKEND_URL + "/inline/generation", requestOptions); + const response = await fetchWithAuth(OLD_BACKEND_URL + "/inline/generation", requestOptions); if (!response.ok) { console.log(">>> ai completion api call failed ", response); return new Promise((resolve) => { @@ -609,7 +679,7 @@ export class BiDiagramRpcManager implements BIDiagramAPI { async getConfigVariablesV2(): Promise { return new Promise(async (resolve) => { const projectPath = path.join(StateMachine.context().projectUri); - const showLibraryConfigVariables = ballerinaExtInstance.showLibraryConfigVariables(); + const showLibraryConfigVariables = extension.ballerinaExtInstance.showLibraryConfigVariables(); const variables = await StateMachine.langClient().getConfigVariablesV2({ projectPath: projectPath, includeLibraries: showLibraryConfigVariables !== false @@ -1259,7 +1329,7 @@ export class BiDiagramRpcManager implements BIDiagramAPI { }; console.log(">>> request ai suggestion", { request: requestBody }); // generate new nodes - const response = await fetchWithAuth(BACKEND_URL + "/completion", requestOptions); + const response = await fetchWithAuth(OLD_BACKEND_URL + "/completion", requestOptions); if (!response.ok) { console.log(">>> ai completion api call failed ", response); return new Promise((resolve) => { 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 5db2df30076..9d0f7f4da52 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 @@ -43,7 +43,7 @@ import { import child_process from 'child_process'; import { Uri, commands, env, window, workspace, MarkdownString } from "vscode"; import { URI } from "vscode-uri"; -import { ballerinaExtInstance } from "../../core"; +import { extension } from "../../BalExtensionContext"; import { StateMachine } from "../../stateMachine"; import { goToSource } from "../../utils"; import { askFilePath, askProjectPath, BALLERINA_INTEGRATOR_ISSUES_URL, getUpdatedSource } from "./utils"; @@ -187,7 +187,7 @@ export class CommonRpcManager implements CommonRPCAPI { } async experimentalEnabled(): Promise { - return ballerinaExtInstance.enabledExperimentalFeatures(); + return extension.ballerinaExtInstance.enabledExperimentalFeatures(); } async runBackgroundTerminalCommand(params: RunExternalCommandRequest): Promise { @@ -227,6 +227,6 @@ export class CommonRpcManager implements CommonRPCAPI { } async isNPSupported(): Promise { - return ballerinaExtInstance.isNPSupported; + return extension.ballerinaExtInstance.isNPSupported; } } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/lang-client/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/lang-client/rpc-manager.ts index da9f92b3737..8470be5a40e 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/lang-client/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/lang-client/rpc-manager.ts @@ -58,7 +58,7 @@ import { } from "@wso2/ballerina-core"; import { workspace } from "vscode"; import { URI } from "vscode-uri"; -import { ballerinaExtInstance } from "../../core"; +import { extension } from "../../BalExtensionContext"; import { StateMachine } from "../../stateMachine"; import { modifyFileContent } from "../../utils/modification"; @@ -277,7 +277,7 @@ export class LangClientRpcManager implements LangClientAPI { async getBallerinaVersion(): Promise { return new Promise(async (resolve) => { - resolve({ version: ballerinaExtInstance.ballerinaVersion }); + resolve({ version: extension.ballerinaExtInstance.ballerinaVersion }); }); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-handler.ts index dff8fae6484..2dabb631e0f 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-handler.ts @@ -24,8 +24,10 @@ import { addServiceSourceCode, exportOASFile, ExportOASRequest, + FunctionFromSourceRequest, FunctionModelRequest, FunctionSourceCodeRequest, + getFunctionFromSource, getFunctionModel, getHttpResourceModel, getListenerModel, @@ -63,6 +65,7 @@ export function registerServiceDesignerRpcHandlers(messenger: Messenger) { messenger.onRequest(getListenerModelFromCode, (args: ListenerModelFromCodeRequest) => rpcManger.getListenerModelFromCode(args)); messenger.onRequest(getServiceModel, (args: ServiceModelRequest) => rpcManger.getServiceModel(args)); messenger.onRequest(getFunctionModel, (args: FunctionModelRequest) => rpcManger.getFunctionModel(args)); + messenger.onRequest(getFunctionFromSource, (args: FunctionFromSourceRequest) => rpcManger.getFunctionFromSource(args)); messenger.onRequest(addServiceSourceCode, (args: ServiceSourceCodeRequest) => rpcManger.addServiceSourceCode(args)); messenger.onRequest(updateServiceSourceCode, (args: ServiceSourceCodeRequest) => rpcManger.updateServiceSourceCode(args)); messenger.onRequest(getServiceModelFromCode, (args: ServiceModelFromCodeRequest) => rpcManger.getServiceModelFromCode(args)); 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 41d381ac233..f5f9b94de7b 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 @@ -21,6 +21,8 @@ import { DIRECTORY_MAP, ExportOASRequest, ExportOASResponse, + FunctionFromSourceRequest, + FunctionFromSourceResponse, FunctionModelRequest, FunctionModelResponse, FunctionSourceCodeRequest, @@ -48,7 +50,6 @@ import { TriggerModelsResponse, UpdatedArtifactsResponse } from "@wso2/ballerina-core"; -import { NodePosition } from "@wso2/syntax-tree"; import * as fs from 'fs'; import * as yaml from 'js-yaml'; import * as path from 'path'; @@ -400,4 +401,16 @@ export class ServiceDesignerRpcManager implements ServiceDesignerAPI { } }); } + + async getFunctionFromSource(params: FunctionFromSourceRequest): Promise { + return new Promise(async (resolve) => { + const context = StateMachine.context(); + try { + const res: FunctionFromSourceResponse = await context.langClient.getFunctionFromSource(params); + resolve(res); + } catch (error) { + console.log(">>> error fetching function model", error); + } + }); + } } diff --git a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts index b01ab4274fe..9485fd4e7ee 100644 --- a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts +++ b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts @@ -1,5 +1,5 @@ -import { ballerinaExtInstance, ExtendedLangClient } from './core'; +import { ExtendedLangClient } from './core'; import { createMachine, assign, interpret } from 'xstate'; import { activateBallerina } from './extension'; import { EVENT_TYPE, SyntaxTree, History, HistoryEntry, MachineStateValue, STByRangeRequest, SyntaxTreeResponse, UndoRedoManager, VisualizerLocation, webviewReady, MACHINE_VIEW, DIRECTORY_MAP, SCOPE, ProjectStructureResponse, ArtifactData, ProjectStructureArtifactResponse } from "@wso2/ballerina-core"; @@ -66,18 +66,32 @@ const stateMachine = createMachine( initialize: { invoke: { src: checkForProjects, - onDone: { - target: "renderInitialView", - actions: assign({ - isBI: (context, event) => event.data.isBI, - projectUri: (context, event) => event.data.projectPath, - scope: (context, event) => event.data.scope, - org: (context, event) => event.data.orgName, - package: (context, event) => event.data.packageName, - }) - }, + onDone: [ + { + target: "renderInitialView", + cond: (context, event) => event.data && event.data.isBI, + actions: assign({ + isBI: (context, event) => event.data.isBI, + projectUri: (context, event) => event.data.projectPath, + scope: (context, event) => event.data.scope, + org: (context, event) => event.data.orgName, + package: (context, event) => event.data.packageName, + }) + }, + { + target: "activateLS", + cond: (context, event) => event.data && event.data.isBI === false, + actions: assign({ + isBI: (context, event) => event.data.isBI, + projectUri: (context, event) => event.data.projectPath, + scope: (context, event) => event.data.scope, + org: (context, event) => event.data.orgName, + package: (context, event) => event.data.packageName, + }) + } + ], onError: { - target: "renderInitialView" + target: "activateLS" } } }, @@ -103,7 +117,10 @@ const stateMachine = createMachine( }) }, onError: { - target: "lsError" + target: "lsError", + actions: () => { + console.error("Error occurred while activating Language Server."); + } } } }, @@ -117,7 +134,10 @@ const stateMachine = createMachine( }) }, onError: { - target: "lsError" + target: "lsError", + actions: () => { + console.error("Error occurred while fetching project structure."); + } } } }, @@ -267,7 +287,7 @@ const stateMachine = createMachine( // Get context values from the project storage so that we can restore the earlier state when user reopens vscode return new Promise((resolve, reject) => { if (!VisualizerWebview.currentPanel) { - ballerinaExtInstance.setContext(extension.context); + extension.ballerinaExtInstance.setContext(extension.context); VisualizerWebview.currentPanel = new VisualizerWebview(); RPCLayer._messenger.onNotification(webviewReady, () => { history = new History(); @@ -326,7 +346,7 @@ const stateMachine = createMachine( return resolve({ ...selectedEntry.location, view: selectedEntry.location.view ? selectedEntry.location.view : MACHINE_VIEW.Overview }); } - if (selectedEntry && selectedEntry.location.view === MACHINE_VIEW.ERDiagram) { + if (selectedEntry && (selectedEntry.location.view === MACHINE_VIEW.ERDiagram || selectedEntry.location.view === MACHINE_VIEW.ServiceDesigner || selectedEntry.location.view === MACHINE_VIEW.BIDiagram)) { return resolve(selectedEntry.location); } @@ -341,6 +361,7 @@ const stateMachine = createMachine( const { documentUri, position } = location; + // TODO: Refactor this to remove the full ST request const node = documentUri && await StateMachine.langClient().getSyntaxTree({ documentIdentifier: { uri: Uri.file(documentUri).toString() @@ -479,7 +500,34 @@ export function updateView(refreshTreeView?: boolean) { history.pop(); // Remove the last entry lastView = getLastHistory(); // Get the new last entry } - stateService.send({ type: "VIEW_UPDATE", viewLocation: lastView ? lastView.location : { view: "Overview" } }); + + const currentIdentifier = lastView.location.identifier; + let currentArtifact: ProjectStructureArtifactResponse; + + // These changes will be revisited in the revamp + StateMachine.context().projectStructure.directoryMap[lastView.location.artifactType].forEach((artifact) => { + 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); + if (resource) { + currentArtifact = resource; + } + } + }); + + const newPosition = currentArtifact?.position || lastView.location.position; + const newLocation: VisualizerLocation = { ...lastView.location, position: newPosition }; + + history.updateCurrentEntry({ + ...lastView, + location: newLocation + + }); + + stateService.send({ type: "VIEW_UPDATE", viewLocation: lastView ? newLocation : { view: "Overview" } }); if (refreshTreeView) { buildProjectArtifactsStructure(StateMachine.context().projectUri, StateMachine.langClient(), true); } @@ -547,7 +595,7 @@ async function handleSingleWorkspace(workspaceURI: any) { console.error("No BI enabled workspace found"); } - return { isBI, projectPath, scope, orgName, packageName }; + return { isBI, projectPath, scope, orgName, packageName }; } function setBIContext(isBI: boolean) { diff --git a/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts b/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts index 7085e502181..65393877d2a 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/ai/auth.ts @@ -21,10 +21,10 @@ import { extension } from "../../BalExtensionContext"; import { AUTH_CLIENT_ID, AUTH_ORG } from '../../features/ai/utils'; import axios from 'axios'; import { jwtDecode, JwtPayload } from 'jwt-decode'; -// import { StateMachineAI } from '../../../src/views/ai-panel/aiMachine'; +import { AuthCredentials, LoginMethod } from '@wso2/ballerina-core'; -export const ACCESS_TOKEN_SECRET_KEY = 'BallerinaAIUser'; -export const REFRESH_TOKEN_SECRET_KEY = 'BallerinaAIRefreshToken'; +export const REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE = "Refresh token is not available."; +export const AUTH_CREDENTIALS_SECRET_KEY = 'BallerinaAuthCredentials'; //TODO: What if user doesnt have github copilot. //TODO: Where does auth git get triggered @@ -117,40 +117,87 @@ async function copilotTokenExists() { return copilotToken !== undefined && copilotToken !== ''; } +// ================================== +// Structured Auth Credentials Utils +// ================================== +export const storeAuthCredentials = async (credentials: AuthCredentials): Promise => { + const credentialsJson = JSON.stringify(credentials); + await extension.context.secrets.store(AUTH_CREDENTIALS_SECRET_KEY, credentialsJson); +}; + +export const getAuthCredentials = async (): Promise => { + const credentialsJson = await extension.context.secrets.get(AUTH_CREDENTIALS_SECRET_KEY); + if (!credentialsJson) { + return undefined; + } + + try { + return JSON.parse(credentialsJson) as AuthCredentials; + } catch (error) { + console.error('Error parsing auth credentials:', error); + return undefined; + } +}; + +export const clearAuthCredentials = async (): Promise => { + await extension.context.secrets.delete(AUTH_CREDENTIALS_SECRET_KEY); +}; + // ================================== // BI Copilot Auth Utils // ================================== +export const getLoginMethod = async (): Promise => { + const credentials = await getAuthCredentials(); + if (credentials) { + return credentials.loginMethod; + } + return undefined; +}; + export const getAccessToken = async (): Promise => { return new Promise(async (resolve, reject) => { try { - const token = await extension.context.secrets.get(ACCESS_TOKEN_SECRET_KEY); - if (!token) { - resolve(undefined); - return; - } - - let finalToken = token; + const credentials = await getAuthCredentials(); + + if (credentials) { + switch (credentials.loginMethod) { + case LoginMethod.BI_INTEL: + try { + const { accessToken } = credentials.secrets; + let finalToken = accessToken; + + // Decode token and check expiration + const decoded = jwtDecode(accessToken); + const now = Math.floor(Date.now() / 1000); + if (decoded.exp && decoded.exp < now) { + finalToken = await getRefreshedAccessToken(); + } + resolve(finalToken); + return; + } catch (err) { + if (axios.isAxiosError(err)) { + const status = err.response?.status; + if (status === 400) { + reject(new Error("TOKEN_EXPIRED")); + return; + } + } + reject(err); + return; + } + + case LoginMethod.ANTHROPIC_KEY: + resolve(credentials.secrets.apiKey); + return; - // Decode token and check expiration - try { - const decoded = jwtDecode(token); - const now = Math.floor(Date.now() / 1000); - if (decoded.exp && decoded.exp < now) { - finalToken = await getRefreshedAccessToken(); - } - } catch (err) { - if (axios.isAxiosError(err)) { - const status = err.response?.status; - if (status === 400) { - reject(new Error("TOKEN_EXPIRED")); + default: + const { loginMethod }: AuthCredentials = credentials; + reject(new Error(`Unsupported login method: ${loginMethod}`)); return; - } + } - reject(err); - return; } - - resolve(finalToken); + resolve(undefined); } catch (error: any) { reject(error); } @@ -165,9 +212,14 @@ export const getRefreshedAccessToken = async (): Promise => { }; try { - const refreshToken = await extension.context.secrets.get(REFRESH_TOKEN_SECRET_KEY); + const credentials = await getAuthCredentials(); + if (!credentials || credentials.loginMethod !== LoginMethod.BI_INTEL) { + throw new Error('Token refresh is only supported for BI Intel authentication'); + } + + const { refreshToken } = credentials.secrets; if (!refreshToken) { - reject(new Error("Refresh token is not available.")); + reject(new Error(REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE)); return; } @@ -183,8 +235,15 @@ export const getRefreshedAccessToken = async (): Promise => { const newAccessToken = response.data.access_token; const newRefreshToken = response.data.refresh_token; - await extension.context.secrets.store(ACCESS_TOKEN_SECRET_KEY, newAccessToken); - await extension.context.secrets.store(REFRESH_TOKEN_SECRET_KEY, newRefreshToken); + // Update stored credentials + const updatedCredentials: AuthCredentials = { + ...credentials, + secrets: { + accessToken: newAccessToken, + refreshToken: newRefreshToken + } + }; + await storeAuthCredentials(updatedCredentials); resolve(newAccessToken); } catch (error: any) { diff --git a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts index 92f55bf4895..c461714faef 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts @@ -60,13 +60,9 @@ export async function buildProjectArtifactsStructure(projectDir: string, langCli export async function updateProjectArtifacts(publishedArtifacts: ArtifactsNotification): Promise { // Current project structure const currentProjectStructure: ProjectStructureResponse = StateMachine.context().projectStructure; - if (publishedArtifacts && currentProjectStructure) { - const tmpUri = URI.file(tmpdir()); - const publishedArtifactsUri = URI.parse(publishedArtifacts.uri); - if (publishedArtifactsUri.path.toLowerCase().includes(tmpUri.path.toLowerCase())) { - // Skip the temp dirs - return; - } + const projectUri = URI.parse(StateMachine.context().projectUri); + const isWithinProject = URI.parse(publishedArtifacts.uri).path.toLowerCase().includes(projectUri.path.toLowerCase()); + if (currentProjectStructure && isWithinProject) { const entryLocations = await traverseUpdatedComponents(publishedArtifacts.artifacts, currentProjectStructure); if (entryLocations.length > 0) { const notificationHandler = ArtifactNotificationHandler.getInstance(); @@ -183,7 +179,7 @@ async function getEntryValue(artifact: BaseArtifact, icon: string, moduleName?: // This has to be replaced once we have a proper design for AI Agent Chat Service async function injectAIAgent(serviceArtifact: BaseArtifact) { // Fetch the organization name for importing the AI package - const agentOrg = await new AiAgentRpcManager().getAgentOrg({ projectPath: StateMachine.context().projectUri }); + const aiModuleOrg = await new AiAgentRpcManager().getAiModuleOrg({ projectPath: StateMachine.context().projectUri }); //get AgentName const agentName = serviceArtifact.name.split('-')[1].trim().replace(/\//g, ''); @@ -206,11 +202,11 @@ async function injectAIAgent(serviceArtifact: BaseArtifact) { const injectionPosition = updatedService.service.functions[0].codedata.lineRange.endLine; const serviceFile = path.join(StateMachine.context().projectUri, `main.bal`); ensureFileExists(serviceFile); - await injectAgentCode(agentName, serviceFile, injectionPosition, agentOrg.orgName); + await injectAgentCode(agentName, serviceFile, injectionPosition, aiModuleOrg.orgName); const functionPosition: NodePosition = { startLine: updatedService.service.functions[0].codedata.lineRange.startLine.line, startColumn: updatedService.service.functions[0].codedata.lineRange.startLine.offset, - endLine: updatedService.service.functions[0].codedata.lineRange.endLine.line + 3, + endLine: updatedService.service.functions[0].codedata.lineRange.endLine.line + 2, endColumn: updatedService.service.functions[0].codedata.lineRange.endLine.offset }; return { @@ -273,6 +269,8 @@ function getDirectoryMapKeyAndIcon(artifact: BaseArtifact, artifactCategoryKey: return { mapKey: DIRECTORY_MAP.CONFIGURABLE, icon: "config" }; case ARTIFACT_TYPE.NaturalFunctions: return { mapKey: DIRECTORY_MAP.NP_FUNCTION, icon: "function" }; + case ARTIFACT_TYPE.Variables: + return { mapKey: DIRECTORY_MAP.VARIABLE, icon: "variable" }; default: console.warn(`Unhandled artifact category key: ${artifactCategoryKey}`); return null; diff --git a/workspaces/ballerina/ballerina-extension/src/utils/project-utils.ts b/workspaces/ballerina/ballerina-extension/src/utils/project-utils.ts index cb9b2ccef28..55bf802e4b1 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/project-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/project-utils.ts @@ -16,7 +16,7 @@ * under the License. */ -import { ballerinaExtInstance } from "../core"; +import { extension } from "../BalExtensionContext"; import { Uri, window, workspace } from "vscode"; import * as path from 'path'; import { isSupportedVersion, VERSION } from "./config"; @@ -28,9 +28,9 @@ function getCurrentBallerinaProject(file?: string): Promise { // get path of the current bal file const uri = file ? Uri.file(file) : activeEditor.document.uri; // if currently opened file is a bal file - if (ballerinaExtInstance.langClient && isSupportedVersion(ballerinaExtInstance, VERSION.BETA, 1)) { + if (extension.ballerinaExtInstance.langClient && isSupportedVersion(extension.ballerinaExtInstance, VERSION.BETA, 1)) { // get Ballerina Project path for current Ballerina file - ballerinaExtInstance.langClient.getBallerinaProject({ + extension.ballerinaExtInstance.langClient.getBallerinaProject({ documentIdentifier: { uri: uri.toString(), } @@ -54,7 +54,7 @@ function getCurrentBallerinaFile(): string { if (activeEditor && activeEditor.document.fileName.endsWith('.bal')) { return activeEditor.document.fileName; } - const document = ballerinaExtInstance.getDocumentContext().getLatestDocument(); + const document = extension.ballerinaExtInstance.getDocumentContext().getLatestDocument(); if (document) { return document.toString(); } diff --git a/workspaces/ballerina/ballerina-extension/src/utils/runCommand.ts b/workspaces/ballerina/ballerina-extension/src/utils/runCommand.ts index 47da379d336..49dddf0f045 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/runCommand.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/runCommand.ts @@ -16,15 +16,10 @@ * under the License. */ -import { PALETTE_COMMANDS } from 'src/features/project'; import * as vscode from 'vscode'; import child_process from 'child_process'; import { CommandResponse } from '@wso2/ballerina-core'; -export function runCommand(command: PALETTE_COMMANDS, args: any[]) { - vscode.commands.executeCommand(command, ...args); -} - export async function runBackgroundTerminalCommand(command: string) { return new Promise(function (resolve) { child_process.exec(`${command}`, async (err, stdout, stderr) => { diff --git a/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts b/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts index 2a32ee106e7..3cb43b8b749 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts @@ -93,29 +93,52 @@ export async function updateSourceCode(updateSourceCodeRequest: UpdateSourceCode // Iterate through modificationRequests and apply modifications try { + // <-------- Using simply the text edits to update the source code --------> const workspaceEdit = new vscode.WorkspaceEdit(); for (const [fileUriString, request] of Object.entries(modificationRequests)) { - const { parseSuccess, source, syntaxTree } = (await StateMachine.langClient().stModify({ - documentIdentifier: { uri: fileUriString }, - astModifications: request.modifications, - })) as SyntaxTree; - - if (parseSuccess) { + for (const modification of request.modifications) { const fileUri = Uri.file(request.filePath); + const source = modification.config.STATEMENT; workspaceEdit.replace( fileUri, new vscode.Range( - new vscode.Position(0, 0), - new vscode.Position(Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER) + new vscode.Position(modification.startLine, modification.startColumn), + new vscode.Position(modification.endLine, modification.endColumn) ), source ); } } - // Apply all changes at once await workspace.applyEdit(workspaceEdit); + // <-------- Format the document after applying all changes using the native formatting API--------> + const formattedWorkspaceEdit = new vscode.WorkspaceEdit(); + for (const [fileUriString, request] of Object.entries(modificationRequests)) { + const fileUri = Uri.file(request.filePath); + const formattedSources: { newText: string, range: { start: { line: number, character: number }, end: { line: number, character: number } } }[] = await StateMachine.langClient().sendRequest("textDocument/formatting", { + textDocument: { uri: fileUriString }, + options: { + tabSize: 4, + insertSpaces: true + } + }); + for (const formattedSource of formattedSources) { + // Replace the entire document content with the formatted text to avoid duplication + formattedWorkspaceEdit.replace( + fileUri, + new vscode.Range( + new vscode.Position(0, 0), + new vscode.Position(Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER) + ), + formattedSource.newText + ); + } + } + + // Apply all formatted changes at once + await workspace.applyEdit(formattedWorkspaceEdit); + // Handle missing dependencies after all changes are applied if (updateSourceCodeRequest.resolveMissingDependencies) { for (const [fileUriString] of Object.entries(modificationRequests)) { @@ -185,8 +208,8 @@ export async function injectAgentCode(name: string, serviceFile: string, injecti ` string stringResult = check _${name}Agent.run(request.message, request.sessionId); return {message: stringResult}; ` - : ` - string stringResult = check _${name}Agent->run(request.message, request.sessionId); + : + ` string stringResult = check _${name}Agent->run(request.message, request.sessionId); return {message: stringResult}; `; serviceEdit.insert(Uri.file(serviceFile), new Position(injectionPosition.line, 0), serviceSourceCode); diff --git a/workspaces/ballerina/ballerina-extension/src/utils/state-machine-utils.ts b/workspaces/ballerina/ballerina-extension/src/utils/state-machine-utils.ts index 93ad39b6846..45aa5bf4909 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/state-machine-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/state-machine-utils.ts @@ -25,7 +25,7 @@ import { FindNodeByUidVisitor } from "./history/find-node-by-uid"; import { FindConstructByNameVisitor } from "./history/find-construct-by-name-visitor"; import { FindConstructByIndexVisitor } from "./history/find-construct-by-index-visitor"; import { getConstructBodyString } from "./history/util"; -import { ballerinaExtInstance } from "../core"; +import { extension } from "../BalExtensionContext"; import path from "path"; export async function getView(documentUri: string, position: NodePosition, projectUri?: string): Promise { @@ -223,7 +223,7 @@ async function getViewBySTRange(documentUri: string, position: NodePosition, pro documentUri: documentUri, position: node.syntaxTree.position, metadata: { - enableSequenceDiagram: ballerinaExtInstance.enableSequenceDiagramView(), + enableSequenceDiagram: extension.ballerinaExtInstance.enableSequenceDiagramView(), } }, dataMapperDepth: 0 @@ -292,7 +292,8 @@ function findViewByArtifact(dir: ProjectStructureArtifactResponse, position: Nod identifier: dir.name, documentUri: normalizedDocumentUri, position: position, - projectUri: normalizedProjectUri + projectUri: normalizedProjectUri, + artifactType: DIRECTORY_MAP.SERVICE } }; } else if (dir.moduleName === "ai") { @@ -302,7 +303,8 @@ function findViewByArtifact(dir: ProjectStructureArtifactResponse, position: Nod identifier: dir.name, documentUri: normalizedDocumentUri, position: position, - projectUri: normalizedProjectUri + projectUri: normalizedProjectUri, + artifactType: DIRECTORY_MAP.SERVICE, } }; } else { @@ -311,7 +313,8 @@ function findViewByArtifact(dir: ProjectStructureArtifactResponse, position: Nod view: MACHINE_VIEW.ServiceDesigner, identifier: dir.name, documentUri: normalizedDocumentUri, - position: position + position: position, + artifactType: DIRECTORY_MAP.SERVICE } }; } @@ -322,6 +325,7 @@ function findViewByArtifact(dir: ProjectStructureArtifactResponse, position: Nod documentUri: normalizedDocumentUri, position: dir.position, identifier: dir.name, + artifactType: DIRECTORY_MAP.LISTENER } }; case DIRECTORY_MAP.RESOURCE: @@ -331,6 +335,7 @@ function findViewByArtifact(dir: ProjectStructureArtifactResponse, position: Nod documentUri: normalizedDocumentUri, position: dir.position, identifier: dir.id, + artifactType: DIRECTORY_MAP.RESOURCE, } }; case DIRECTORY_MAP.NP_FUNCTION: @@ -341,6 +346,7 @@ function findViewByArtifact(dir: ProjectStructureArtifactResponse, position: Nod position: dir.position, identifier: dir.name, focusFlowDiagramView: FOCUS_FLOW_DIAGRAM_VIEW.NP_FUNCTION, + artifactType: DIRECTORY_MAP.NP_FUNCTION, }, dataMapperDepth: 0 }; @@ -353,8 +359,9 @@ function findViewByArtifact(dir: ProjectStructureArtifactResponse, position: Nod documentUri: normalizedDocumentUri, identifier: dir.name, position: dir.position, + artifactType: dir.type, metadata: { - enableSequenceDiagram: ballerinaExtInstance.enableSequenceDiagramView(), + enableSequenceDiagram: extension.ballerinaExtInstance.enableSequenceDiagramView(), } }, dataMapperDepth: 0 @@ -365,6 +372,7 @@ function findViewByArtifact(dir: ProjectStructureArtifactResponse, position: Nod location: { view: MACHINE_VIEW.EditConnectionWizard, identifier: dir.name, + artifactType: dir.type }, }; case DIRECTORY_MAP.TYPE: // Type diagram should be shown for Type, Class, Enum, Record @@ -374,7 +382,8 @@ function findViewByArtifact(dir: ProjectStructureArtifactResponse, position: Nod documentUri: normalizedDocumentUri, position: position, identifier: dir.name, - projectUri: normalizedProjectUri + projectUri: normalizedProjectUri, + artifactType: DIRECTORY_MAP.TYPE } }; case DIRECTORY_MAP.CONFIGURABLE: @@ -384,6 +393,7 @@ function findViewByArtifact(dir: ProjectStructureArtifactResponse, position: Nod documentUri: normalizedDocumentUri, position: dir.position, identifier: dir.name, + artifactType: DIRECTORY_MAP.CONFIGURABLE }, }; case DIRECTORY_MAP.DATA_MAPPER: @@ -392,7 +402,8 @@ function findViewByArtifact(dir: ProjectStructureArtifactResponse, position: Nod view: MACHINE_VIEW.DataMapper, identifier: dir.name, documentUri: normalizedDocumentUri, - position: position + position: position, + artifactType: DIRECTORY_MAP.DATA_MAPPER }, dataMapperDepth: 0 }; diff --git a/workspaces/ballerina/ballerina-extension/src/utils/webview-utils.ts b/workspaces/ballerina/ballerina-extension/src/utils/webview-utils.ts index 3277353d7f4..0061b1ae349 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/webview-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/webview-utils.ts @@ -18,18 +18,18 @@ import { Uri, ExtensionContext, WebviewOptions, WebviewPanelOptions, Webview } from "vscode"; import { join, sep } from "path"; -import { ballerinaExtInstance } from "../core"; +import { extension } from "../BalExtensionContext"; export const RESOURCES_CDN = `https://choreo-shared-codeserver-cdne.azureedge.net/ballerina-low-code-resources@${process.env.BALLERINA_LOW_CODE_RESOURCES_VERSION}`; const isDevMode = process.env.WEB_VIEW_WATCH_MODE === "true"; function getWebViewResourceRoot(): string { - return join((ballerinaExtInstance.context as ExtensionContext).extensionPath, + return join((extension.ballerinaExtInstance.context as ExtensionContext).extensionPath, 'resources'); } function getNodeModulesRoot(): string { - return join((ballerinaExtInstance.context as ExtensionContext).extensionPath, + return join((extension.ballerinaExtInstance.context as ExtensionContext).extensionPath, 'node_modules'); } @@ -38,7 +38,7 @@ export function getCommonWebViewOptions(): Partial @@ -125,12 +125,12 @@ export function getLibraryWebViewContent(options: WebViewOptions, webView: Webvi } function getComposerURI(webView: Webview): string { - return getVSCodeResourceURI(join((ballerinaExtInstance.context as ExtensionContext).extensionPath, 'resources', + return getVSCodeResourceURI(join((extension.ballerinaExtInstance.context as ExtensionContext).extensionPath, 'resources', 'jslibs'), webView); } function getComposerCSSFiles(disableComDebug: boolean, devHost: string, webView: Webview): string[] { - const filePath = join((ballerinaExtInstance.context as ExtensionContext).extensionPath, 'resources', 'jslibs', 'themes', 'ballerina-default.min.css'); + const filePath = join((extension.ballerinaExtInstance.context as ExtensionContext).extensionPath, 'resources', 'jslibs', 'themes', 'ballerina-default.min.css'); return [ (isDevMode && !disableComDebug) ? join(devHost, 'themes', 'ballerina-default.min.css') : webView.asWebviewUri(Uri.file(filePath)).toString() @@ -138,7 +138,7 @@ function getComposerCSSFiles(disableComDebug: boolean, devHost: string, webView: } function getComposerJSFiles(componentName: string, disableComDebug: boolean, devHost: string, webView: Webview): string[] { - const filePath = join((ballerinaExtInstance.context as ExtensionContext).extensionPath, 'resources', 'jslibs') + sep + componentName + '.js'; + const filePath = join((extension.ballerinaExtInstance.context as ExtensionContext).extensionPath, 'resources', 'jslibs') + sep + componentName + '.js'; return [ (isDevMode && !disableComDebug) ? join(devHost, componentName + '.js') : webView.asWebviewUri(Uri.file(filePath)).toString(), 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 21d1d989afd..cd22228ef0c 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/aiMachine.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/aiMachine.ts @@ -18,12 +18,11 @@ /* eslint-disable @typescript-eslint/naming-convention */ import { createMachine, assign, interpret } from 'xstate'; -import * as vscode from 'vscode'; -import { AIMachineStateValue, AIPanelPrompt, AIMachineEventValue, AIMachineEventType, AIMachineContext, AIUserToken } from '@wso2/ballerina-core'; +import { AIMachineStateValue, AIPanelPrompt, AIMachineEventType, AIMachineContext, AIUserToken, AIMachineSendableEvent, LoginMethod } from '@wso2/ballerina-core'; import { AiPanelWebview } from './webview'; -import { getAuthUrl, getLogoutUrl } from './auth'; import { extension } from '../../BalExtensionContext'; -import { ACCESS_TOKEN_SECRET_KEY, getAccessToken, REFRESH_TOKEN_SECRET_KEY } from '../../utils/ai/auth'; +import { getAccessToken } from '../../utils/ai/auth'; +import { checkToken, initiateInbuiltAuth, logout, validateApiKey } from './utils'; export const USER_CHECK_BACKEND_URL = '/user/usage'; @@ -43,17 +42,23 @@ export const closeAIWebview = () => { } }; -const aiMachine = createMachine({ +const aiMachine = createMachine({ id: 'ballerina-ai', initial: 'Initialize', predictableActionArguments: true, context: { + loginMethod: undefined, userToken: undefined, errorMessage: undefined, }, on: { DISPOSE: { target: 'Initialize', + actions: assign({ + loginMethod: (_ctx) => undefined, + userToken: (_ctx) => undefined, + errorMessage: (_ctx) => undefined, + }) } }, states: { @@ -66,11 +71,18 @@ const aiMachine = createMachine({ cond: (_ctx, event) => !!event.data, target: 'Authenticated', actions: assign({ - userToken: (_ctx, event) => event.data as AIUserToken, + loginMethod: (_ctx, event) => event.data.loginMethod, + userToken: (_ctx, event) => ({ token: event.data.token }), + errorMessage: (_ctx) => undefined, }) }, { target: 'Unauthenticated', + actions: assign({ + loginMethod: (_ctx) => undefined, + userToken: (_ctx) => undefined, + errorMessage: (_ctx) => undefined, + }) } ], onError: [ @@ -78,12 +90,19 @@ const aiMachine = createMachine({ cond: (_ctx, event) => event.data?.message === 'TOKEN_EXPIRED', target: 'Unauthenticated', actions: [ - 'silentLogout' + 'silentLogout', + assign({ + loginMethod: (_ctx) => undefined, + userToken: (_ctx) => undefined, + errorMessage: (_ctx) => undefined, + }) ] }, { target: 'Disabled', actions: assign({ + loginMethod: (_ctx) => undefined, + userToken: (_ctx) => undefined, errorMessage: (_ctx, event) => event.data?.message || 'Unknown error' }) } @@ -92,33 +111,130 @@ const aiMachine = createMachine({ }, Unauthenticated: { on: { - LOGIN: 'Authenticating' + [AIMachineEventType.LOGIN]: { + target: 'Authenticating', + actions: assign({ + loginMethod: (_ctx) => LoginMethod.BI_INTEL + }) + }, + [AIMachineEventType.AUTH_WITH_API_KEY]: { + target: 'Authenticating', + actions: assign({ + loginMethod: (_ctx) => LoginMethod.ANTHROPIC_KEY + }) + } } }, Authenticating: { - invoke: { - id: 'openLogin', - src: 'openLogin', - onError: { - target: 'Unauthenticated' - } - }, - on: { - [AIMachineEventType.LOGIN_SUCCESS]: { - target: 'Authenticated', + initial: 'determineFlow', + states: { + determineFlow: { + always: [ + { + cond: (context) => context.loginMethod === LoginMethod.BI_INTEL, + target: 'ssoFlow' + }, + { + cond: (context) => context.loginMethod === LoginMethod.ANTHROPIC_KEY, + target: 'apiKeyFlow' + }, + { + target: 'ssoFlow' // default + } + ] }, - [AIMachineEventType.CANCEL_LOGIN]: { - target: 'Unauthenticated' + ssoFlow: { + invoke: { + id: 'openLogin', + src: 'openLogin', + onError: { + target: '#ballerina-ai.Unauthenticated', + actions: assign({ + loginMethod: (_ctx) => undefined, + errorMessage: (_ctx, event) => event.data?.message || 'SSO authentication failed' + }) + } + }, + on: { + [AIMachineEventType.COMPLETE_AUTH]: { + target: '#ballerina-ai.Authenticated', + actions: assign({ + errorMessage: (_ctx) => undefined, + }) + }, + [AIMachineEventType.CANCEL_LOGIN]: { + target: '#ballerina-ai.Unauthenticated', + actions: assign({ + loginMethod: (_ctx) => undefined, + errorMessage: (_ctx) => undefined, + }) + } + } + }, + apiKeyFlow: { + on: { + [AIMachineEventType.SUBMIT_API_KEY]: { + target: 'validatingApiKey', + actions: assign({ + errorMessage: (_ctx) => undefined + }) + }, + [AIMachineEventType.CANCEL_LOGIN]: { + target: '#ballerina-ai.Unauthenticated', + actions: assign({ + loginMethod: (_ctx) => undefined, + errorMessage: (_ctx) => undefined, + }) + } + } + }, + validatingApiKey: { + invoke: { + id: 'validateApiKey', + src: 'validateApiKey', + onDone: { + target: '#ballerina-ai.Authenticated', + actions: assign({ + errorMessage: (_ctx) => undefined, + }) + }, + onError: { + target: 'apiKeyFlow', + actions: assign({ + errorMessage: (_ctx, event) => event.data?.message || 'API key validation failed' + }) + } + } } } }, Authenticated: { + invoke: { + id: 'getTokenAfterAuth', + src: 'getTokenAfterAuth', + onDone: { + actions: assign({ + userToken: (_ctx, event) => ({ token: event.data.token }), + loginMethod: (_ctx, event) => event.data.loginMethod, + errorMessage: (_ctx) => undefined, + }) + }, + onError: { + target: 'Unauthenticated', + actions: assign({ + userToken: (_ctx) => undefined, + loginMethod: (_ctx) => undefined, + errorMessage: (_ctx, event) => event.data?.message || 'Failed to retrieve authentication credentials', + }) + } + }, on: { [AIMachineEventType.LOGOUT]: { target: 'Unauthenticated', actions: [ 'logout', assign({ + loginMethod: (_) => undefined, userToken: (_) => undefined, errorMessage: (_) => undefined, }) @@ -129,6 +245,7 @@ const aiMachine = createMachine({ actions: [ 'silentLogout', assign({ + loginMethod: (_) => undefined, userToken: (_) => undefined, errorMessage: (_) => undefined, }) @@ -139,62 +256,54 @@ const aiMachine = createMachine({ Disabled: { on: { RETRY: { - target: 'Initialize' + target: 'Initialize', + actions: assign({ + userToken: (_ctx) => undefined, + loginMethod: (_ctx) => undefined, + errorMessage: (_ctx) => undefined, + }) } } }, } }); -const checkToken = async (context, event): Promise => { +const openLogin = async () => { return new Promise(async (resolve, reject) => { try { - const accessToken = await getAccessToken(); - if (!accessToken) { - resolve(undefined); - return; + const status = await initiateInbuiltAuth(); + if (!status) { + aiStateService.send(AIMachineEventType.CANCEL_LOGIN); } - resolve({ accessToken, usageTokens: undefined }); + resolve(status); } catch (error) { reject(error); } }); }; -const logout = async (isUserLogout: boolean = true) => { - if (isUserLogout) { - const logoutURL = await getLogoutUrl(); - vscode.env.openExternal(vscode.Uri.parse(logoutURL)); +const validateApiKeyService = async (_context: AIMachineContext, event: any) => { + const apiKey = event.payload?.apiKey; + if (!apiKey) { + throw new Error('API key is required'); } - await extension.context.secrets.delete(ACCESS_TOKEN_SECRET_KEY); - await extension.context.secrets.delete(REFRESH_TOKEN_SECRET_KEY); + return await validateApiKey(apiKey, LoginMethod.ANTHROPIC_KEY); }; -const openLogin = async (context, event) => { - return new Promise(async (resolve, reject) => { - try { - const status = await initiateInbuiltAuth(); - if (!status) { - aiStateService.send(AIMachineEventType.CANCEL_LOGIN); - } - } catch (error) { - reject(error); - } - }); +const getTokenAfterAuth = async () => { + const result = await getAccessToken(); + if (!result) { + throw new Error('No authentication credentials found'); + } + return { token: result, loginMethod: LoginMethod.BI_INTEL }; }; -async function initiateInbuiltAuth() { - const callbackUri = await vscode.env.asExternalUri( - vscode.Uri.parse(`${vscode.env.uriScheme}://wso2.ballerina/signin`) - ); - const oauthURL = await getAuthUrl(callbackUri.toString()); - return vscode.env.openExternal(vscode.Uri.parse(oauthURL)); -} - const aiStateService = interpret(aiMachine.withConfig({ services: { checkToken: checkToken, openLogin: openLogin, + validateApiKey: validateApiKeyService, + getTokenAfterAuth: getTokenAfterAuth, }, actions: { logout: () => { @@ -206,10 +315,24 @@ const aiStateService = interpret(aiMachine.withConfig({ } })); +const isExtendedEvent = ( + arg: K | AIMachineSendableEvent +): arg is Extract => { + return typeof arg !== "string"; +}; + export const AIStateMachine = { initialize: () => aiStateService.start(), service: () => { return aiStateService; }, context: () => { return aiStateService.getSnapshot().context; }, state: () => { return aiStateService.getSnapshot().value as AIMachineStateValue; }, - sendEvent: (eventType: AIMachineEventType) => { aiStateService.send({ type: eventType }); } + sendEvent: ( + event: K | Extract + ) => { + if (isExtendedEvent(event)) { + aiStateService.send(event as AIMachineSendableEvent); + } else { + aiStateService.send({ type: event } as AIMachineSendableEvent); + } + } }; diff --git a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/auth.ts b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/auth.ts index d49b28d93dc..f1be64ab87d 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/auth.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/auth.ts @@ -17,10 +17,10 @@ */ import axios from 'axios'; -import { extension } from '../../BalExtensionContext'; import { AUTH_CLIENT_ID, AUTH_ORG, AUTH_REDIRECT_URL } from '../../features/ai/utils'; import { AIStateMachine } from './aiMachine'; -import { AIMachineEventType } from '@wso2/ballerina-core'; +import { AIMachineEventType, AuthCredentials, LoginMethod } from '@wso2/ballerina-core'; +import { storeAuthCredentials } from '../../utils/ai/auth'; export interface AccessToken { accessToken: string; @@ -42,7 +42,7 @@ export async function getAuthUrl(callbackUri: string): Promise { return `https://api.asgardeo.io/t/${AUTH_ORG}/oauth2/authorize?response_type=code&redirect_uri=${AUTH_REDIRECT_URL}&client_id=${AUTH_CLIENT_ID}&scope=openid%20email&state=${state}`; } -export function getLogoutUrl() : string { +export function getLogoutUrl(): string { return `https://api.asgardeo.io/t/${AUTH_ORG}/oidc/logout`; } @@ -67,24 +67,27 @@ export async function exchangeAuthCodeNew(authCode: string): Promise => { + return new Promise(async (resolve, reject) => { + try { + // Clean up any legacy tokens on initialization + await cleanupLegacyTokens(); + + const token = await getAccessToken(); + const loginMethod = await getLoginMethod(); + if (!token || !loginMethod) { + resolve(undefined); + return; + } + resolve({ token, loginMethod }); + } catch (error) { + reject(error); + } + }); +}; + +const cleanupLegacyTokens = async (): Promise => { + try { + const legacyToken = await extension.context.secrets.get(LEGACY_ACCESS_TOKEN_SECRET_KEY); + const legacyRefreshToken = await extension.context.secrets.get(LEGACY_REFRESH_TOKEN_SECRET_KEY); + + if (legacyToken || legacyRefreshToken) { + await extension.context.secrets.delete(LEGACY_ACCESS_TOKEN_SECRET_KEY); + await extension.context.secrets.delete(LEGACY_REFRESH_TOKEN_SECRET_KEY); + } + } catch (error) { + console.error('Error cleaning up legacy tokens:', error); + } +}; + +export const logout = async (isUserLogout: boolean = true) => { + // For user-initiated logout, check if we need to redirect to SSO logout + if (isUserLogout) { + const { token, loginMethod } = await checkToken(); + if (token && loginMethod === LoginMethod.BI_INTEL) { + const logoutURL = getLogoutUrl(); + vscode.env.openExternal(vscode.Uri.parse(logoutURL)); + } + } + + // Always clear stored credentials + await clearAuthCredentials(); +}; + +export async function initiateInbuiltAuth() { + const callbackUri = await vscode.env.asExternalUri( + vscode.Uri.parse(`${vscode.env.uriScheme}://wso2.ballerina/signin`) + ); + const oauthURL = await getAuthUrl(callbackUri.toString()); + return vscode.env.openExternal(vscode.Uri.parse(oauthURL)); +} + +export const validateApiKey = async (apiKey: string, loginMethod: LoginMethod): Promise => { + if (loginMethod !== LoginMethod.ANTHROPIC_KEY) { + throw new Error('This login method is not supported. Please use SSO login instead.'); + } + + if (!apiKey || !apiKey.startsWith('sk-') || apiKey.length < 20) { + throw new Error('Please enter a valid Anthropic API key.'); + } + + try { + const directAnthropic = createAnthropic({ + apiKey: apiKey, + baseURL: 'https://api.anthropic.com/v1' + }); + + await generateText({ + model: directAnthropic('claude-3-haiku-20240307'), + maxTokens: 1, + messages: [{ role: 'user', content: 'Hi' }] + }); + + // Store credentials + const credentials: AuthCredentials = { + loginMethod: LoginMethod.ANTHROPIC_KEY, + secrets: { + apiKey: apiKey + } + }; + await storeAuthCredentials(credentials); + + return { token: apiKey }; + + } catch (error) { + console.error('API key validation failed:', error); + if (error instanceof Error) { + if (error.message.includes('401') || error.message.includes('authentication')) { + throw new Error('Invalid API key. Please check your key and try again.'); + } else if (error.message.includes('403')) { + throw new Error('Your API key does not have access to Claude. Please check your Anthropic account.'); + } else if (error.message.includes('rate_limit')) { + throw new Error('Too many requests. Please wait a moment and try again.'); + } + throw new Error('Connection failed. Please check your internet connection and ensure your API key is valid.'); + } + throw new Error('Validation failed. Please try again.'); + } +}; diff --git a/workspaces/ballerina/ballerina-extension/src/views/bbe/activator.ts b/workspaces/ballerina/ballerina-extension/src/views/bbe/activator.ts index 34cc31b9d17..eda692f24a5 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/bbe/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/bbe/activator.ts @@ -20,7 +20,7 @@ import { commands, window, Uri, ViewColumn, ExtensionContext, WebviewPanel, work import { join } from 'path'; import { render } from './renderer'; import { ExtendedLangClient } from '../../core/extended-language-client'; -import { ballerinaExtInstance, BallerinaExtension } from '../../core'; +import { BallerinaExtension } from '../../core'; import { getCommonWebViewOptions } from '../../utils'; import { TM_EVENT_OPEN_EXAMPLES, CMP_EXAMPLES_VIEW, sendTelemetryEvent, sendTelemetryException } from '../../features/telemetry'; import { PALETTE_COMMANDS } from '../../features/project'; diff --git a/workspaces/ballerina/ballerina-extension/src/views/graphql/graphqlViewPanel.ts b/workspaces/ballerina/ballerina-extension/src/views/graphql/graphqlViewPanel.ts index dcc215afe45..bf9e35624e7 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/graphql/graphqlViewPanel.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/graphql/graphqlViewPanel.ts @@ -19,11 +19,10 @@ import { ViewColumn, window, WebviewPanel, Uri } from "vscode"; import { getCommonWebViewOptions } from '../../utils'; import { render } from './render'; -import { ballerinaExtInstance } from "../../core"; +import { extension } from "../../BalExtensionContext"; import { SwaggerServer } from "./server"; import { CMP_TRYIT_GRAPHQL_VIEW, sendTelemetryEvent, TM_EVENT_GRAPHQL_RUN } from "../../features/telemetry"; import path from "path"; -import { extension } from "../../BalExtensionContext"; let graphqlViewPanel: WebviewPanel | undefined; @@ -81,5 +80,5 @@ export async function showGraphqlView(serviceAPI: string): Promise { } } //editor-lowcode-code-tryit - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_GRAPHQL_RUN, CMP_TRYIT_GRAPHQL_VIEW); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_GRAPHQL_RUN, CMP_TRYIT_GRAPHQL_VIEW); } diff --git a/workspaces/ballerina/ballerina-extension/src/views/notebook/notebookSerializer.ts b/workspaces/ballerina/ballerina-extension/src/views/notebook/notebookSerializer.ts index 52e554af5b8..d287599c6ad 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/notebook/notebookSerializer.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/notebook/notebookSerializer.ts @@ -21,7 +21,7 @@ import { CancellationToken, NotebookCellData, NotebookCellExecutionSummary, NotebookCellKind, NotebookCellOutput, NotebookCellOutputItem, NotebookData, NotebookSerializer } from 'vscode'; -import { ballerinaExtInstance } from "../../core"; +import { extension } from "../../BalExtensionContext"; import { CMP_NOTEBOOK, sendTelemetryEvent, TM_EVENT_CLOSE_NOTEBOOK, TM_EVENT_OPEN_NOTEBOOK } from "../../features/telemetry"; /** @@ -47,7 +47,7 @@ interface RawCellOutput { */ export class BallerinaNotebookSerializer implements NotebookSerializer { async deserializeNotebook(content: Uint8Array, _token: CancellationToken): Promise { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_OPEN_NOTEBOOK, CMP_NOTEBOOK); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_OPEN_NOTEBOOK, CMP_NOTEBOOK); var contents = new TextDecoder().decode(content); let raw: RawNotebookCell[]; @@ -71,7 +71,7 @@ export class BallerinaNotebookSerializer implements NotebookSerializer { } async serializeNotebook(data: NotebookData, _token: CancellationToken): Promise { - sendTelemetryEvent(ballerinaExtInstance, TM_EVENT_CLOSE_NOTEBOOK, CMP_NOTEBOOK); + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_CLOSE_NOTEBOOK, CMP_NOTEBOOK); let contents: RawNotebookCell[] = []; for (const cell of data.cells) { contents.push({ diff --git a/workspaces/ballerina/ballerina-extension/src/views/visualizer/activate.ts b/workspaces/ballerina/ballerina-extension/src/views/visualizer/activate.ts index 3c38dc1d6e1..557e5d48bd1 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/visualizer/activate.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/visualizer/activate.ts @@ -20,7 +20,7 @@ import * as vscode from 'vscode'; import { PALETTE_COMMANDS } from '../../features/project/cmds/cmd-runner'; import { StateMachine, openView } from '../../stateMachine'; import { extension } from '../../BalExtensionContext'; -import { BI_COMMANDS, EVENT_TYPE, MACHINE_VIEW, SHARED_COMMANDS } from '@wso2/ballerina-core'; +import { BI_COMMANDS, EVENT_TYPE, MACHINE_VIEW, NodePosition, SHARED_COMMANDS } from '@wso2/ballerina-core'; import { ViewColumn } from 'vscode'; import { buildProjectArtifactsStructure } from '../../utils/project-artifacts'; @@ -46,9 +46,20 @@ export function activateSubscriptions() { // <------------- Shared Commands ------------> context.subscriptions.push( vscode.commands.registerCommand(SHARED_COMMANDS.SHOW_VISUALIZER, (path: string | vscode.Uri, position, resetHistory = false) => { - const documentPath = path ? (typeof path === "string" ? path : path.fsPath) : ""; + // Check if position is a LineRange object (has 'start' and 'end' keys) + let nodePosition: NodePosition = position; + if (position && typeof position === "object" && "start" in position && "end" in position) { + // Convert LineRange to NodePosition + nodePosition = { + startLine: position.start.line, + startColumn: position.start.character, + endLine: position.end.line, + endColumn: position.end.character + }; + } + const documentPath = path ? (typeof path === "string" ? vscode.Uri.parse(path).fsPath : path.fsPath) : ""; if (StateMachine.langClient() && StateMachine.context().isBISupported) { // This is added since we can't fetch new diagram data without bi supported ballerina version - openView(EVENT_TYPE.OPEN_VIEW, { documentUri: documentPath || vscode.window.activeTextEditor?.document.uri.fsPath, position: position }, resetHistory); + openView(EVENT_TYPE.OPEN_VIEW, { documentUri: documentPath || vscode.window.activeTextEditor?.document.uri.fsPath, position: nodePosition }, resetHistory); } else { openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.BallerinaUpdateView }); // Redirect user to the ballerina update available page } 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 05bd6317c10..b21c5b0f190 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 @@ -20,10 +20,7 @@ import * as assert from "assert"; import * as fs from "fs"; import { ChatNotify, GenerateCodeRequest } from "@wso2/ballerina-core"; import { CopilotEventHandler } from "../../../../src/features/ai/service/event"; -import { commands, Uri, workspace } from "vscode"; -import { ExtendedLangClient } from "../../../../src/core/extended-language-client"; -import { ballerinaExtInstance } from "../../../../src/core/extension"; -import { getServerOptions } from "../../../../src/utils/server/server"; +import { Uri, workspace } from "vscode"; const RESOURCES_PATH = path.resolve(__dirname, "../../../../../test/ai/evals/code/resources"); diff --git a/workspaces/ballerina/ballerina-extension/test/core/ballerina-extention.test.ts b/workspaces/ballerina/ballerina-extension/test/core/ballerina-extention.test.ts index 029fa2c7cfc..1f26aac7cf4 100644 --- a/workspaces/ballerina/ballerina-extension/test/core/ballerina-extention.test.ts +++ b/workspaces/ballerina/ballerina-extension/test/core/ballerina-extention.test.ts @@ -21,7 +21,7 @@ import * as assert from 'assert'; import * as fs from 'fs'; // You can import and use all API from the 'vscode' module // as well as import your extension to test it -import { ballerinaExtInstance } from '../../src/core'; +import { extension } from '../../src/BalExtensionContext'; import { getBallerinaHome, getBallerinaVersion } from '../test-util'; // Ballerina tools distribution will be copied to following location by maven @@ -32,14 +32,14 @@ const testBallerinaVersion = getBallerinaVersion(); suite("Ballerina Extension Core Tests", function () { test("Test autoDetectBallerinaHome", function () { // Following should not throw an error all times. - const { home } = ballerinaExtInstance.autoDetectBallerinaHome(); + const { home } = extension.ballerinaExtInstance.autoDetectBallerinaHome(); if (home) { assert.equal(fs.existsSync(home), true); } }); test("Test getBallerinaVersion", function () { - ballerinaExtInstance.getBallerinaVersion(testBallerinaHome, true).then(detected => { + extension.ballerinaExtInstance.getBallerinaVersion(testBallerinaHome, true).then(detected => { const regex = /(s|S)wan( |-)(l|L)ake/g; if (detected.match(regex) && testBallerinaHome.match(regex)) { let detectedLowerCase = detected.toLowerCase(); 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 c00f42b7238..fd11ab78384 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 @@ -32,7 +32,7 @@ import { Connectors, Completion, Diagnostics, SyntaxTree} from '@wso2/ballerina-core'; import { ExtendedLangClient } from '../../src/core/extended-language-client'; -import { ballerinaExtInstance } from '../../src/core/extension'; +import { extension } from '../../src/BalExtensionContext'; const PROJECT_ROOT = join(__dirname, '..', '..', '..', 'test', 'data'); @@ -44,7 +44,7 @@ suite.skip("Language Server Tests", function () { langClient = new ExtendedLangClient( 'ballerina-vscode', 'Ballerina LS Client', - getServerOptions(ballerinaExtInstance), + getServerOptions(extension.ballerinaExtInstance), { documentSelector: [{ scheme: 'file', language: 'ballerina' }] }, undefined, false diff --git a/workspaces/ballerina/ballerina-rpc-client/src/BallerinaRpcClient.ts b/workspaces/ballerina/ballerina-rpc-client/src/BallerinaRpcClient.ts index 6719b9c9839..96ac9561a9a 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/BallerinaRpcClient.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/BallerinaRpcClient.ts @@ -48,7 +48,8 @@ import { ColorThemeKind, currentThemeChanged, ChatNotify, - onChatNotify + onChatNotify, + AIMachineSendableEvent } from "@wso2/ballerina-core"; import { LangClientRpcClient } from "./rpc-clients/lang-client/rpc-client"; import { LibraryBrowserRpcClient } from "./rpc-clients/library-browser/rpc-client"; @@ -182,7 +183,7 @@ export class BallerinaRpcClient { this.messenger.onNotification(aiStateChanged, callback); } - sendAIStateEvent(event: AIMachineEventType) { + sendAIStateEvent(event: AIMachineEventType | AIMachineSendableEvent) { this.messenger.sendRequest(sendAIStateEvent, HOST_EXTENSION, event); } diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts index 41920c69bf2..67a8dd8ab3c 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts @@ -19,8 +19,8 @@ */ import { AIAgentAPI, - AIAgentOrgRequest, - AIAgentOrgResponse, + AiModuleOrgRequest, + AiModuleOrgResponse, AIAgentRequest, AIAgentResponse, AIAgentToolsUpdateRequest, @@ -34,7 +34,7 @@ import { AIToolsResponse, createAIAgent, genTool, - getAgentOrg, + getAiModuleOrg, getAllAgents, getAllMemoryManagers, getAllModels, @@ -59,8 +59,8 @@ export class AiAgentRpcClient implements AIAgentAPI { this._messenger = messenger; } - getAgentOrg(params: AIAgentOrgRequest): Promise { - return this._messenger.sendRequest(getAgentOrg, HOST_EXTENSION, params); + getAiModuleOrg(params: AiModuleOrgRequest): Promise { + return this._messenger.sendRequest(getAiModuleOrg, HOST_EXTENSION, params); } getAllAgents(params: AINodesRequest): Promise { 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 ed59c8fc1ff..7ca25fb3e75 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 @@ -41,7 +41,6 @@ import { BISearchRequest, BISearchResponse, BISourceCodeRequest, - BISourceCodeResponse, BreakpointRequest, BuildMode, ClassFieldModifierRequest, @@ -128,7 +127,11 @@ import { generateOpenApiClient, getAiSuggestions, getAllImports, + getAvailableEmbeddingProviders, + getAvailableModelProviders, getAvailableNodes, + getAvailableVectorKnowledgeBases, + getAvailableVectorStores, getBreakpointInfo, getConfigVariableNodeTemplate, getConfigVariables, @@ -210,6 +213,22 @@ export class BiDiagramRpcClient implements BIDiagramAPI { return this._messenger.sendRequest(getAvailableNodes, HOST_EXTENSION, params); } + getAvailableModelProviders(params: BIAvailableNodesRequest): Promise { + return this._messenger.sendRequest(getAvailableModelProviders, HOST_EXTENSION, params); + } + + getAvailableVectorStores(params: BIAvailableNodesRequest): Promise { + return this._messenger.sendRequest(getAvailableVectorStores, HOST_EXTENSION, params); + } + + getAvailableEmbeddingProviders(params: BIAvailableNodesRequest): Promise { + return this._messenger.sendRequest(getAvailableEmbeddingProviders, HOST_EXTENSION, params); + } + + getAvailableVectorKnowledgeBases(params: BIAvailableNodesRequest): Promise { + return this._messenger.sendRequest(getAvailableVectorKnowledgeBases, HOST_EXTENSION, params); + } + getEnclosedFunction(params: BIGetEnclosedFunctionRequest): Promise { return this._messenger.sendRequest(getEnclosedFunction, HOST_EXTENSION, params); } @@ -265,7 +284,7 @@ export class BiDiagramRpcClient implements BIDiagramAPI { getConfigVariablesV2(): Promise { return this._messenger.sendRequest(getConfigVariablesV2, HOST_EXTENSION); } - + updateConfigVariablesV2(params: UpdateConfigVariableRequestV2): Promise { return this._messenger.sendRequest(updateConfigVariablesV2, HOST_EXTENSION, params); } diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/service-designer/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/service-designer/rpc-client.ts index cd8e5c8338f..0f4d33beae2 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/service-designer/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/service-designer/rpc-client.ts @@ -20,6 +20,8 @@ import { ExportOASRequest, ExportOASResponse, + FunctionFromSourceRequest, + FunctionFromSourceResponse, FunctionModelRequest, FunctionModelResponse, FunctionSourceCodeRequest, @@ -48,6 +50,7 @@ import { addResourceSourceCode, addServiceSourceCode, exportOASFile, + getFunctionFromSource, getFunctionModel, getHttpResourceModel, getListenerModel, @@ -107,6 +110,10 @@ export class ServiceDesignerRpcClient implements ServiceDesignerAPI { return this._messenger.sendRequest(getFunctionModel, HOST_EXTENSION, params); } + getFunctionFromSource(params: FunctionFromSourceRequest): Promise { + return this._messenger.sendRequest(getFunctionFromSource, HOST_EXTENSION, params); + } + addServiceSourceCode(params: ServiceSourceCodeRequest): Promise { return this._messenger.sendRequest(addServiceSourceCode, HOST_EXTENSION, params); } 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 9b30b5fc9a9..cc18ba4506b 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx @@ -351,7 +351,6 @@ export const Form = forwardRef((props: FormProps, ref) => { const { infoLabel, formFields, - projectPath, selectedNode, submitText, cancelText, @@ -361,7 +360,6 @@ export const Form = forwardRef((props: FormProps, ref) => { onCancelForm, oneTimeForm, openRecordEditor, - openView, openSubPanel, subPanelView, expressionEditor, @@ -393,7 +391,7 @@ export const Form = forwardRef((props: FormProps, ref) => { setValue, setError, clearErrors, - formState: { isValidating, errors, isDirty, isValid: isFormValid, dirtyFields }, + formState: { isValidating, errors, dirtyFields }, } = useForm(); const [showAdvancedOptions, setShowAdvancedOptions] = useState(false); @@ -583,7 +581,6 @@ export const Form = forwardRef((props: FormProps, ref) => { const variableField = formFields.find((field) => field.key === "variable"); const typeField = formFields.find((field) => field.key === "type"); const targetTypeField = formFields.find((field) => field.codedata?.kind === "PARAM_FOR_TYPE_INFER"); - const dataMapperField = formFields.find((field) => field.label.includes("Data mapper")); const hasParameters = hasRequiredParameters(formFields, selectedNode) || hasOptionalParameters(formFields); const contextValue: FormContext = { 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 bd9195d95ac..d1e544fc444 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx @@ -201,6 +201,42 @@ namespace S { width: 100%; margin-top: 20px; `; + + export const AdvancedSubcategoryContainer = styled.div` + display: flex; + flex-direction: column; + width: 100%; + margin-top: 8px; + `; + + export const AdvancedSubcategoryHeader = styled.div` + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + width: 100%; + padding: 4px 12px; + border-radius: 5px; + cursor: pointer; + transition: all 0.2s ease; + border: 1px solid transparent; + + &:hover { + background-color: ${ThemeColors.PRIMARY_CONTAINER}; + } + + &:hover > div:first-of-type { + opacity: 1; + color: ${ThemeColors.PRIMARY}; + } + `; + + export const AdvancedSubTitle = styled.div` + font-size: 12px; + opacity: 0.7; + color: ${ThemeColors.ON_SURFACE_VARIANT}; + transition: all 0.2s ease; + `; } interface NodeListProps { @@ -211,6 +247,8 @@ interface NodeListProps { onSearchTextChange?: (text: string) => void; onAddConnection?: () => void; onAddFunction?: () => void; + onAdd?: () => void; + addButtonLabel?: string; onBack?: () => void; onClose?: () => void; searchPlaceholder?: string; @@ -225,21 +263,27 @@ export function NodeList(props: NodeListProps) { onSearchTextChange, onAddConnection, onAddFunction, + onAdd, + addButtonLabel, onBack, onClose, - searchPlaceholder + searchPlaceholder, } = props; const [searchText, setSearchText] = useState(""); const [showGeneratePanel, setShowGeneratePanel] = useState(false); const [isSearching, setIsSearching] = useState(false); + const [expandedMoreSections, setExpandedMoreSections] = useState>({}); const { rpcClient } = useRpcContext(); const [isNPSupported, setIsNPSupported] = useState(false); useEffect(() => { - rpcClient.getCommonRpcClient().isNPSupported().then((supported) => { - setIsNPSupported(supported); - }); + rpcClient + .getCommonRpcClient() + .isNPSupported() + .then((supported) => { + setIsNPSupported(supported); + }); }, []); useEffect(() => { @@ -264,6 +308,13 @@ export function NodeList(props: NodeListProps) { setIsSearching(false); }, [categories]); + const toggleMoreSection = (sectionKey: string) => { + setExpandedMoreSections((prev) => ({ + ...prev, + [sectionKey]: !prev[sectionKey], + })); + }; + const handleAddNode = (node: Node, category?: string) => { onSelect(node.id, { node: node.metadata, category }); }; @@ -280,54 +331,108 @@ export function NodeList(props: NodeListProps) { } }; - const getNodesContainer = (nodes: Node[]) => ( - - {nodes.map((node, index) => { - if (["NP_FUNCTION"].includes(node.id) && !isNPSupported) { - return; - } + const handleAdd = () => { + if (onAdd) { + onAdd(); + } + }; - return ( - handleAddNode(node)} - title={node.label} - > - {node.icon || } - { - if (el && el.scrollWidth > el.clientWidth) { - el.style.fontSize = "13px"; - el.style.wordBreak = "break-word"; - el.style.whiteSpace = "normal"; - } - }} - > - {node.label} - - - ); - })} - - ); + const getNodesContainer = (items: (Node | Category)[], parentCategoryTitle?: string) => { + const nodes = items.filter((item): item is Node => "id" in item && !("title" in item)); + const subcategories = items.filter((item): item is Category => "title" in item && "items" in item); + + return ( + <> + + {nodes.map((node, index) => { + if (["NP_FUNCTION"].includes(node.id) && !isNPSupported) { + return; + } + + return ( + handleAddNode(node)} + title={node.label} + > + {node.icon || } + { + if (el && el.scrollWidth > el.clientWidth) { + el.style.fontSize = "13px"; + el.style.wordBreak = "break-word"; + el.style.whiteSpace = "normal"; + } + }} + > + {node.label} + + + ); + })} + + {subcategories.map((subcategory, index) => { + const isMoreSubcategory = subcategory.title === "More"; + + if (isMoreSubcategory) { + const sectionKey = `${parentCategoryTitle}-${subcategory.title}`; + const isExpanded = expandedMoreSections[sectionKey] || searchText?.length > 0; + + return ( + + toggleMoreSection(sectionKey)}> + {subcategory.title} + + + {isExpanded &&
{getNodesContainer(subcategory.items, parentCategoryTitle)}
} +
+ ); + } else { + return ( + + + + {subcategory.title} + + + {subcategory.items.length > 0 && + getNodesContainer(subcategory.items, parentCategoryTitle)} + + ); + } + })} + + ); + }; const getConnectionContainer = (categories: Category[]) => ( {categories.map((category, index) => ( - // 0} onSelect={handleAddNode} /> - // ))} ); - const getCategoryContainer = (groups: Category[], isSubCategory = false) => { + const getCategoryContainer = (groups: Category[], isSubCategory = false, parentCategoryTitle?: string) => { + const callFunctionNode = groups + .flatMap((group) => group?.items) + .find((item) => "id" in item && item.id === "FUNCTION"); const content = ( <> {groups.map((group, index) => { @@ -336,14 +441,19 @@ export function NodeList(props: NodeListProps) { const isDataMapperCategory = isProjectFunctionsCategory && title === "Data Mappers"; const isAgentCategory = group.title === "Agents"; const isNpFunctionCategory = isProjectFunctionsCategory && title === "Natural Functions"; - if ( - (!group || group.items.length === 0) && - !isConnectionCategory && - !isProjectFunctionsCategory && - !isAgentCategory && - !isNpFunctionCategory - ) { - return null; + const isModelProviderCategory = group.title === "Model Providers"; + // Hide categories that don't have items, except for special categories that can add items + if (!group || group.items.length === 0) { + // Only show empty categories if they have add functionality + if ( + !isConnectionCategory && + !isProjectFunctionsCategory && + !isAgentCategory && + !isNpFunctionCategory && + !isModelProviderCategory + ) { + return null; + } } if (searchText && group.items.length === 0) { return null; @@ -352,6 +462,7 @@ export function NodeList(props: NodeListProps) { if (!onAddFunction && isProjectFunctionsCategory && group.items?.length === 0) { return null; } + return ( @@ -363,49 +474,47 @@ export function NodeList(props: NodeListProps) { {!isSubCategory && ( <> {group.title} - {(isConnectionCategory || isProjectFunctionsCategory || isAgentCategory) && ( - <> - {onAddConnection && isConnectionCategory && ( + <> + {onAddConnection && isConnectionCategory && ( + + )} + {onAddFunction && isDataMapperCategory && ( + + )} + {onAddFunction && + isProjectFunctionsCategory && + !isDataMapperCategory && + !isNpFunctionCategory && ( - )} - {onAddFunction && isDataMapperCategory && ( - )} - {onAddFunction && - isProjectFunctionsCategory && - !isDataMapperCategory && - !isNpFunctionCategory && ( - - )} - {onAddFunction && isNpFunctionCategory && ( - - )} - - )} + {onAddFunction && isNpFunctionCategory && ( + + )} + )} @@ -435,21 +544,53 @@ export function NodeList(props: NodeListProps) { }`} )} - {group.items.length > 0 && "id" in group.items.at(0) - ? getNodesContainer(group.items as Node[]) + {onAdd && addButtonLabel && group.items.length === 0 && !searchText && !isSearching && ( + + + {addButtonLabel} + + )} + {group.items.length > 0 && + (group.items.some((item) => "id" in item && !("title" in item)) || + group.items.some((item) => "title" in item && "items" in item)) + ? getNodesContainer( + group.items as (Node | Category)[], + !isSubCategory ? group.title : parentCategoryTitle + ) : (onAddConnection && isConnectionCategory) || - (onAddFunction && isProjectFunctionsCategory) + (onAddFunction && isProjectFunctionsCategory) || + (onAdd && isModelProviderCategory) ? getConnectionContainer(group.items as Category[]) - : getCategoryContainer(group.items as Category[], true)} + : getCategoryContainer( + group.items as Category[], + true, + !isSubCategory ? group.title : parentCategoryTitle + )} ); })} + {callFunctionNode && ( + + handleAddNode(callFunctionNode as Node)}> + Show More Functions + + + + )} ); - // Check if the content is empty const isEmpty = React.Children.toArray(content.props.children).every((child) => child === null); - return isEmpty ?
No matching results found
: content; }; @@ -457,13 +598,23 @@ export function NodeList(props: NodeListProps) { const filterItems = (items: Item[]): Item[] => { return items .map((item) => { - if ("items" in item) { + if ("items" in item && "title" in item) { + // This is a Category (like "More") const filteredItems = filterItems(item.items); - return { - ...item, - items: filteredItems, - }; - } else { + const categoryMatches = + item.title.toLowerCase().includes(searchText.toLowerCase()) || + (item.description?.toLowerCase() || "").includes(searchText.toLowerCase()); + + // Keep the category if it matches or has matching items + if (categoryMatches || filteredItems.length > 0) { + return { + ...item, + items: filteredItems, + }; + } + return null; + } else if ("id" in item && "label" in item) { + // This is a Node const lowerCaseTitle = item.label.toLowerCase(); const lowerCaseDescription = item.description?.toLowerCase() || ""; const lowerCaseSearchText = searchText.toLowerCase(); @@ -473,9 +624,11 @@ export function NodeList(props: NodeListProps) { ) { return item; } + return null; } + return null; }) - .filter(Boolean); + .filter(Boolean) as Item[]; }; const filteredCategories = cloneDeep(categories).map((category) => { @@ -526,7 +679,7 @@ export function NodeList(props: NodeListProps) { { + // if field.key is "modelType" and value is not set and default value set. then setValue to default value initially + if (field.key === "modelType" && field.value === undefined && (field.defaultValue || field.placeholder)) { + setValue(field.key, field.defaultValue || field.placeholder); + } + }, [field.defaultValue, field.placeholder]); + // HACK: create values for Scope field if (field.key === "scope") { field.items = ["Global", "Local"]; diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index 5ef7b8c56f6..6c40d46cc4d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -28,13 +28,10 @@ import { import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { Global, css } from "@emotion/react"; import styled from "@emotion/styled"; -import { NavigationBar } from "./components/NavigationBar"; import { LoadingRing } from "./components/Loader"; import { DataMapper } from "./views/DataMapper"; import { ERDiagram } from "./views/ERDiagram"; import { GraphQLDiagram } from "./views/GraphQLDiagram"; -import { SequenceDiagram } from "./views/SequenceDiagram"; -import { Overview } from "./views/Overview"; import { ServiceDesigner } from "./views/BI/ServiceDesigner"; import { WelcomeView, @@ -46,7 +43,7 @@ import { TestFunctionForm } from "./views/BI"; import { handleRedo, handleUndo } from "./utils/utils"; -import { FunctionDefinition, ServiceDeclaration } from "@wso2/syntax-tree"; +import { FunctionDefinition } from "@wso2/syntax-tree"; import { URI, Utils } from "vscode-uri"; import { Typography } from "@wso2/ui-toolkit"; import { PanelType, useVisualizerContext } from "./Context"; @@ -177,6 +174,7 @@ const MainPanel = () => { const [navActive, setNavActive] = useState(true); const [showHome, setShowHome] = useState(true); const [popupState, setPopupState] = useState("initialize"); + const [breakpointState, setBreakpointState] = useState(false); rpcClient?.onStateChanged((newState: MachineStateValue) => { if (typeof newState === "object" && "viewActive" in newState && newState.viewActive === "viewReady") { @@ -189,7 +187,9 @@ const MainPanel = () => { }); rpcClient?.onBreakpointChanges((state: boolean) => { - fetchContext(); + setBreakpointState(pre => { + return !pre; + }); console.log("Breakpoint changes"); }); @@ -269,14 +269,45 @@ const MainPanel = () => { />); break; case MACHINE_VIEW.BIDiagram: - setViewComponent( - - ); + + rpcClient.getLangClientRpcClient().getSTByRange({ + documentIdentifier: { + uri: URI.file(value.documentUri).toString(), + }, + lineRange: { + start: { + line: value?.position?.startLine, + character: value?.position?.startColumn, + }, + end: { + line: value?.position?.endLine, + character: value?.position?.endColumn, + }, + }, + }).then((st) => { + setViewComponent( + + ); + }).catch((error) => { + console.error("Error fetching ST:", error); + // Fallback to render without waiting + setViewComponent( + + ); + }); break; case MACHINE_VIEW.ERDiagram: setViewComponent(); @@ -319,11 +350,6 @@ const MainPanel = () => { case MACHINE_VIEW.GraphQLDiagram: setViewComponent(); break; - case MACHINE_VIEW.SequenceDiagram: - setViewComponent( - - ); - break; case MACHINE_VIEW.BallerinaUpdateView: setNavActive(false); setViewComponent(); @@ -382,7 +408,7 @@ const MainPanel = () => { case MACHINE_VIEW.EditConnectionWizard: setViewComponent( ); @@ -409,6 +435,16 @@ const MainPanel = () => { /> ); break; + case MACHINE_VIEW.AddConfigVariables: + setViewComponent( + + ); + break; default: setNavActive(false); setViewComponent(); @@ -419,7 +455,7 @@ const MainPanel = () => { useEffect(() => { fetchContext(); - }, []); + }, [breakpointState]); useEffect(() => { const mouseTrapClient = KeyboardNavigationManager.getClient(); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/AIPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/AIPanel.tsx index 699369b2cc4..5bf1f5a2383 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/AIPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/AIPanel.tsx @@ -16,16 +16,16 @@ * under the License. */ -import React, { useEffect, useState } from 'react'; -import { AIMachineStateValue } from '@wso2/ballerina-core'; -import { useRpcContext } from '@wso2/ballerina-rpc-client'; -import { VSCodeProgressRing } from '@vscode/webview-ui-toolkit/react'; -import styled from '@emotion/styled'; -import AIChat from './components/AIChat'; -import { DisabledWindow } from './DisabledSection'; -import LoginPanel from './LoginPanel'; -import { LoadingRing } from '../../components/Loader'; -import WaitingForLogin from './WaitingForLoginSection'; +import React, { useEffect, useState } from "react"; +import { AIMachineStateValue } from "@wso2/ballerina-core"; +import { useRpcContext } from "@wso2/ballerina-rpc-client"; +import { VSCodeProgressRing } from "@vscode/webview-ui-toolkit/react"; +import styled from "@emotion/styled"; +import AIChat from "./components/AIChat"; +import { DisabledWindow } from "./DisabledSection"; +import LoginPanel from "./LoginPanel"; +import { LoadingRing } from "../../components/Loader"; +import WaitingForLogin from "./WaitingForLoginSection"; const LoaderWrapper = styled.div` display: flex; @@ -50,43 +50,68 @@ const AIPanel = (props: { state: AIMachineStateValue }) => { fetchContext(); }, [props.state]); + const renderUnknownState = (state: any) => { + console.warn("Unknown AI Machine State:", state); + return

Unknown state: {JSON.stringify(state)}

; + }; + const fetchContext = () => { - rpcClient.getAiPanelRpcClient().getAIMachineSnapshot().then((snapshot) => { - switch (snapshot.state) { - case "Initialize": - setViewComponent(); - break; - case "Unauthenticated": - setViewComponent(); - break; - case "Authenticating": - setViewComponent(); - break; - case "Authenticated": - setViewComponent(); - break; - case "Disabled": - setViewComponent(); - break; - default: - setViewComponent(

{snapshot.state}

); - } - }); - } + rpcClient + .getAiPanelRpcClient() + .getAIMachineSnapshot() + .then((snapshot) => { + console.log("AI Machine Snapshot:", snapshot); + let component: React.ReactNode; + + if (typeof snapshot.state === "string") { + // Handle primary states + const primaryStateComponents = { + Initialize: , + Unauthenticated: , + Authenticated: , + Disabled: , + }; + component = primaryStateComponents[snapshot.state] || renderUnknownState(snapshot.state); + } else if (typeof snapshot.state === "object" && snapshot.state.Authenticating) { + // Handle hierarchical Authenticating substates + const subState = snapshot.state.Authenticating; + + if (subState === "determineFlow") { + component = ; + } else if (["ssoFlow", "apiKeyFlow", "validatingApiKey"].includes(subState)) { + component = ( + + ); + } else { + component = renderUnknownState(snapshot.state); + } + } else { + component = renderUnknownState(snapshot.state); + } + + setViewComponent(component); + }); + }; return ( -
+
{!viewComponent ? ( - ) :
- {viewComponent} -
} + ) : ( +
{viewComponent}
+ )}
); }; -export default AIPanel; +export default AIPanel; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/LoginPanel/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/LoginPanel/index.tsx index ff9170a53a6..93c958d653e 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/LoginPanel/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/LoginPanel/index.tsx @@ -75,6 +75,35 @@ const PostLoginSection = styled.div` display: flex; flex-direction: column; gap: 8px; + margin-bottom: 16px; +`; + +const Divider = styled.div` + display: flex; + align-items: center; + color: var(--vscode-widget-border); + font-size: 12px; + width: 100%; + &::before, + &::after { + content: ""; + flex: 1; + border-bottom: 1px solid var(--vscode-widget-border); + margin: 0 8px; + } +`; + +const TextButton = styled.button` + background: none; + border: none; + color: var(--vscode-textLink-foreground); + font-size: 13px; + cursor: pointer; + padding: 0; + margin-top: -6px; + &:hover { + text-decoration: underline; + } `; const LegalNotice: React.FC = () => { @@ -106,6 +135,10 @@ const LoginPanel: React.FC = () => { rpcClient.sendAIStateEvent(AIMachineEventType.LOGIN); }; + const handleAnthropicKeyClick = () => { + rpcClient.sendAIStateEvent(AIMachineEventType.AUTH_WITH_API_KEY); + }; + return ( @@ -132,6 +165,8 @@ const LoginPanel: React.FC = () => { Login to BI Copilot + or + Enter your Anthropic API Key ); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/WaitingForLoginSection/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/WaitingForLoginSection/index.tsx index aae74f8704f..07b56294e50 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/WaitingForLoginSection/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/WaitingForLoginSection/index.tsx @@ -17,10 +17,13 @@ */ import styled from "@emotion/styled"; -import { AIMachineEventType } from '@wso2/ballerina-core'; -import { useRpcContext } from '@wso2/ballerina-rpc-client'; +import { AIMachineEventType, LoginMethod } from "@wso2/ballerina-core"; +import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { AlertBox } from "../AlertBox"; +import { useState } from "react"; +import { Codicon } from "@wso2/ui-toolkit"; +import { VSCodeButton, VSCodeTextField } from "@vscode/webview-ui-toolkit/react"; const Container = styled.div` display: flex; @@ -30,13 +33,236 @@ const Container = styled.div` gap: 8px; `; -const WaitingForLogin = () => { +// AlertBox-style container for consistency +const AlertContainer = styled.div<{ variant: "primary" | "secondary" }>` + border-left: 0.3rem solid + var( + ${(props: { variant: string }) => + props.variant === "secondary" ? "--vscode-editorWidget-border" : "--vscode-focusBorder"} + ); + background: var( + ${(props: { variant: string }) => + props.variant === "secondary" ? "transparent" : "--vscode-inputValidation-infoBackground"} + ); + display: flex; + flex-direction: column; + align-items: flex-start; + padding: 1rem; + gap: 12px; + margin-bottom: 15px; + width: -webkit-fill-available; +`; + +const Title = styled.div` + color: var(--vscode-foreground); + font-weight: 500; +`; + +const SubTitle = styled.div` + color: var(--vscode-descriptionForeground); + font-size: 12px; + font-weight: 400; + line-height: 1.5; +`; + +const InputContainer = styled.div` + display: flex; + flex-direction: column; + gap: 4px; + padding: 2px 4px; + border: 1px solid var(--vscode-editorWidget-border); + border-radius: 4px; + background-color: var(--vscode-editor-background); + color: var(--vscode-editor-foreground); + width: 100%; + box-sizing: border-box; + min-height: 32px; + &:focus-within { + border-color: var(--vscode-button-background); + } +`; + +const InputRow = styled.div` + display: flex; + align-items: center; + width: 100%; + min-height: 28px; + gap: 8px; +`; + +const StyledTextField = styled(VSCodeTextField)` + flex: 1; + border: none; + background: transparent; + height: 28px; + min-height: 28px; + display: flex; + align-items: center; + width: 100%; + &::part(control) { + border: none !important; + background: transparent !important; + padding: 0 4px; + outline: none !important; + box-shadow: none !important; + height: 28px !important; + min-height: 28px !important; + line-height: 28px !important; + display: flex !important; + align-items: center !important; + width: 100% !important; + flex: 1 !important; + } + &::part(control):focus { + outline: none !important; + box-shadow: none !important; + border: none !important; + } + &::part(root) { + border: none !important; + background: transparent !important; + height: 28px !important; + min-height: 28px !important; + display: flex !important; + align-items: center !important; + width: 100% !important; + flex: 1 !important; + } +`; + +const EyeButton = styled.button` + width: 24px; + height: 24px; + background-color: transparent; + color: var(--vscode-icon-foreground); + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 16px; + display: flex; + align-items: center; + justify-content: center; + transition: background-color 0.2s; + box-sizing: border-box; + flex-shrink: 0; + &:hover { + background-color: var(--vscode-toolbar-hoverBackground); + } + &:active { + background-color: var(--vscode-toolbar-activeBackground); + } +`; + +const ButtonContainer = styled.div` + display: flex; + gap: 8px; + align-self: flex-start; +`; + +const ErrorMessage = styled.div` + display: flex; + align-items: flex-start; + gap: 8px; + color: var(--vscode-errorForeground); + font-size: 12px; + font-weight: 400; + line-height: 1.5; + width: 100%; +`; + +interface WaitingForLoginProps { + loginMethod?: LoginMethod; + isValidating?: boolean; + errorMessage?: string; +} + +const WaitingForLogin = ({ loginMethod, isValidating = false, errorMessage }: WaitingForLoginProps) => { const { rpcClient } = useRpcContext(); + const [apiKey, setApiKey] = useState(""); + const [showApiKey, setShowApiKey] = useState(false); const cancelLogin = () => { rpcClient.sendAIStateEvent(AIMachineEventType.CANCEL_LOGIN); }; + const connectWithKey = () => { + if (apiKey.trim()) { + // Send the API key to the state machine for validation + rpcClient.sendAIStateEvent({ + type: AIMachineEventType.SUBMIT_API_KEY, + payload: { apiKey: apiKey.trim() }, + }); + } + }; + + const handleApiKeyChange = (e: any) => { + setApiKey(e.target.value); + }; + + const toggleApiKeyVisibility = () => { + setShowApiKey(!showApiKey); + }; + + if (loginMethod === LoginMethod.ANTHROPIC_KEY) { + return ( + + + Connect with Anthropic API Key + + Enter your Anthropic API key to connect to the AI service. Your API key will be securely stored + and used for authentication. + + + + + + + + + + + + {errorMessage && ( + + + {errorMessage} + + )} + + + + {isValidating ? "Validating..." : "Connect with Key"} + + + Cancel + + + + + ); + } + + // Default: BI_INTEL login method + return ( (""); - const agentOrg = useRef(""); + const aiModuleOrg = useRef(""); const agentCallEndOfFile = useRef(null); const agentEndOfFile = useRef(null); const mainFilePath = useRef(""); @@ -95,7 +95,7 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { const filePath = await rpcClient.getVisualizerLocation(); agentFilePath.current = Utils.joinPath(URI.file(filePath.projectUri), "agents.bal").fsPath; // get agent org - agentOrg.current = await getAgentOrg(rpcClient); + aiModuleOrg.current = await getAiModuleOrg(rpcClient); // fetch agent node await fetchAgentNode(); // get end of files @@ -114,7 +114,7 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { useEffect(() => { initWizard().then(() => { - rpcClient.getServiceDesignerRpcClient().getListenerModel({ moduleName: type, orgName: agentOrg.current }).then(res => { + rpcClient.getServiceDesignerRpcClient().getListenerModel({ moduleName: type, orgName: aiModuleOrg.current }).then(res => { setListenerModel(res.listener); }); }).catch(error => { @@ -125,7 +125,7 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { const fetchAgentNode = async () => { // get the agent node - const allAgents = await rpcClient.getAIAgentRpcClient().getAllAgents({ filePath: agentFilePath.current, orgName: agentOrg.current }); + const allAgents = await rpcClient.getAIAgentRpcClient().getAllAgents({ filePath: agentFilePath.current, orgName: aiModuleOrg.current }); console.log(">>> allAgents", allAgents); if (!allAgents.agents.length) { console.log(">>> no agents found"); @@ -139,7 +139,7 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { // get all llm models const allModels = await rpcClient .getAIAgentRpcClient() - .getAllModels({ agent: agentCodeData.object, filePath: agentFilePath.current, orgName: agentOrg.current }); + .getAllModels({ agent: agentCodeData.object, filePath: agentFilePath.current, orgName: aiModuleOrg.current }); console.log(">>> allModels", allModels); // get openai model const defaultModel = allModels.models.find((model) => model.object === "OpenAiProvider" || (model.org === BALLERINA && model.module === AI)); @@ -197,7 +197,7 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { filePath: "", moduleName: type, listenerName: listenerName, - orgName: agentOrg.current, + orgName: aiModuleOrg.current, }).then(res => { const serviceModel = res.service; console.log("Service Model: ", serviceModel); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AgentConfig.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AgentConfig.tsx index 2d93a6d86d9..d9d02611f3b 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AgentConfig.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AgentConfig.tsx @@ -24,7 +24,7 @@ import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { convertConfig } from "../../../utils/bi"; import ConfigForm from "./ConfigForm"; import { cloneDeep } from "lodash"; -import { findAgentNodeFromAgentCallNode, getAgentFilePath } from "./utils"; +import { findAgentNodeFromAgentCallNode, getAgentFilePath, getMainFilePath } from "./utils"; const Container = styled.div` padding: 16px; @@ -54,6 +54,7 @@ export function AgentConfig(props: AgentConfigProps): JSX.Element { const [savingForm, setSavingForm] = useState(false); const agentFilePath = useRef(""); + const mainFilePath = useRef(""); useEffect(() => { initPanel(); @@ -68,6 +69,8 @@ export function AgentConfig(props: AgentConfigProps): JSX.Element { const initPanel = async () => { // get agent file path agentFilePath.current = await getAgentFilePath(rpcClient); + // get main file path + mainFilePath.current = await getMainFilePath(rpcClient); // fetch agent node await fetchAgentNode(); await fetchAgentCallNode(); @@ -214,6 +217,7 @@ export function AgentConfig(props: AgentConfigProps): JSX.Element { {agentCallNode?.codedata?.lineRange && ( >> ConfigForm props", props); const handleSubmit = async (data: FormValues, formImports: FormImports) => { @@ -80,7 +81,7 @@ export function ConfigForm(props: ConfigProps) { {targetLineRange && ( (false); const agentFilePath = useRef(""); - const agentOrg = useRef(""); + const aiModuleOrg = useRef(""); const agentNodeRef = useRef(); const moduleConnectionNodes = useRef([]); - const selectedMemoryManagerFlowNode = useRef(); useEffect(() => { initPanel(); @@ -86,7 +85,7 @@ export function MemoryManagerConfig(props: MemoryManagerConfigProps): JSX.Elemen const initPanel = async () => { setLoading(true); agentFilePath.current = await getAgentFilePath(rpcClient); - agentOrg.current = await getAgentOrg(rpcClient); + aiModuleOrg.current = await getAiModuleOrg(rpcClient); // fetch all memory managers const memoryManagers = await fetchMemoryManagers(); // fetch selected agent memory manager @@ -104,7 +103,7 @@ export function MemoryManagerConfig(props: MemoryManagerConfigProps): JSX.Elemen try { const memoryManagers = await rpcClient .getAIAgentRpcClient() - .getAllMemoryManagers({ filePath: agentFilePath.current, orgName: agentOrg.current }); + .getAllMemoryManagers({ filePath: agentFilePath.current, orgName: aiModuleOrg.current }); console.log(">>> all memory managers", memoryManagers); if (memoryManagers.memoryManagers) { setMemoryManagersCodeData(memoryManagers.memoryManagers); @@ -300,7 +299,7 @@ export function MemoryManagerConfig(props: MemoryManagerConfigProps): JSX.Elemen }} value={ selectedMemoryManagerCodeData?.object || - (agentCallNode?.metadata?.data?.memory?.type as string) || + ((agentCallNode?.metadata?.data as NodeMetadata)?.memory?.type as string) || memoryManagerDropdownPlaceholder } containerSx={{ width: "100%" }} @@ -314,6 +313,7 @@ export function MemoryManagerConfig(props: MemoryManagerConfigProps): JSX.Elemen )} {!loading && selectedMemoryManagerFields?.length > 0 && agentNodeRef.current?.codedata?.lineRange && ( (false); const agentFilePath = useRef(""); - const agentOrg = useRef(""); + const aiModuleOrg = useRef(""); const moduleConnectionNodes = useRef([]); const selectedModelFlowNode = useRef(); @@ -81,9 +81,9 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { if (modelsCodeData.length > 0 && selectedModel && !selectedModelCodeData) { // Find the initial modelCodeData that matches selectedModel let initialModelCodeData: CodeData | undefined; - if (agentOrg.current === BALLERINA) { + if (aiModuleOrg.current === BALLERINA) { initialModelCodeData = modelsCodeData.find((model) => model.module === selectedModel.codedata.module); - } else if (agentOrg.current === BALLERINAX) { + } else if (aiModuleOrg.current === BALLERINAX) { initialModelCodeData = modelsCodeData.find((model) => model.object === selectedModel.codedata.object); } else { initialModelCodeData = modelsCodeData.find((model) => model.module === selectedModel.codedata.module); @@ -100,7 +100,7 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { const initPanel = async () => { setLoading(true); agentFilePath.current = await getAgentFilePath(rpcClient); - agentOrg.current = await getAgentOrg(rpcClient); + aiModuleOrg.current = await getAiModuleOrg(rpcClient); // fetch all models await fetchModels(); // fetch selected agent model @@ -111,12 +111,12 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { // Helper to get provider name from modelCodeData const getProviderName = (model: CodeData, useMappedName: boolean = false) => { if (!model) return ""; - if (agentOrg.current === BALLERINA) { + if (aiModuleOrg.current === BALLERINA) { if (useMappedName) { return PROVIDER_NAME_MAP[model.module] || model.module; } return model.module; - } else if (agentOrg.current === BALLERINAX) { + } else if (aiModuleOrg.current === BALLERINAX) { return model.object; } // fallback @@ -132,7 +132,7 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { } const models = await rpcClient .getAIAgentRpcClient() - .getAllModels({ agent: agentName, filePath: agentFilePath.current, orgName: agentOrg.current }); + .getAllModels({ agent: agentName, filePath: agentFilePath.current, orgName: aiModuleOrg.current }); console.log(">>> all models", models); setModelsCodeData(models.models); }; @@ -166,11 +166,11 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { const fetchModelNodeTemplate = async (modelCodeData: CodeData) => { setLoading(true); let nodeProperties: NodeProperties = {}; - // Determine provider match for both agentOrg cases + // Determine provider match for both aiModuleOrg cases let isProviderMatch = false; - if (agentOrg.current === BALLERINA) { + if (aiModuleOrg.current === BALLERINA) { isProviderMatch = selectedModel?.codedata.module === modelCodeData.module; - } else if (agentOrg.current === BALLERINAX) { + } else if (aiModuleOrg.current === BALLERINAX) { isProviderMatch = selectedModel?.codedata.object === modelCodeData.object; } else { isProviderMatch = selectedModel?.codedata.module === modelCodeData.module; @@ -252,7 +252,11 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { setSelectedModelCodeData(selectedModelCodeData); fetchModelNodeTemplate(selectedModelCodeData); }} - value={selectedModelCodeData ? getProviderName(selectedModelCodeData) : (agentCallNode?.metadata.data?.model?.type as string)} + value={ + selectedModelCodeData + ? getProviderName(selectedModelCodeData) + : ((agentCallNode?.metadata.data as NodeMetadata)?.model?.type as string) + } containerSx={{ width: "100%" }} /> @@ -264,6 +268,7 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { )} {!loading && selectedModelFields?.length > 0 && selectedModel?.codedata?.lineRange && ( (false); const agentFilePath = useRef(""); - const agentOrg = useRef(""); + const mainFilePath = useRef(""); + const aiModuleOrg = useRef(""); const agentCallEndOfFile = useRef(null); const agentEndOfFile = useRef(null); @@ -74,8 +75,10 @@ export function NewAgent(props: NewAgentProps): JSX.Element { // get agent file path const filePath = await rpcClient.getVisualizerLocation(); agentFilePath.current = Utils.joinPath(URI.file(filePath.projectUri), "agents.bal").fsPath; + // get main file path + mainFilePath.current = Utils.joinPath(URI.file(filePath.projectUri), "main.bal").fsPath; // get agent org - agentOrg.current = await getAgentOrg(rpcClient); + aiModuleOrg.current = await getAiModuleOrg(rpcClient); // fetch agent node await fetchAgentNode(); // get end of files @@ -100,7 +103,7 @@ export function NewAgent(props: NewAgentProps): JSX.Element { const fetchAgentNode = async () => { // get the agent node - const allAgents = await rpcClient.getAIAgentRpcClient().getAllAgents({ filePath: agentFilePath.current, orgName: agentOrg.current }); + const allAgents = await rpcClient.getAIAgentRpcClient().getAllAgents({ filePath: agentFilePath.current, orgName: aiModuleOrg.current }); console.log(">>> allAgents", allAgents); if (!allAgents.agents.length) { console.log(">>> no agents found"); @@ -114,7 +117,7 @@ export function NewAgent(props: NewAgentProps): JSX.Element { // get all llm models const allModels = await rpcClient .getAIAgentRpcClient() - .getAllModels({ agent: agentCodeData.object, filePath: agentFilePath.current, orgName: agentOrg.current }); + .getAllModels({ agent: agentCodeData.object, filePath: agentFilePath.current, orgName: aiModuleOrg.current }); console.log(">>> allModels", allModels); // get openai model const defaultModel = allModels.models.find((model) => model.object === "OpenAiProvider" || (model.org === BALLERINA && model.module === AI)); @@ -134,7 +137,7 @@ export function NewAgent(props: NewAgentProps): JSX.Element { return; } // overwrite the agent call node properties - agentCallNode.codedata.org = agentOrg.current; + agentCallNode.codedata.org = aiModuleOrg.current; const agentCallFormFields = convertConfig(agentCallNode.properties); const systemPromptProperty = agentNode.properties.systemPrompt; @@ -295,6 +298,7 @@ export function NewAgent(props: NewAgentProps): JSX.Element { )} {!loading && ( { const basePath = serviceModel.properties?.basePath?.value?.trim() ?? ""; const listener = serviceModel.properties?.listener?.value?.trim(); - const commands = ["ballerina.tryit", false, undefined, { basePath, listener }]; + const commands = ["ballerina.tryIt", false, undefined, { basePath, listener }]; rpcClient.getCommonRpcClient().executeCommand({ commands }); }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts index 8f5180a7dbe..cebe57f935b 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts @@ -36,13 +36,13 @@ export const getNodeTemplate = async ( return response?.flowNode; }; -export const getAgentOrg = async (rpcClient: BallerinaRpcClient) => { +export const getAiModuleOrg = async (rpcClient: BallerinaRpcClient) => { const filePath = await rpcClient.getVisualizerLocation(); - const agentOrgResponse = await rpcClient + const aiModuleOrgResponse = await rpcClient .getAIAgentRpcClient() - .getAgentOrg({ projectPath: filePath.projectUri }); - console.log(">>> agent org", agentOrgResponse.orgName); - return agentOrgResponse.orgName; + .getAiModuleOrg({ projectPath: filePath.projectUri }); + console.log(">>> agent org", aiModuleOrgResponse.orgName); + return aiModuleOrgResponse.orgName; } export const getAgentFilePath = async (rpcClient: BallerinaRpcClient) => { @@ -53,6 +53,14 @@ export const getAgentFilePath = async (rpcClient: BallerinaRpcClient) => { return agentFilePath; }; +export const getMainFilePath = async (rpcClient: BallerinaRpcClient) => { + // Get the main file path and update the node + const filePath = await rpcClient.getVisualizerLocation(); + // Create the main file path + const mainFilePath = Utils.joinPath(URI.file(filePath.projectUri), "main.bal").fsPath; + return mainFilePath; +}; + export const findFlowNodeByModuleVarName = async (variableName: string, rpcClient: BallerinaRpcClient) => { try { // Get all module nodes diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentListView/OtherArtifactsPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentListView/OtherArtifactsPanel.tsx index 58fdaccf611..8627b2072a6 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentListView/OtherArtifactsPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentListView/OtherArtifactsPanel.tsx @@ -61,7 +61,7 @@ export function OtherArtifactsPanel(props: OtherArtifactsPanelProps) { await rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: { - view: MACHINE_VIEW.ViewConfigVariables, + view: MACHINE_VIEW.AddConfigVariables, }, }); } else if (key === DIRECTORY_MAP.FUNCTION) { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Configurables/ViewConfigurableVariables/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Configurables/ViewConfigurableVariables/index.tsx index bf0d0018e9e..2ed07dace3b 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Configurables/ViewConfigurableVariables/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Configurables/ViewConfigurableVariables/index.tsx @@ -105,6 +105,7 @@ export interface ConfigProps { fileName: string; org: string; package: string; + addNew?: boolean; } interface CategoryWithModules { @@ -136,7 +137,7 @@ export function ViewConfigurableVariables(props?: ConfigProps) { const { rpcClient } = useRpcContext(); const [configVariables, setConfigVariables] = useState({}); const [errorMessage, setErrorMessage] = useState(''); - const [isAddConfigVariableFormOpen, setAddConfigVariableFormOpen] = useState(false); + const [isAddConfigVariableFormOpen, setAddConfigVariableFormOpen] = useState(props?.addNew || false); const [searchValue, setSearchValue] = React.useState(''); const [categoriesWithModules, setCategoriesWithModules] = useState([]); const [selectedModule, setSelectedModule] = useState(null); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx index d5175f49778..6944bf1e8e1 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx @@ -17,14 +17,14 @@ */ import React, { useEffect, useState } from "react"; -import { ResourceAccessorDefinition, STKindChecker, STNode } from "@wso2/syntax-tree"; +import { STNode } from "@wso2/syntax-tree"; import { Button, Icon, Switch, View, ThemeColors, Tooltip } from "@wso2/ui-toolkit"; import { BIFlowDiagram } from "../FlowDiagram"; import { BISequenceDiagram } from "../SequenceDiagram"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { TopNavigationBar } from "../../../components/TopNavigationBar"; import { TitleBar } from "../../../components/TitleBar"; -import { EVENT_TYPE, FOCUS_FLOW_DIAGRAM_VIEW, FocusFlowDiagramView } from "@wso2/ballerina-core"; +import { EVENT_TYPE, FOCUS_FLOW_DIAGRAM_VIEW, FocusFlowDiagramView, ParentMetadata } from "@wso2/ballerina-core"; import { VisualizerLocation } from "@wso2/ballerina-core"; import { MACHINE_VIEW } from "@wso2/ballerina-core"; import styled from "@emotion/styled"; @@ -112,13 +112,9 @@ const WrappedTooltip = ({ content, children }: WrappedTooltipProps) => { let formattedItems: string[] = []; if (text.includes(",")) { - formattedItems = text - .split(",") - .map((item) => item.trim()); + formattedItems = text.split(",").map((item) => item.trim()); } else if (text.includes("|")) { - formattedItems = text - .split("|") - .map((item) => item.trim()); + formattedItems = text.split("|").map((item) => item.trim()); } else { return text; } @@ -153,14 +149,15 @@ const WrappedTooltip = ({ content, children }: WrappedTooltipProps) => { }; export interface DiagramWrapperProps { - syntaxTree: STNode; projectPath: string; filePath?: string; view?: FocusFlowDiagramView; + breakpointState?: boolean; + syntaxTree?: STNode; } export function DiagramWrapper(param: DiagramWrapperProps) { - const { syntaxTree, projectPath, filePath, view } = param; + const { projectPath, filePath, view, breakpointState, syntaxTree } = param; const { rpcClient } = useRpcContext(); const [showSequenceDiagram, setShowSequenceDiagram] = useState(false); @@ -170,6 +167,7 @@ export function DiagramWrapper(param: DiagramWrapperProps) { const [serviceType, setServiceType] = useState(""); const [basePath, setBasePath] = useState(""); const [listener, setListener] = useState(""); + const [parentMetadata, setParentMetadata] = useState(); useEffect(() => { rpcClient.getVisualizerLocation().then((location) => { @@ -224,11 +222,14 @@ export function DiagramWrapper(param: DiagramWrapperProps) { setLoadingDiagram(true); }; - const handleReadyDiagram = (fileName?: string) => { + const handleReadyDiagram = (fileName?: string, parentMetadata?: ParentMetadata) => { setLoadingDiagram(false); if (fileName) { setFileName(fileName); } + if (parentMetadata) { + setParentMetadata(parentMetadata); + } }; const handleEdit = (fileUri?: string) => { @@ -237,177 +238,104 @@ export function DiagramWrapper(param: DiagramWrapperProps) { view === FOCUS_FLOW_DIAGRAM_VIEW.NP_FUNCTION ? MACHINE_VIEW.BINPFunctionForm : MACHINE_VIEW.BIFunctionForm, - identifier: (syntaxTree as ResourceAccessorDefinition).functionName.value, + identifier: parentMetadata?.label || "", documentUri: fileUri, }; rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: context }); }; - let isAutomation = false; - let isResource = false; - let isRemote = false; - let isAgent = false; - let method = ""; - const parameters = getParameters(syntaxTree); - const returnType = getReturnType(syntaxTree); - - if (syntaxTree && STKindChecker.isResourceAccessorDefinition(syntaxTree)) { - isResource = true; - method = (syntaxTree as ResourceAccessorDefinition).functionName.value; - } else if (syntaxTree && STKindChecker.isFunctionDefinition(syntaxTree)) { - isResource = false; - method = syntaxTree.functionName.value; - } else if (syntaxTree && STKindChecker.isObjectMethodDefinition(syntaxTree)) { - isRemote = syntaxTree.qualifierList?.some((qualifier) => STKindChecker.isRemoteKeyword(qualifier)) || false; - method = syntaxTree.functionName.value; - } else { - // FIXME: this is a temporary fix to navigate back to overview when the syntax tree is undefined - console.error(">>> cannot get method, syntaxTree is undefined"); - rpcClient - .getVisualizerRpcClient() - .openView({ type: EVENT_TYPE.OPEN_VIEW, location: { view: MACHINE_VIEW.Overview } }); - return; - } - - if (!isResource && method === "main") { - isAutomation = true; - } - - if (serviceType === "ai") { - isAgent = true; - } + let isAutomation = parentMetadata?.kind === "Function" && parentMetadata?.label === "main"; + let isFunction = parentMetadata?.kind === "Function" && parentMetadata?.label !== "main"; + let isResource = parentMetadata?.kind === "Resource"; + let isRemote = parentMetadata?.kind === "Remote Function"; + let isAgent = parentMetadata?.kind === "AI Chat Agent" && parentMetadata?.label === "chat"; + let isNPFunction = view === FOCUS_FLOW_DIAGRAM_VIEW.NP_FUNCTION; + const parameters = parentMetadata?.parameters?.join(", ") || ""; + const returnType = parentMetadata?.return || ""; const handleResourceTryIt = (methodValue: string, pathValue: string) => { const resource = serviceType === "http" ? { methodValue, pathValue } : undefined; - const commands = ["ballerina.tryit", false, resource, { basePath, listener }]; + const commands = ["ballerina.tryIt", false, resource, { basePath, listener }]; rpcClient.getCommonRpcClient().executeCommand({ commands }); }; + // Calculate title based on conditions + const getTitle = () => { + if (isNPFunction) return "Natural Function"; + if (isAutomation) return "Automation"; + return parentMetadata?.kind || ""; + }; + + // Calculate subtitle element based on conditions + const getSubtitleElement = () => { + return ( + + + {isResource && {parentMetadata?.accessor || ""}} + {!isAutomation && {parentMetadata?.label || ""}} + {parameters && ( + + ({parameters}) + + )} + + {returnType && ( + + + {returnType} + + + )} + + ); + }; + + // Calculate actions based on conditions + const getActions = () => { + if (isAgent) { + return ( + handleResourceTryIt(parentMetadata?.accessor || "", parentMetadata?.label || "")} + > + + Chat + + ); + } + + if (isResource && serviceType === "http") { + return ( + handleResourceTryIt(parentMetadata?.accessor || "", parentMetadata?.label || "")} + > + + {"Try It"} + + ); + } + + if (parentMetadata && !isResource && !isRemote) { + return ( + handleEdit(fileName)}> + + Edit + + ); + } + + return null; + }; + return ( - {isResource && !isAutomation && ( - - - {method} - {getResourcePath(syntaxTree)} - {parameters && ( - - ({parameters}) - - )} - - {returnType && ( - - - {returnType} - - - )} - - } - actions={ - serviceType === "http" || isAgent ? ( - handleResourceTryIt(method, getResourcePath(syntaxTree))} - > - - {isAgent ? "Chat" : "Try It"} - - ) : null - } - /> - )} - {isRemote && ( - - - {method} - {parameters && ( - - ({parameters}) - - )} - - {returnType && ( - - - {returnType} - - - )} - - } - /> - )} - {!isResource && !isAutomation && !isRemote && ( - - - {method} - {parameters && ( - - ({parameters}) - - )} - - {returnType && ( - - - - {returnType} - - - )} - - } - actions={ - handleEdit(fileName)}> - - Edit - - } - /> - )} - {!isResource && isAutomation && ( - - - - ({getParameters(syntaxTree)}) - - - {returnType && ( - - - {returnType} - - - )} - - } - actions={ - handleEdit(fileName)}> - - Edit - - } - /> - )} + {enableSequenceDiagram && !isAgent && ( )} {showSequenceDiagram ? ( - + ) : view ? ( ) : ( { - resourcePath += STKindChecker.isResourcePathSegmentParam(path) ? path.source : path?.value; - }); - } - return resourcePath; -} - -function getParameters(syntaxTree: STNode) { - if (!syntaxTree) { - console.error(">>> cannot get parameters, syntaxTree is undefined"); - return ""; - } - if ( - STKindChecker.isResourceAccessorDefinition(syntaxTree) || - (STKindChecker.isObjectMethodDefinition(syntaxTree) && - syntaxTree.qualifierList?.some((qualifier) => STKindChecker.isRemoteKeyword(qualifier))) - ) { - return syntaxTree.functionSignature.parameters - .map((param) => { - if (!STKindChecker.isCommaToken(param)) { - return `${param.paramName.value}: ${param.typeName.source.trim()}`; - } - return null; - }) - .filter(Boolean) - .join(", "); - } else if ( - STKindChecker.isFunctionDefinition(syntaxTree) && - STKindChecker.isExpressionFunctionBody(syntaxTree.functionBody) && - syntaxTree.functionBody.expression.kind === "NaturalExpression" - ) { - return syntaxTree.functionSignature.parameters - .map((param) => { - if ( - !STKindChecker.isCommaToken(param) && - param.paramName.value !== "prompt" && - param.paramName.value !== "context" - ) { - return `${param.paramName.value}: ${param.typeName.source.trim()}`; - } - return null; - }) - .filter(Boolean) - .join(", "); - } else if (STKindChecker.isFunctionDefinition(syntaxTree)) { - return syntaxTree.functionSignature.parameters - .map((param) => { - if (!STKindChecker.isCommaToken(param)) { - return `${param.paramName.value}: ${param.typeName.source.trim()}`; - } - return null; - }) - .filter(Boolean) - .join(", "); - } - return ""; -} - -function getReturnType(syntaxTree: STNode) { - if (!syntaxTree) { - console.error(">>> cannot get return type, syntaxTree is undefined"); - return ""; - } - if (STKindChecker.isFunctionDefinition(syntaxTree)) { - return syntaxTree.functionSignature.returnTypeDesc?.type.source || ""; - } - if (STKindChecker.isResourceAccessorDefinition(syntaxTree) || STKindChecker.isObjectMethodDefinition(syntaxTree)) { - return syntaxTree.functionSignature.returnTypeDesc?.type.source || ""; - } - return ""; -} - export default DiagramWrapper; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx index 754fff32181..e9a94f4b616 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx @@ -17,7 +17,7 @@ */ import { PanelContainer, NodeList, ExpressionFormField } from "@wso2/ballerina-side-panel"; -import { FlowNode, LineRange, SubPanel, SubPanelView, FUNCTION_TYPE, ToolData } from "@wso2/ballerina-core"; +import { FlowNode, LineRange, SubPanel, SubPanelView, FUNCTION_TYPE, ToolData, NodeMetadata } from "@wso2/ballerina-core"; import { InlineDataMapper } from "../../InlineDataMapper"; import { HelperView } from "../HelperView"; import FormGenerator from "../Forms/FormGenerator"; @@ -152,6 +152,11 @@ export function PanelManager(props: PanelManagerProps) { setPanelView(SidePanelView.ADD_TOOL); }; + const handleSubmitAndClose = () => { + onSubmitForm(); + onClose(); + }; + const findSubPanelComponent = (subPanel: SubPanel) => { switch (subPanel.view) { case SubPanelView.INLINE_DATA_MAPPER: @@ -196,12 +201,12 @@ export function PanelManager(props: PanelManagerProps) { agentCallNode={selectedNode} fileName={fileName} lineRange={targetLineRange} - onSave={onClose} + onSave={handleSubmitAndClose} /> ); case SidePanelView.ADD_TOOL: - return ; + return ; case SidePanelView.ADD_MCP_SERVER: return ; @@ -210,22 +215,22 @@ export function PanelManager(props: PanelManagerProps) { return ; case SidePanelView.NEW_TOOL: - return ; + return ; case SidePanelView.AGENT_TOOL: - const selectedTool = selectedNode?.metadata.data.tools?.find( + const selectedTool = (selectedNode?.metadata.data as NodeMetadata).tools?.find( (tool) => tool.name === selectedClientName ); - return ; + return ; case SidePanelView.AGENT_MODEL: - return ; + return ; case SidePanelView.AGENT_CONFIG: return ; case SidePanelView.AGENT_MEMORY_MANAGER: - return ; + return ; case SidePanelView.FUNCTION_LIST: return ( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index 36b22509f58..3eb42bb7abf 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -16,7 +16,7 @@ * under the License. */ -import { useEffect, useRef, useState, useMemo } from "react"; +import { useEffect, useRef, useState, useMemo, useCallback } from "react"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import styled from "@emotion/styled"; import { removeMcpServerFromAgentNode } from "../AIChatAgent/utils"; @@ -41,6 +41,8 @@ import { ToolData, DIRECTORY_MAP, UpdatedArtifactsResponse, + ParentMetadata, + NodeMetadata, } from "@wso2/ballerina-core"; import { @@ -54,7 +56,7 @@ import { applyModifications, textToModifications } from "../../../utils/utils"; import { PanelManager, SidePanelView } from "./PanelManager"; import { findFunctionByName, transformCategories } from "./utils"; import { ExpressionFormField, Category as PanelCategory } from "@wso2/ballerina-side-panel"; -import { cloneDeep } from "lodash"; +import { cloneDeep, debounce } from "lodash"; import { findFlowNodeByModuleVarName, getAgentFilePath, @@ -62,7 +64,6 @@ import { removeAgentNode, removeToolFromAgentNode, } from "../AIChatAgent/utils"; -import { t } from "@tanstack/query-core/build/legacy/hydration-BCnR_RAv"; import { PROVIDER_NAME_MAP } from "../../../constants"; const Container = styled.div` @@ -78,15 +79,16 @@ const SpinnerContainer = styled.div` `; export interface BIFlowDiagramProps { - syntaxTree: STNode; // INFO: this is used to make the diagram rerender when code changes projectPath: string; + breakpointState?: boolean; + syntaxTree?: STNode; onUpdate: () => void; - onReady: (fileName: string) => void; + onReady: (fileName: string, parentMetadata?: ParentMetadata) => void; onSave?: () => void; } export function BIFlowDiagram(props: BIFlowDiagramProps) { - const { syntaxTree, projectPath, onUpdate, onReady, onSave } = props; + const { projectPath, breakpointState, syntaxTree, onUpdate, onReady, onSave } = props; const { rpcClient } = useRpcContext(); const [model, setModel] = useState(); @@ -110,18 +112,17 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { const initialCategoriesRef = useRef([]); const showEditForm = useRef(false); const selectedNodeMetadata = useRef<{ nodeId: string, metadata: any, fileName: string }>(); - const selectedModel = useRef(); useEffect(() => { - getFlowModel(); - }, [syntaxTree]); + debouncedGetFlowModel(); + }, [breakpointState, syntaxTree]); useEffect(() => { rpcClient.onParentPopupSubmitted((parent: ParentPopupData) => { + console.log(">>> on parent popup submitted", parent); if (parent.artifactType === DIRECTORY_MAP.FUNCTION || parent.artifactType === DIRECTORY_MAP.NP_FUNCTION || parent.artifactType === DIRECTORY_MAP.DATA_MAPPER) { handleOnSelectNode(selectedNodeMetadata.current.nodeId, selectedNodeMetadata.current.metadata, selectedNodeMetadata.current.fileName); } else { - console.log(">>> on parent popup submitted", parent); if (!topNodeRef.current || !targetRef.current) { console.error(">>> No parent or target found"); return; @@ -132,6 +133,13 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }); }, [rpcClient]); + const debouncedGetFlowModel = useCallback( + debounce(() => { + getFlowModel(); + }, 1000), + [] + ); + const getFlowModel = () => { setShowProgressIndicator(true); onUpdate(); @@ -144,10 +152,14 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { .getBIDiagramRpcClient() .getFlowModel() .then((model) => { + console.log(">>> flow model", model); if (model?.flowModel) { updateAgentModelTypes(model?.flowModel); setModel(model.flowModel); - onReady(model.flowModel.fileName); + const parentMetadata = model.flowModel.nodes.find( + (node) => node.codedata.node === "EVENT_START" + )?.metadata.data as ParentMetadata | undefined; + onReady(model.flowModel.fileName, parentMetadata); } }) .finally(() => { @@ -180,19 +192,21 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { if (!modelVarName || !modelProviderName) return; flowModel.nodes.forEach((node: FlowNode) => { + const nodeMetadata = node?.metadata?.data as NodeMetadata; if ( node?.codedata?.node === "AGENT_CALL" && - node?.metadata?.data?.model?.name === modelVarName + nodeMetadata?.model?.name === modelVarName ) { - setModelType(node.metadata.data.model, modelProviderName); + setModelType(nodeMetadata.model, modelProviderName); } else if (node?.codedata?.node === "ERROR_HANDLER" && Array.isArray(node.branches)) { node.branches.forEach((branch) => { (branch.children ?? []).forEach((child) => { + const childMetadata = child?.metadata?.data as NodeMetadata; if ( child.codedata.node === "AGENT_CALL" && - child.metadata?.data?.model?.name === modelVarName + childMetadata?.model?.name === modelVarName ) { - setModelType(child.metadata.data.model, modelProviderName); + setModelType(childMetadata.model, modelProviderName); } }); }); @@ -269,7 +283,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { // restore original model if (originalFlowModel.current) { - getFlowModel(); + debouncedGetFlowModel(); originalFlowModel.current = undefined; setSuggestedModel(undefined); suggestedText.current = undefined; @@ -598,6 +612,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { if (!updatedNode) { console.log(">>> No updated node found"); updatedNode = selectedNodeRef.current; + debouncedGetFlowModel(); } setShowProgressIndicator(true); rpcClient @@ -619,6 +634,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }) .finally(() => { setShowProgressIndicator(false); + debouncedGetFlowModel(); }); }; @@ -640,6 +656,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { if (!agentNodeDeleteResponse) { console.error(">>> Error deleting agent node", node); setShowProgressIndicator(false); + debouncedGetFlowModel(); return; } } @@ -649,6 +666,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { selectedNodeRef.current = undefined; handleOnCloseSidePanel(); setShowProgressIndicator(false); + debouncedGetFlowModel(); }; const handleOnAddComment = (comment: string, target: LineRange) => { @@ -730,14 +748,6 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { id: node.codedata, }) .then((response) => { - // const nodesWithCustomForms = ["IF", "FORK"]; - // if (!response.flowNode.properties && !nodesWithCustomForms.includes(response.flowNode.codedata.node)) { - // console.log(">>> Node doesn't have properties. Don't show edit form", response.flowNode); - // setShowProgressIndicator(false); - // showEditForm.current = false; - // return; - // } - nodeTemplateRef.current = response.flowNode; showEditForm.current = true; setSidePanelView(SidePanelView.FORM); @@ -745,6 +755,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }) .finally(() => { setShowProgressIndicator(false); + debouncedGetFlowModel(); }); }; @@ -980,6 +991,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { alert("Failed to remove memory manager. Please try again."); } finally { setShowProgressIndicator(false); + debouncedGetFlowModel(); } }; @@ -1028,6 +1040,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { setSidePanelView(SidePanelView.ADD_MCP_SERVER); setShowSidePanel(true); setShowProgressIndicator(false); + debouncedGetFlowModel(); }, 500); }; @@ -1125,6 +1138,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { alert(`Failed to remove tool "${tool.name}". Please try again.`); } finally { setShowProgressIndicator(false); + debouncedGetFlowModel(); } }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx index 5e437637910..51e7fc9dbad 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx @@ -41,7 +41,8 @@ import { ExpressionProperty, TRIGGER_CHARACTERS, TriggerCharacter, - TextEdit + TextEdit, + ParentMetadata } from "@wso2/ballerina-core"; import { @@ -70,16 +71,14 @@ const SpinnerContainer = styled.div` `; export interface BIFocusFlowDiagramProps { - syntaxTree: STNode; // INFO: this is used to make the diagram rerender when code changes projectPath: string; filePath: string; - view: FocusFlowDiagramView; onUpdate: () => void; - onReady: (fileName: string) => void; + onReady: (fileName: string, parentMetadata?: ParentMetadata) => void; } export function BIFocusFlowDiagram(props: BIFocusFlowDiagramProps) { - const { syntaxTree, projectPath, filePath, onUpdate, onReady, view } = props; + const { projectPath, filePath, onUpdate, onReady } = props; const { rpcClient } = useRpcContext(); const [model, setModel] = useState(); @@ -105,8 +104,8 @@ export function BIFocusFlowDiagram(props: BIFocusFlowDiagramProps) { const expressionOffsetRef = useRef(0); // To track the expression offset on adding import statements useEffect(() => { - getFlowModel(); - }, [syntaxTree]); + debouncedGetFlowModel(); + }, []); useEffect(() => { rpcClient.onProjectContentUpdated((state: boolean) => { @@ -121,6 +120,13 @@ export function BIFocusFlowDiagram(props: BIFocusFlowDiagramProps) { }); }, [rpcClient]); + const debouncedGetFlowModel = useCallback( + debounce(() => { + getFlowModel(); + }, 1000), + [rpcClient] + ); + const getFlowModel = () => { setShowProgressIndicator(true); onUpdate(); @@ -133,22 +139,25 @@ export function BIFocusFlowDiagram(props: BIFocusFlowDiagramProps) { .getBIDiagramRpcClient() .getFlowModel() .then(async (model) => { + console.log(">>> focus diagram flow model", model); if (model?.flowModel) { - if (isNaturalFunction(syntaxTree, view)) { - const node = await rpcClient.getBIDiagramRpcClient().getFunctionNode({ - projectPath, - fileName: filePath, - functionName: syntaxTree.functionName.value - }); - - setSelectedNode(node.functionDefinition); - - if (node?.functionDefinition) { - const flowNode = getFlowNodeForNaturalFunction(node.functionDefinition); - model.flowModel.nodes.push(flowNode); - setModel(model.flowModel); - onReady(filePath); - } + const functionName = (model.flowModel.nodes.find((node) => node.codedata.node === "EVENT_START")?.metadata.data as ParentMetadata).label || ""; + const node = await rpcClient.getBIDiagramRpcClient().getFunctionNode({ + projectPath, + fileName: filePath, + functionName: functionName + }); + + setSelectedNode(node.functionDefinition); + + if (node?.functionDefinition) { + const flowNode = getFlowNodeForNaturalFunction(node.functionDefinition); + model.flowModel.nodes.push(flowNode); + setModel(model.flowModel); + const parentMetadata = model.flowModel.nodes.find( + (node) => node.codedata.node === "EVENT_START" + )?.metadata.data as ParentMetadata | undefined; + onReady(model.flowModel.fileName, parentMetadata); } } }) @@ -171,7 +180,7 @@ export function BIFocusFlowDiagram(props: BIFocusFlowDiagramProps) { if (originalFlowModel.current) { // const updatedModel = removeDraftNodeFromDiagram(model); // setModel(updatedModel); - getFlowModel(); + debouncedGetFlowModel(); originalFlowModel.current = undefined; setSuggestedModel(undefined); suggestedText.current = undefined; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Overview/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Overview/index.tsx index f3f5c925ece..a77e27ee0d7 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Overview/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Overview/index.tsx @@ -327,10 +327,17 @@ function DeploymentOption({ onClick={onToggle} > - + {isExpanded ? ( + + ) : ( + + )}

{title}

diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/index.tsx index 76d4a91c407..18f934a342d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ProjectForm/index.tsx @@ -144,14 +144,16 @@ export function ProjectForm() { placeholder="Enter a integration name" autoFocus={true} /> - - - - - {name ? sanitizeProjectName(name) : "integration_id"} - - - + {name && ( + + + + + {sanitizeProjectName(name)} + + + + )} void; onReady: () => void; } export function BISequenceDiagram(props: BISequenceDiagramProps) { - const { syntaxTree, onUpdate, onReady } = props; + const { onUpdate, onReady } = props; const { rpcClient } = useRpcContext(); const [flowModel, setModel] = useState(undefined); useEffect(() => { getSequenceModel(); - }, [syntaxTree]); + }, []); + + useEffect(() => { + rpcClient.onProjectContentUpdated((content) => { + getSequenceModel(); + }); + }, []); const getSequenceModel = () => { onUpdate(); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordionV2.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordionV2.tsx new file mode 100644 index 00000000000..f81f0f17b23 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/components/ResourceAccordionV2.tsx @@ -0,0 +1,266 @@ +/** + * 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 React, { useState } from 'react'; +import styled from '@emotion/styled'; +import { Button, Codicon, Confirm, Icon } from '@wso2/ui-toolkit'; +import { CodeData, FunctionModel, ProjectStructureArtifactResponse } from '@wso2/ballerina-core'; +import { useRpcContext } from '@wso2/ballerina-rpc-client'; + +type MethodProp = { + color: string; + hasLeftMargin?: boolean; +}; + +type ContainerProps = { + borderColor?: string; + haveErrors?: boolean; +}; + +type ButtonSectionProps = { + isExpanded?: boolean; +}; + +type HeaderProps = { + expandable?: boolean; +} + +const AccordionContainer = styled.div` + margin-top: 10px; + overflow: hidden; + background-color: var(--vscode-editorHoverWidget-background); + &:hover { + background-color: var(--vscode-list-hoverBackground); + cursor: pointer; + } + border: ${(p: ContainerProps) => p.haveErrors ? "1px solid red" : "none"}; +`; + +const AccordionHeader = styled.div` + padding: 10px; + cursor: pointer; + display: grid; + grid-template-columns: 3fr 1fr; +`; + +const LinkButtonWrapper = styled.div` + display: flex; + justify-content: center; + align-items: center; + height: 100%; + padding: 0 16px; + + :hover { + outline: 1px solid var(--vscode-inputOption-activeBorder); + } +`; + +const ButtonWrapper = styled.div` + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + font-size: 10px; + width: 40px; +`; + +const MethodBox = styled.div` + display: flex; + justify-content: center; + height: 25px; + min-width: 70px; + width: auto; + margin-left: ${(p: MethodProp) => p.hasLeftMargin ? "10px" : "0px"}; + text-align: center; + padding: 3px 5px 3px 5px; + background-color: ${(p: MethodProp) => p.color}; + color: #FFF; + align-items: center; + font-weight: bold; +`; + +const MethodSection = styled.div` + display: flex; + gap: 4px; +`; + +const verticalIconStyles = { + transform: "rotate(90deg)", + ":hover": { + backgroundColor: "var(--vscode-welcomePage-tileHoverBackground)", + } +}; + +const ButtonSection = styled.div` + display: flex; + align-items: center; + margin-left: auto; + gap: ${(p: ButtonSectionProps) => p.isExpanded ? "8px" : "6px"}; +`; + +const AccordionContent = styled.div` + padding: 10px; +`; + +const MethodPath = styled.span` + align-self: center; + margin-left: 10px; +`; + +const colors = { + "GET": '#3d7eff', + "PUT": '#fca130', + "POST": '#49cc90', + "DELETE": '#f93e3e', + "PATCH": '#986ee2', + "OPTIONS": '#0d5aa7', + "HEAD": '#9012fe' +} + + +export interface ResourceAccordionPropsV2 { + resource: ProjectStructureArtifactResponse; + onEditResource: (resource: FunctionModel) => void; + onDeleteResource: (resource: FunctionModel) => void; + onResourceImplement: (resource: FunctionModel) => void; + readOnly?: boolean; +} + +export function ResourceAccordionV2(params: ResourceAccordionPropsV2) { + const { resource, onEditResource, onDeleteResource, onResourceImplement, readOnly } = params; + + const [isOpen, setIsOpen] = useState(false); + const [isConfirmOpen, setConfirmOpen] = useState(false); + const [confirmEl, setConfirmEl] = React.useState(null); + const { rpcClient } = useRpcContext(); + + + const toggleAccordion = () => { + setIsOpen(!isOpen); + }; + + const getFunctionModel = async () => { + const codeData: CodeData = { + lineRange: { + fileName: resource.path, + startLine: { line: resource.position.startLine, offset: resource.position.startColumn }, + endLine: { line: resource.position.endLine, offset: resource.position.endColumn }, + } + } + const functionModel = await rpcClient.getServiceDesignerRpcClient().getFunctionFromSource({ filePath: resource.path, codedata: codeData }); + return functionModel; + } + + const handleEditResource = async (e: React.MouseEvent) => { + e.stopPropagation(); // Stop the event propagation + const functionModel = await getFunctionModel(); + onEditResource(functionModel.function); + }; + + const handleOpenConfirm = () => { + setConfirmOpen(true); + }; + + const handleDeleteResource = (e: React.MouseEvent) => { + e.stopPropagation(); // Stop the event propagation + setConfirmEl(e.currentTarget); + handleOpenConfirm(); + }; + + const handleConfirm = async (status: boolean) => { + if (status) { + const functionModel = await getFunctionModel(); + onDeleteResource && onDeleteResource(functionModel.function); + } + setConfirmOpen(false); + setConfirmEl(null); + }; + + const handleResourceImplement = async () => { + const functionModel = await getFunctionModel(); + onResourceImplement(functionModel.function); + } + + function getColorByMethod(method: string) { + switch (method) { + case "get-api": + return colors.GET; + case "put-api": + return colors.PUT; + case "post-api": + return colors.POST; + case "delete-api": + return colors.DELETE; + case "patch-api": + return colors.PATCH; + case "options-api": + return colors.OPTIONS; + case "head-api": + return colors.HEAD; + default: + return '#876036'; // Default color + } + } + + return ( + + + + + {resource.icon.split("-")[0].toUpperCase()} + + {resource.name} + + + <> + + + + + + + + + ); +}; + diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx index 2be2308ee03..4a1a1d83179 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/index.tsx @@ -31,7 +31,7 @@ import { ProjectStructureArtifactResponse, PropertyModel, } from "@wso2/ballerina-core"; -import { Button, Codicon, Icon, LinkButton, Typography, View } from "@wso2/ui-toolkit"; +import { Button, Codicon, Icon, LinkButton, Typography, View, TextField } from "@wso2/ui-toolkit"; import styled from "@emotion/styled"; import { ResourceAccordion } from "./components/ResourceAccordion"; import { PanelContainer } from "@wso2/ballerina-side-panel"; @@ -42,6 +42,7 @@ import { applyModifications, isPositionChanged } from "../../../utils/utils"; import { TopNavigationBar } from "../../../components/TopNavigationBar"; import { TitleBar } from "../../../components/TitleBar"; import { LoadingRing } from "../../../components/Loader"; +import { ResourceAccordionV2 } from "./components/ResourceAccordionV2"; const LoadingContainer = styled.div` display: flex; @@ -80,6 +81,13 @@ const ButtonText = styled.span` width: 100%; `; +const HeaderContainer = styled.div` + display: flex; + padding: 15px; + align-items: center; + justify-content: space-between; +`; + interface ServiceDesignerProps { filePath: string; position: NodePosition; @@ -99,6 +107,9 @@ export function ServiceDesigner(props: ServiceDesignerProps) { const [projectListeners, setProjectListeners] = useState([]); const prevPosition = useRef(position); + const [resources, setResources] = useState([]); + const [searchValue, setSearchValue] = useState(""); + useEffect(() => { if (!serviceModel || isPositionChanged(prevPosition.current, position)) { fetchService(position); @@ -136,6 +147,11 @@ export function ServiceDesigner(props: ServiceDesignerProps) { if (listeners.length > 0) { setProjectListeners(listeners); } + const services = res.directoryMap[DIRECTORY_MAP.SERVICE]; + if (services.length > 0) { + const selectedService = services.find((service) => service.name === serviceIdentifier); + setResources(selectedService.resources); + } }); }; @@ -293,7 +309,7 @@ export function ServiceDesigner(props: ServiceDesignerProps) { const handleServiceTryIt = () => { const basePath = serviceModel.properties?.basePath?.value?.trim(); const listener = serviceModel.properties?.listener?.value?.trim(); - const commands = ["ballerina.tryit", false, undefined, { basePath, listener }]; + const commands = ["ballerina.tryIt", false, undefined, { basePath, listener }]; rpcClient.getCommonRpcClient().executeCommand({ commands }); } @@ -342,6 +358,10 @@ export function ServiceDesigner(props: ServiceDesignerProps) { } }; + const handleSearch = (event: React.ChangeEvent) => { + setSearchValue(event.target.value); + }; + const haveServiceTypeName = serviceModel?.properties["serviceTypeName"]?.value; return ( @@ -429,33 +449,58 @@ export function ServiceDesigner(props: ServiceDesignerProps) { ))} - - - Available {serviceModel.moduleName === "http" ? "Resources" : "Functions"} - - - {serviceModel.functions - .filter( - (functionModel) => - (serviceModel.moduleName === "http" - ? functionModel.kind === "RESOURCE" - : true) && functionModel.enabled - ) - .map((functionModel, index) => ( - { }} - onEditResource={handleFunctionEdit} - onDeleteResource={handleFunctionDelete} - onResourceImplement={handleOpenDiagram} - /> - ))} - + + + Available {serviceModel.moduleName === "http" ? "Resources" : "Functions"} + + + {serviceModel.moduleName === "http" && resources.length > 10 && ( + + )} + + {serviceModel.moduleName === "http" && ( + + {resources + .filter((resource) => { + const search = searchValue.toLowerCase(); + const nameMatch = resource.name && resource.name.toLowerCase().includes(search); + const iconMatch = resource.icon && resource.icon.toLowerCase().includes(search); + return nameMatch || iconMatch; + }) + .map((resource, index) => ( + + ))} + + )} + {serviceModel.moduleName !== "http" && ( + + {serviceModel.functions + .filter( + (functionModel) => functionModel.kind === "REMOTE" && functionModel.enabled + ) + .map((functionModel, index) => ( + { }} + onEditResource={handleFunctionEdit} + onDeleteResource={handleFunctionDelete} + onResourceImplement={handleOpenDiagram} + /> + ))} + + )} )} {functionModel && functionModel.kind === "RESOURCE" && ( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/WelcomeView/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/WelcomeView/index.tsx index 8ea36322cf8..fd094e16f21 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/WelcomeView/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/WelcomeView/index.tsx @@ -179,7 +179,7 @@ export function WelcomeView(props: WelcomeViewProps) { const openSamples = () => { rpcClient.getCommonRpcClient().openExternalUrl({ - url: "https://bi.docs.wso2.com/learn/samples/message-transformation/" + url: "https://bi.docs.wso2.com/integration-guides/integration-as-api/message-transformation/" }) }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/index.tsx index 925faf37976..4254e9428e1 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/index.tsx @@ -92,7 +92,7 @@ export function GraphQLDiagram(props: GraphQLDiagramProps) { const getTypeKindDisplayName = (typeNodeKind?: TypeNodeKind): string => { switch (typeNodeKind) { case "RECORD": - return "Input Object"; + return "Object"; // In edit mode, always show as "Object" case "ENUM": return "Enum"; case "CLASS": @@ -293,8 +293,9 @@ export function GraphQLDiagram(props: GraphQLDiagramProps) { type={editingType} onTypeChange={onTypeChange} newType={false} - isGraphql={true} - /> + isGraphql={true} + onTypeCreate={() => { }} + /> )} {isTypeEditorOpen && editingType && editingType.codedata.node === "CLASS" && ( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/SequenceDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/SequenceDiagram/index.tsx deleted file mode 100644 index 923d24a0c9f..00000000000 --- a/workspaces/ballerina/ballerina-visualizer/src/views/SequenceDiagram/index.tsx +++ /dev/null @@ -1,158 +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 React, { useEffect, useState } from "react"; -import { useRpcContext } from "@wso2/ballerina-rpc-client"; -import { - LowCodeDiagram, - initVisitor, - PositioningVisitor, - SizingVisitor, - SymbolVisitor, - cleanLocalSymbols, - cleanModuleLevelSymbols, - getSymbolInfo, -} from "@wso2/ballerina-low-code-diagram"; -import { NodePosition, STKindChecker, STNode, traversNode } from "@wso2/syntax-tree"; -import styled from "@emotion/styled"; -import { PanelType, useVisualizerContext } from "../../Context"; -import { ComponentInfo, ConnectorInfo, removeStatement, STModification } from "@wso2/ballerina-core"; -import { URI } from "vscode-uri"; -import { fetchConnectorInfo, retrieveUsedAction } from "../Connectors/ConnectorWizard/utils"; - -enum MESSAGE_TYPE { - ERROR, - WARNING, - INFO, -} - -const Container = styled.div` - width: 100%; - height: calc(100vh - 50px); -`; - -const MessageContainer = styled.div({ - width: "100%", - height: "100%", - display: "flex", - justifyContent: "center", - alignItems: "center", -}); - -interface SequenceDiagramProps { - syntaxTree: STNode; - applyModifications: (modifications: STModification[]) => void; -} - -export function SequenceDiagram(props: SequenceDiagramProps) { - const { syntaxTree, applyModifications } = props; - const { rpcClient } = useRpcContext(); - const { setStatementPosition, setActivePanel, setComponentInfo, setActiveFileInfo, activeFileInfo } = useVisualizerContext(); - - useEffect(() => { - getSequenceModel(); - }, [syntaxTree]); - - const getSequenceModel = () => { - rpcClient - .getLangClientRpcClient() - .getSyntaxTree() - .then(async (model) => { - const parsedModel = sizingAndPositioningST(model.syntaxTree); - const filePath = (await rpcClient.getVisualizerLocation()).documentUri; - const fullST = await rpcClient.getLangClientRpcClient().getST({ - documentIdentifier: { uri: URI.file(filePath).toString() } - }); - setActiveFileInfo({ fullST: fullST?.syntaxTree, filePath, activeSequence: parsedModel }); - }); - }; - - // TODO: Refactor this function - function sizingAndPositioningST( - st: STNode, - experimentalEnabled?: boolean, - showMessage?: ( - arg: string, - messageType: MESSAGE_TYPE, - ignorable: boolean, - filePath?: string, - fileContent?: string, - bypassChecks?: boolean - ) => void - ): STNode { - traversNode(st, initVisitor); - const sizingVisitor = new SizingVisitor(experimentalEnabled); - traversNode(st, sizingVisitor); - if (showMessage && sizingVisitor.getConflictResulutionFailureStatus()) { - showMessage( - "Something went wrong in the diagram rendering.", - MESSAGE_TYPE.ERROR, - false, - undefined, - undefined, - true - ); - } - traversNode(st, new PositioningVisitor()); - cleanLocalSymbols(); - cleanModuleLevelSymbols(); - traversNode(st, SymbolVisitor); - const clone = { ...st }; - return clone; - } - - const handleAddComponent = (position: NodePosition) => { - setStatementPosition(position); - setActivePanel({ isActive: true, name: PanelType.CONSTRUCTPANEL }); - } - - const handleEditComponent = async (model: STNode, targetPosition: NodePosition, componentType: string, connectorInfo?: ConnectorInfo) => { - setStatementPosition(targetPosition); - setComponentInfo({ model, position: targetPosition, componentType, connectorInfo }); - setActivePanel({ isActive: true, name: PanelType.STATEMENTEDITOR }); - } - - const handleDeleteComponent = (model: STNode) => { - const modifications: STModification[] = []; - - // delete action - if (STKindChecker.isIfElseStatement(model) && !model.viewState.isMainIfBody) { - const ifElseRemovePosition = model.position; - ifElseRemovePosition.endLine = model.elseBody.elseBody.position.startLine; - ifElseRemovePosition.endColumn = model.elseBody.elseBody.position.startColumn; - - const deleteConfig: STModification = removeStatement(ifElseRemovePosition); - modifications.push(deleteConfig); - applyModifications(modifications); - } else { - const deleteAction: STModification = removeStatement( - model.position - ); - modifications.push(deleteAction); - applyModifications(modifications); - } - } - - return ( - <> - {!!activeFileInfo?.activeSequence && - - } - - ); -} diff --git a/workspaces/ballerina/bi-diagram/src/components/Diagram.tsx b/workspaces/ballerina/bi-diagram/src/components/Diagram.tsx index d962a9b164c..ead7cd4ffa8 100644 --- a/workspaces/ballerina/bi-diagram/src/components/Diagram.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/Diagram.tsx @@ -147,7 +147,6 @@ export function Diagram(props: DiagramProps) { const addTargetVisitor = new LinkTargetVisitor(model, nodes); traverseFlow(flowModel, addTargetVisitor); - console.log(">>> getDiagramData", { flowModel, nodes, links }); return { nodes, links }; }; diff --git a/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx b/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx index 2b9b60ee1d7..ac58153cf18 100644 --- a/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx @@ -77,8 +77,19 @@ const NODE_COLOR_GROUPS = { ], // AI/NP function group - cyan variants - CYAN_FUNCTION_GROUP: ["AGENT_CALL", "NP_FUNCTION", "NP_FUNCTION_CALL"], - + CYAN_FUNCTION_GROUP: [ + "AGENT_CALL", + "NP_FUNCTION", + "NP_FUNCTION_CALL", + "MODEL_PROVIDER", + "VECTOR_KNOWLEDGE_BASE", + "VECTOR_STORE", + "EMBEDDING_PROVIDER", + "MODEL_PROVIDERS", + "VECTOR_KNOWLEDGE_BASES", + "VECTOR_STORES", + "EMBEDDING_PROVIDERS", + ], // Data related - magenta variants MAGENTA_DATA_GROUP: ["VARIABLE", "NEW_DATA", "UPDATE_DATA", "ASSIGN"], @@ -210,6 +221,10 @@ const NODE_ICONS: Record> = FAIL: ({ size, color }) => , RETRY: ({ size, color }) => , AGENT_CALL: ({ size, color }) => , + MODEL_PROVIDERS: ({ size, color }) => , + VECTOR_KNOWLEDGE_BASES: ({ size, color }) => , + VECTOR_STORES: ({ size, color }) => , + EMBEDDING_PROVIDERS: ({ size, color }) => , // Default case for any NodeKind not explicitly handled } as Record>; diff --git a/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx b/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx index 625182715ff..b9e8fe659c4 100644 --- a/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx @@ -52,6 +52,7 @@ import { DiagnosticsPopUp } from "../../DiagnosticsPopUp"; import { nodeHasError } from "../../../utils/node"; import { css } from "@emotion/react"; import { BreakpointMenu } from "../../BreakNodeMenu/BreakNodeMenu"; +import { NodeMetadata } from "@wso2/ballerina-core"; export namespace NodeStyles { export const Node = styled.div` @@ -491,9 +492,10 @@ export function AgentCallNodeWidget(props: AgentCallNodeWidgetProps) { const disabled = model.node.suggested; const nodeTitle = "AI Agent"; const hasError = nodeHasError(model.node); - const tools = model.node.metadata?.data?.tools || []; - if (model.node.metadata.data?.agent) { - model.node.metadata.data.agent = sanitizeAgentData(model.node.metadata.data.agent); + const nodeMetadata = model?.node.metadata.data as NodeMetadata; + const tools = nodeMetadata?.tools || []; + if (nodeMetadata?.agent) { + nodeMetadata.agent = sanitizeAgentData(nodeMetadata.agent); } let containerHeight = NODE_HEIGHT + AGENT_NODE_TOOL_SECTION_GAP + AGENT_NODE_ADD_TOOL_BUTTON_WIDTH + AGENT_NODE_TOOL_GAP * 2; @@ -569,13 +571,13 @@ export function AgentCallNodeWidget(props: AgentCallNodeWidgetProps) { - {model.node.metadata?.data.memory ? ( + {nodeMetadata?.memory ? (
Memory - {model.node.metadata.data.memory?.type || + {nodeMetadata?.memory?.type || "MessageWindowChatMemory"}
@@ -612,9 +614,9 @@ export function AgentCallNodeWidget(props: AgentCallNodeWidgetProps) {
- {model.node.metadata.data?.agent?.role ? ( + {nodeMetadata?.agent?.role ? ( - {model.node.metadata.data.agent.role} + {nodeMetadata?.agent?.role} ) : ( @@ -622,10 +624,10 @@ export function AgentCallNodeWidget(props: AgentCallNodeWidgetProps) { )} - {model.node.metadata.data?.agent?.instructions ? ( + {nodeMetadata?.agent?.instructions ? ( - {model.node.metadata.data.agent.instructions} + {nodeMetadata.agent.instructions} ) : ( @@ -672,7 +674,7 @@ export function AgentCallNodeWidget(props: AgentCallNodeWidgetProps) { fill={ThemeColors.ON_SURFACE} style={{ pointerEvents: "none" }} > - {getLlmModelIcons(model.node.metadata.data.model?.type)} + {getLlmModelIcons(nodeMetadata?.model?.type)} 0) { diff --git a/workspaces/ballerina/component-diagram/src/components/nodes/EntryNode/EntryNodeWidget.tsx b/workspaces/ballerina/component-diagram/src/components/nodes/EntryNode/EntryNodeWidget.tsx index c615a7eda93..aa0c0e21e91 100644 --- a/workspaces/ballerina/component-diagram/src/components/nodes/EntryNode/EntryNodeWidget.tsx +++ b/workspaces/ballerina/component-diagram/src/components/nodes/EntryNode/EntryNodeWidget.tsx @@ -92,6 +92,21 @@ const Accessor = styled(StyledText)` font-family: "GilmerBold"; `; +const ResourceAccessor = styled(StyledText)<{ color?: string }>` + text-transform: uppercase; + font-family: "GilmerBold"; + background-color: ${(props) => props.color}; + color: #FFF; + padding: 4px 8px; + border-radius: 4px; + font-size: 12px; + justify-content: center; + min-width: 60px; + text-align: center; + align-items: center; + font-weight: bold; +`; + const Description = styled(StyledText)` font-size: 12px; max-width: ${ENTRY_NODE_WIDTH - 80}px; @@ -175,6 +190,16 @@ const ViewAllButtonWrapper = styled.div` width: 100%; `; +const colors = { + "GET": '#3d7eff', + "PUT": '#fca130', + "POST": '#49cc90', + "DELETE": '#f93e3e', + "PATCH": '#986ee2', + "OPTIONS": '#0d5aa7', + "HEAD": '#9012fe' +} + interface EntryNodeWidgetProps { model: EntryNodeModel; engine: DiagramEngine; @@ -336,7 +361,7 @@ export function EntryNodeWidget(props: EntryNodeWidgetProps) { onClick={handleOnClick} > {getNodeIcon()} -
+
{getNodeTitle()} {getNodeDescription()}
@@ -386,6 +411,27 @@ export function EntryNodeWidget(props: EntryNodeWidgetProps) { ); } +export function getColorByMethod(method: string) { + switch (method.toUpperCase()) { + case "GET": + return colors.GET; + case "PUT": + return colors.PUT; + case "POST": + return colors.POST; + case "DELETE": + return colors.DELETE; + case "PATCH": + return colors.PATCH; + case "OPTIONS": + return colors.OPTIONS; + case "HEAD": + return colors.HEAD; + default: + return '#876036'; // Default color + } +} + function FunctionBox(props: { func: CDFunction | CDResourceFunction; model: EntryNodeModel; engine: DiagramEngine }) { const { func, model, engine } = props; const [isHovered, setIsHovered] = useState(false); @@ -415,7 +461,9 @@ function FunctionBox(props: { func: CDFunction | CDResourceFunction; model: Entr onMouseLeave={() => setIsHovered(false)} > {(func as CDResourceFunction).accessor && ( - {getAccessorDisplay((func as CDResourceFunction).accessor, isGraphQL)} + + {getAccessorDisplay((func as CDResourceFunction).accessor, isGraphQL)} + )} {isGraphQL && !(func as CDResourceFunction).accessor && (func as CDFunction).name && ( Mutation diff --git a/workspaces/ballerina/type-editor/src/TypeEditor/RecordEditor.tsx b/workspaces/ballerina/type-editor/src/TypeEditor/RecordEditor.tsx index 44872d74889..97a951882c1 100644 --- a/workspaces/ballerina/type-editor/src/TypeEditor/RecordEditor.tsx +++ b/workspaces/ballerina/type-editor/src/TypeEditor/RecordEditor.tsx @@ -44,6 +44,7 @@ interface RecordEditorProps { isAnonymous: boolean; onChange: (type: Type) => void; isGraphql?: boolean; + newType?: boolean; onValidationError: (isError: boolean) => void; } @@ -53,7 +54,7 @@ interface FieldValidationError { } export const RecordEditor = forwardRef<{ addMember: () => void }, RecordEditorProps>((props, ref) => { - const { type, isAnonymous = false, onChange, isGraphql, onValidationError } = props; + const { type, isAnonymous = false, onChange, isGraphql, onValidationError, newType } = props; const [validationErrors, setValidationErrors] = useState([{ identifier: false, type: false }]); const [hasRecordError, setHasRecordError] = useState(false); @@ -119,7 +120,7 @@ export const RecordEditor = forwardRef<{ addMember: () => void }, RecordEditorPr
{!isAnonymous &&
- {isGraphql ? 'Input Object Fields' : 'Fields'} + {isGraphql ? (newType? 'Input Object Fields' : 'Object Fields'): 'Fields'}
diff --git a/workspaces/ballerina/type-editor/src/TypeEditor/Tabs/TypeCreatorTab.tsx b/workspaces/ballerina/type-editor/src/TypeEditor/Tabs/TypeCreatorTab.tsx index 1de72ef4fed..798eaf3c3a8 100644 --- a/workspaces/ballerina/type-editor/src/TypeEditor/Tabs/TypeCreatorTab.tsx +++ b/workspaces/ballerina/type-editor/src/TypeEditor/Tabs/TypeCreatorTab.tsx @@ -413,6 +413,7 @@ export function TypeCreatorTab(props: TypeCreatorTabProps) { type={type} isAnonymous={false} onChange={setType} + newType={newType} isGraphql={isGraphql} onValidationError={handleValidationError} /> diff --git a/workspaces/bi/bi-extension/package.json b/workspaces/bi/bi-extension/package.json index 3801e7dd23e..8914918baac 100644 --- a/workspaces/bi/bi-extension/package.json +++ b/workspaces/bi/bi-extension/package.json @@ -69,7 +69,7 @@ "menus": { "view/item/context": [ { - "command": "ballerina.show.visualizer", + "command": "ballerina.showVisualizer", "when": "view == BI.project-explorer && viewItem == bi-project", "group": "inline" }, @@ -113,6 +113,11 @@ "when": "view == BI.project-explorer && viewItem == configurations", "group": "inline" }, + { + "command": "BI.project-explorer.view-configuration", + "when": "view == BI.project-explorer && viewItem == configurations", + "group": "inline" + }, { "command": "BI.project-explorer.add-data-mapper", "when": "view == BI.project-explorer && viewItem == dataMappers", diff --git a/workspaces/bi/bi-extension/src/project-explorer/project-explorer-provider.ts b/workspaces/bi/bi-extension/src/project-explorer/project-explorer-provider.ts index 0e14b31893e..4eb396051c6 100644 --- a/workspaces/bi/bi-extension/src/project-explorer/project-explorer-provider.ts +++ b/workspaces/bi/bi-extension/src/project-explorer/project-explorer-provider.ts @@ -274,6 +274,17 @@ function getEntriesBI(components: ProjectStructureResponse): ProjectExplorerEntr } entries.push(dataMappers); + // ---------- Configurations ---------- + const configs = new ProjectExplorerEntry( + "Configurations", + vscode.TreeItemCollapsibleState.Expanded, + null, + 'config', + false + ); + configs.contextValue = "configurations"; + entries.push(configs); + // ---------- Natural Functions ---------- if (extension.isNPSupported) { const naturalFunctions = new ProjectExplorerEntry( diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-ai-model.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-ai-model.svg new file mode 100644 index 00000000000..5739f878d3c --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-ai-model.svg @@ -0,0 +1,25 @@ + + + + + + + diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-brain.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-brain.svg new file mode 100644 index 00000000000..35fbdeb0e09 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-brain.svg @@ -0,0 +1,21 @@ + + + + diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-cut.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-cut.svg new file mode 100644 index 00000000000..fe220901cde --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-cut.svg @@ -0,0 +1,21 @@ + + + + diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-db.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-db.svg new file mode 100644 index 00000000000..7dbd75707ca --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-db.svg @@ -0,0 +1,21 @@ + + + + diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-doc.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-doc.svg new file mode 100644 index 00000000000..cbb8b3ae3a5 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-doc.svg @@ -0,0 +1,21 @@ + + + + diff --git a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Common/HelperPane/index.tsx b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Common/HelperPane/index.tsx index 698c96f05aa..071e6bce849 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Common/HelperPane/index.tsx +++ b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Common/HelperPane/index.tsx @@ -65,11 +65,12 @@ export const Arrow = styled.div` ${(props: StyleBase) => props.sx} `; -const PanelViewContainer = styled.div` +const PanelViewContainer = styled.div<{ sx?: CSSProperties }>` height: 100%; display: flex; flex-direction: column; overflow-y: auto; + ${({ sx }: { sx?: CSSProperties }) => sx} `; const PanelTabContainer = styled.div<{ isActive: boolean }>` @@ -155,7 +156,7 @@ const IconButtonContainer = styled.div` & p, & i { - color: var(--vscode-button-background); + color: var(--vscode-notebook-focusedEditorBorder); } & p:hover, @@ -379,13 +380,13 @@ const Loader: React.FC = ({ columns, rows, sections }) => { ); } -const PanelView: React.FC = ({ children, id }) => { +const PanelView: React.FC = ({ children, id, sx }) => { const { activePanelIndex } = useHelperPanePanelContext(); return ( <> {activePanelIndex === id && ( - + {React.Children.toArray(children).length > 0 ? ( children ) : ( diff --git a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Common/types/helperPane.ts b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Common/types/helperPane.ts index 97d162e1a18..31e54ae14e7 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Common/types/helperPane.ts +++ b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Common/types/helperPane.ts @@ -76,6 +76,7 @@ export type LoadingSectionProps = { export type PanelViewProps = PropsWithChildren<{ id: number; + sx?: CSSProperties; }>; export type PanelTabProps = { diff --git a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Form/ExpressionEditor.tsx b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Form/ExpressionEditor.tsx index 754e0c101c4..a386cc996d6 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Form/ExpressionEditor.tsx +++ b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Form/ExpressionEditor.tsx @@ -90,6 +90,7 @@ export const ExpressionEditor = forwardRef { // Position polling to detect any position changes - let lastPosition = { top: 0, left: 0, width: 0, height: 0 }; + let lastPosition = { top: 0, bottom: 0, left: 0, right: 0, width: 0, height: 0 }; let animationFrameId: number; const checkPositionChange = () => { @@ -163,7 +164,9 @@ export const ExpressionEditor = forwardRef - {getHelperPane(value, handleChange, helperPaneHeight)} + {getHelperPane(value, handleChange, helperPaneHeight, height)} {arrowPosition && ( )} diff --git a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Token/index.tsx b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Token/index.tsx index 55ce31ae630..8408a40458a 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Token/index.tsx +++ b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Token/index.tsx @@ -211,7 +211,9 @@ export const TokenEditor = ({ onFocus, onBlur, getExpressionEditorIcon, - editorSx + editorSx, + height, + enableFullscreen = false }: TokenEditorProps) => { const [isFocused, setIsFocused] = useState(false); const containerRef = useRef(null); @@ -226,15 +228,22 @@ export const TokenEditor = ({ const [helperPanePosition, setHelperPanePosition] = useState({ top: 0, left: 0 }); const [helperPaneArrowPosition, setHelperPaneArrowPosition] = useState({ top: 0, left: 0 }); const [calculatedHelperPaneOrigin, setCalculatedHelperPaneOrigin] = useState('auto'); + const [isFullscreen, setIsFullscreen] = useState(false); const monacoEditorRef = useRef(); + let helperPaneStyle: StyleBase; + if (height) { + helperPaneStyle = { sx: { height: `${height}px`, overflowY: 'auto' } }; + } const updatePosition = throttle(() => { if (containerRef.current) { const calculatedHelperPaneOrigin = getHelperPaneWithEditorOrigin(containerRef, helperPaneOrigin); setCalculatedHelperPaneOrigin(calculatedHelperPaneOrigin); - setHelperPanePosition(getHelperPaneWithEditorPosition(containerRef, calculatedHelperPaneOrigin)); + const computedHelperPanePosition = getHelperPaneWithEditorPosition(containerRef, calculatedHelperPaneOrigin); + setHelperPanePosition(computedHelperPanePosition); + const newHelperPanePosition = isFullscreen ? { top: 0, left: computedHelperPanePosition.left } : computedHelperPanePosition; setHelperPaneArrowPosition( - getHelperPaneWithEditorArrowPosition(containerRef, calculatedHelperPaneOrigin, helperPanePosition) + getHelperPaneWithEditorArrowPosition(containerRef, calculatedHelperPaneOrigin, newHelperPanePosition) ); } }, 10); @@ -256,7 +265,7 @@ export const TokenEditor = ({ resizeObserver.disconnect(); }; // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isHelperPaneOpen]); + }, [isHelperPaneOpen, isFullscreen]); const updateNodeInfo = () => { const selection = window.getSelection(); @@ -541,9 +550,20 @@ export const TokenEditor = ({ } } + const handleFullscreenToggle = () => { + setIsFullscreen(!isFullscreen); + }; + + const fullScreenStyle: StyleBase = isFullscreen ? { + sx: { + top: 0, + height: '100vh' + } + } : {}; + const getHelperPaneWithEditorComponent = (): JSX.Element => { return createPortal( - + {/* Title and close button */} Expression Editor - +
+ { enableFullscreen && ( + + )} + +
@@ -591,25 +622,27 @@ export const TokenEditor = ({ - {/* Helper pane content */} - {getHelperPane(handleHelperPaneChange, handleAddFunction)} - - {/* Action buttons for the helper pane */} - - - - +
+ {/* Helper pane content */} + {getHelperPane(handleHelperPaneChange, handleAddFunction, 400, isFullscreen)} + + {/* Action buttons for the helper pane */} + + + + +
{/* Side arrow of the helper pane */} {helperPaneArrowPosition && ( diff --git a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/constants/token.ts b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/constants/token.ts index 716210bbfe4..9f155d7a650 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/constants/token.ts +++ b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/constants/token.ts @@ -18,3 +18,4 @@ export const HELPER_PANE_WITH_EDITOR_WIDTH = 400; export const HELPER_PANE_WITH_EDITOR_HEIGHT = 580; +export const HELPER_PANE_EX_BTN_OFFSET = 20; diff --git a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/types/common.ts b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/types/common.ts index e7e5555addc..d4bf06fa9a5 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/types/common.ts +++ b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/types/common.ts @@ -191,7 +191,7 @@ export type ExpressionEditorRef = { /* <------ Types related to the helper pane ------> */ -export type HelperPaneOrigin = 'bottom' | 'left' | 'right' | 'auto'; +export type HelperPaneOrigin = 'bottom' | 'top' | 'left' | 'right' | 'auto'; export type HelperPaneHeight = 'full' | '3/4' | 'default'; diff --git a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/types/form.ts b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/types/form.ts index 1d7d9fc5824..f28c85b2dd4 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/types/form.ts +++ b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/types/form.ts @@ -30,13 +30,16 @@ type HelperPaneConditionalProps = { helperPaneWidth?: number; // - Helper pane styles helperPaneSx?: CSSProperties; + // - Height of the helper pane in pixels, used when helperPaneHeight is 'default' + height?: number; // - Callback function to open/close the helper pane changeHelperPaneState: (isOpen: boolean) => void; - // - Get the helper panel component + // - Get the helper pane component getHelperPane: ( value: string, onChange: (value: string, updatedCursorPosition: number) => void, - helperPaneHeight: HelperPaneHeight + helperPaneHeight: HelperPaneHeight, + height?: number, ) => ReactNode; // - Get a custom icon for the expression editor getExpressionEditorIcon?: () => ReactNode; @@ -46,6 +49,7 @@ type HelperPaneConditionalProps = { helperPaneHeight?: never; helperPaneWidth?: never; helperPaneSx?: never; + height?: never; changeHelperPaneState?: never; getHelperPane?: never; getExpressionEditorIcon?: never; diff --git a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/types/token.ts b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/types/token.ts index d2f7ff4169b..01d38cc0551 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/types/token.ts +++ b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/types/token.ts @@ -28,16 +28,18 @@ type TokenEditorBaseProps = { actionButtons?: ActionButtonType[]; startAdornment?: ReactNode; endAdornment?: ReactNode; + enableFullscreen?: boolean; onChange: (value: string) => void; onFocus?: () => void; onBlur?: () => void; getExpressionEditorIcon?: () => ReactNode; + height?: number; editorSx?: CSSProperties; }; type HelperPaneConditionalProps = | { - getHelperPane: (onChange: (value: string) => void, addFunction: (signature: string) => void) => JSX.Element; + getHelperPane: (onChange: (value: string) => void, addFunction: (signature: string) => void, height?: number, isFullscreen?: boolean) => JSX.Element; helperPaneOrigin?: HelperPaneOrigin; changeHelperPaneState: (state: boolean) => void; isHelperPaneOpen: boolean; diff --git a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/utils/form.tsx b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/utils/form.tsx index fb5937d1d2e..9ce9ea323ae 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/utils/form.tsx +++ b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/utils/form.tsx @@ -98,6 +98,9 @@ export const getHelperPanePosition = ( if (window.innerHeight - rect.top < HELPER_PANE_HEIGHT / 2) { position.top = window.innerHeight - HELPER_PANE_HEIGHT; } + if (window.innerHeight < HELPER_PANE_HEIGHT) { + position.top = 0; + } return position; }; diff --git a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/utils/token.ts b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/utils/token.ts index 58d5bae222e..b56a50e4ff6 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/utils/token.ts +++ b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/utils/token.ts @@ -22,7 +22,8 @@ import { HELPER_PANE_WITH_EDITOR_HEIGHT, HELPER_PANE_WITH_EDITOR_WIDTH, ARROW_HEIGHT, - ARROW_OFFSET + ARROW_OFFSET, + HELPER_PANE_EX_BTN_OFFSET } from '../constants'; import { HelperPaneOrigin, HelperPanePosition } from '../types'; @@ -105,6 +106,13 @@ export const getHelperPaneWithEditorOrigin = ( return 'left'; } else if (window.innerWidth - (rect.left + rect.width) > HELPER_PANE_WITH_EDITOR_WIDTH + ARROW_HEIGHT) { return 'right'; + } else if (rect.top > window.innerHeight / 2) { + // Checks if there is enough space in the top to display the helper pane + const expTop = rect.top - HELPER_PANE_WITH_EDITOR_HEIGHT - HELPER_PANE_EX_BTN_OFFSET; + if (expTop < 0) { + return 'bottom'; + } + return 'top'; } return 'bottom'; @@ -119,6 +127,9 @@ export const getHelperPaneWithEditorPosition = ( if (helperPaneOrigin === 'bottom') { return { top: rect.top + rect.height, left: rect.left }; } + if (helperPaneOrigin === 'top') { + return { top: (rect.top - HELPER_PANE_WITH_EDITOR_HEIGHT - HELPER_PANE_EX_BTN_OFFSET), left: rect.left }; + } const position: HelperPanePosition = { top: 0, left: 0 }; /* In the best case scenario, the helper pane should be poping up on the right of left side @@ -138,6 +149,9 @@ export const getHelperPaneWithEditorPosition = ( if (window.innerHeight - rect.top < HELPER_PANE_WITH_EDITOR_HEIGHT / 2) { position.top = window.innerHeight - HELPER_PANE_WITH_EDITOR_HEIGHT; } + if (window.innerHeight < HELPER_PANE_WITH_EDITOR_HEIGHT) { + position.top = 0; + } return position; }; diff --git a/workspaces/mi/mi-diagram/src/components/Form/FormExpressionField/index.tsx b/workspaces/mi/mi-diagram/src/components/Form/FormExpressionField/index.tsx index 8ed516bcd22..2b381f00815 100644 --- a/workspaces/mi/mi-diagram/src/components/Form/FormExpressionField/index.tsx +++ b/workspaces/mi/mi-diagram/src/components/Form/FormExpressionField/index.tsx @@ -254,7 +254,6 @@ export const FormExpressionField = (params: FormExpressionFieldProps) => { const cursorPosition = expressionRef.current?.shadowRoot?.querySelector('textarea')?.selectionStart; const updatedValue = currentValue.slice(0, cursorPosition) + value + currentValue.slice(cursorPosition); const updatedCursorPosition = cursorPosition + value.length; - // Update the value in the expression editor onChange(updatedValue, updatedCursorPosition); // Focus the expression editor @@ -274,7 +273,11 @@ export const FormExpressionField = (params: FormExpressionFieldProps) => { position, 'default', () => handleChangeHelperPaneState(false), - handleHelperPaneChange + handleHelperPaneChange, + undefined, + undefined, + 380, + false ); }, [expressionRef.current, handleChangeHelperPaneState, nodeRange, getHelperPane]); @@ -391,7 +394,7 @@ export const FormExpressionField = (params: FormExpressionFieldProps) => {
{!isAIFill && -
+
void, addFunction: (value: string) => void) => { + const handleGetHelperPane = useCallback((onChange: (value: string) => void, addFunction: (value: string) => void, height?: number, isFullscreen?: boolean) => { const position = nodeRange ? nodeRange?.start == nodeRange?.end ? nodeRange.start : { line: nodeRange.start.line, character: nodeRange.start.character + 1 } : undefined; - return getHelperPane( position, 'default', () => handleChangeHelperPaneState(false), onChange, addFunction, - { width: 'auto', border: '1px solid var(--dropdown-border)' } + { width: 'auto', border: '1px solid var(--dropdown-border)' }, + height, + true, + isFullscreen ); }, [nodeRange, handleChangeHelperPaneState, getHelperPane]); @@ -140,6 +142,7 @@ export const FormTokenEditor = ({ actionButtons={actionButtons} getHelperPane={handleGetHelperPane} isHelperPaneOpen={isHelperPaneOpen} + enableFullscreen changeHelperPaneState={setIsHelperPaneOpen} getExpressionEditorIcon={getExpressionEditorIcon} startAdornment={ diff --git a/workspaces/mi/mi-diagram/src/components/Form/HelperPane/CategoryPage.tsx b/workspaces/mi/mi-diagram/src/components/Form/HelperPane/CategoryPage.tsx index dea73526b32..50f4935595e 100644 --- a/workspaces/mi/mi-diagram/src/components/Form/HelperPane/CategoryPage.tsx +++ b/workspaces/mi/mi-diagram/src/components/Form/HelperPane/CategoryPage.tsx @@ -29,6 +29,7 @@ type PanelPageProps = { type CategoryPageProps = { position: Position; + isHelperPaneHeightOverflow?: boolean; setCurrentPage: (page: Page) => void; onClose: () => void; onChange: (value: string) => void; @@ -50,6 +51,7 @@ const DataPanel = ({ setCurrentPage }: PanelPageProps) => { export const CategoryPage = ({ position, + isHelperPaneHeightOverflow = false, setCurrentPage, onChange, addFunction @@ -65,10 +67,10 @@ export const CategoryPage = ({ - + - + diff --git a/workspaces/mi/mi-diagram/src/components/Form/HelperPane/ConfigsPage.tsx b/workspaces/mi/mi-diagram/src/components/Form/HelperPane/ConfigsPage.tsx index 3ea69413d77..a4dce993cf9 100644 --- a/workspaces/mi/mi-diagram/src/components/Form/HelperPane/ConfigsPage.tsx +++ b/workspaces/mi/mi-diagram/src/components/Form/HelperPane/ConfigsPage.tsx @@ -52,6 +52,7 @@ const ButtonPanel = styled.div` type ConfigsPageProps = { position: Position; + hideSearch?: boolean; onChange: (value: string) => void; }; @@ -64,7 +65,7 @@ const schema = yup.object({ type ConfigFormData = yup.InferType; -export const ConfigsPage = ({ position, onChange }: ConfigsPageProps) => { +export const ConfigsPage = ({ position, onChange, hideSearch }: ConfigsPageProps) => { const { rpcClient } = useVisualizerContext(); const firstRender = useRef(true); const [isLoading, setIsLoading] = useState(false); @@ -149,10 +150,12 @@ export const ConfigsPage = ({ position, onChange }: ConfigsPageProps) => { <> {!isFormOpen ? ( <> - + { !hideSearch && ( + + )} {filteredConfigInfo?.map((config) => ( getHelperPaneCompletionItem(config, onChange, getCompletionItemIcon) diff --git a/workspaces/mi/mi-diagram/src/components/Form/HelperPane/FunctionsPage.tsx b/workspaces/mi/mi-diagram/src/components/Form/HelperPane/FunctionsPage.tsx index 74d81ac856a..d43524644c7 100644 --- a/workspaces/mi/mi-diagram/src/components/Form/HelperPane/FunctionsPage.tsx +++ b/workspaces/mi/mi-diagram/src/components/Form/HelperPane/FunctionsPage.tsx @@ -26,12 +26,14 @@ import { filterHelperPaneFunctionCompletionItems } from '../FormExpressionField/ type FunctionsPageProps = { position: Position; + hideSearch?: boolean; onChange: (value: string) => void; addFunction?: (value: string) => void; }; export const FunctionsPage = ({ position, + hideSearch = false, onChange, addFunction }: FunctionsPageProps) => { @@ -124,10 +126,12 @@ export const FunctionsPage = ({ return ( <> - + { !hideSearch && + + } {sortedFunctionInfo.map(({ group, items }) => ( diff --git a/workspaces/mi/mi-diagram/src/components/Form/HelperPane/index.tsx b/workspaces/mi/mi-diagram/src/components/Form/HelperPane/index.tsx index 07918d08039..0c2bd2e6a58 100644 --- a/workspaces/mi/mi-diagram/src/components/Form/HelperPane/index.tsx +++ b/workspaces/mi/mi-diagram/src/components/Form/HelperPane/index.tsx @@ -16,7 +16,7 @@ * under the License. */ -import React, { CSSProperties, useState } from 'react'; +import React, { CSSProperties, useEffect, useRef, useState } from 'react'; import { Position } from 'vscode-languageserver-types'; import { HelperPane, HelperPaneHeight } from '@wso2/ui-toolkit'; import { CategoryPage } from './CategoryPage'; @@ -29,6 +29,9 @@ import { ParamsPage } from './ParamsPage'; export type HelperPaneProps = { position: Position; helperPaneHeight: HelperPaneHeight; + isTokenEditor?: boolean; + isFullscreen?: boolean; + height?: number; onClose: () => void; onChange: (value: string) => void; addFunction?: (value: string) => void; @@ -46,56 +49,154 @@ export const PAGE = { export type Page = (typeof PAGE)[keyof typeof PAGE]; -const HelperPaneEl = ({ position, helperPaneHeight, sx, onClose, onChange, addFunction }: HelperPaneProps) => { +const TOKEN_EDITOR_OFFSET = 180; +const TOKEN_EDITOR_BOTTOM_OFFSET = 40; +const FULLSCREEN_OFFSET = 160; +const FULLSCREEN_DELAY = 200; + +const HelperPaneEl = ({ position, helperPaneHeight, isTokenEditor, isFullscreen, height: componentDefaultHeight, sx, onClose, onChange, addFunction }: HelperPaneProps) => { const [currentPage, setCurrentPage] = useState(PAGE.CATEGORY); + const panelRef = useRef(null); + const timeoutIds = useRef([]); + const [height, setHeight] = useState(400); + const [isComponentOverflowing, setIsComponentOverflowing] = useState(false); + useEffect(() => { + const checkOverflow = () => { + const viewportHeight = window.innerHeight; + if (panelRef.current && !isFullscreen) { + const element = panelRef.current; + const rect = element.getBoundingClientRect(); + // Get children height + const clientHeight = isTokenEditor ? (element.clientHeight + TOKEN_EDITOR_OFFSET) : element.clientHeight; + + const heightDiff = clientHeight - viewportHeight; + let overflowHeight = 0; + let bottomOverflow = 0; + if (heightDiff < 0) { + bottomOverflow = rect.bottom - viewportHeight; + overflowHeight = bottomOverflow + (isTokenEditor ? TOKEN_EDITOR_BOTTOM_OFFSET : 0); + } else { + overflowHeight = heightDiff; + } + const heightWithComponents = clientHeight - overflowHeight - (isTokenEditor ? TOKEN_EDITOR_OFFSET : 0); + const newHeight = heightWithComponents > componentDefaultHeight ? componentDefaultHeight : heightWithComponents; + setIsComponentOverflowing(heightWithComponents < componentDefaultHeight); + setHeight(newHeight); + } else if (isFullscreen) { + setHeight(viewportHeight - FULLSCREEN_OFFSET); // Default height if no panelRef or fullscreen + } + }; + + // Check immediately and on window resize + window.addEventListener('resize', checkOverflow); + window.addEventListener('scroll', checkOverflow); + + // Use multiple timeouts to ensure DOM is ready + timeoutIds.current.push(setTimeout(checkOverflow, 10)); + timeoutIds.current.push(setTimeout(checkOverflow, 100)); // Additional check after longer delay + timeoutIds.current.push(setTimeout(checkOverflow, 300)); // Final check for complex layouts + + return () => { + window.removeEventListener('resize', checkOverflow); + window.removeEventListener('scroll', checkOverflow); + timeoutIds.current.forEach(clearTimeout); // Clear all timeouts + timeoutIds.current = []; // Reset the array + }; + }, [isFullscreen, isTokenEditor, componentDefaultHeight]); + + // Additional effect specifically for fullscreen changes + useEffect(() => { + if (isFullscreen !== undefined) { + const handleFullscreenChange = () => { + // Force recalculation after fullscreen change + setTimeout(() => { + if (panelRef.current) { + const viewportHeight = window.innerHeight; + if (isFullscreen) { + setHeight(viewportHeight - FULLSCREEN_OFFSET); + } else { + // Trigger overflow check for non-fullscreen + const element = panelRef.current; + const rect = element.getBoundingClientRect(); + const clientHeight = isTokenEditor ? (element.clientHeight + 180) : element.clientHeight; + const heightDiff = clientHeight - viewportHeight; + let overflowHeight = 0; + let bottomOverflow = 0; + + if (heightDiff < 0) { + bottomOverflow = rect.bottom - viewportHeight; + if (bottomOverflow < 0) { + overflowHeight = 0; + } else { + overflowHeight = bottomOverflow + (isTokenEditor ? 40 : 0); + } + } else { + overflowHeight = heightDiff; + } + + const heightWithComponents = clientHeight - overflowHeight - (isTokenEditor ? 180 : 0); + const newHeight = heightWithComponents > componentDefaultHeight ? componentDefaultHeight : heightWithComponents; + setIsComponentOverflowing(heightWithComponents < componentDefaultHeight); + setHeight(newHeight); + } + } + }, FULLSCREEN_DELAY); // Wait longer for layout changes + }; + + handleFullscreenChange(); + } + }, [isFullscreen]); return ( - - {currentPage === PAGE.CATEGORY && ( - - )} - {currentPage === PAGE.PAYLOAD && ( - - )} - {currentPage === PAGE.VARIABLES && ( - - )} - {currentPage === PAGE.HEADERS && ( - - )} - {currentPage === PAGE.PARAMS && ( - - )} - {currentPage === PAGE.PROPERTIES && ( - - )} - +
+ + {currentPage === PAGE.CATEGORY && ( + + )} + {currentPage === PAGE.PAYLOAD && ( + + )} + {currentPage === PAGE.VARIABLES && ( + + )} + {currentPage === PAGE.HEADERS && ( + + )} + {currentPage === PAGE.PARAMS && ( + + )} + {currentPage === PAGE.PROPERTIES && ( + + )} + +
); }; @@ -105,7 +206,10 @@ export const getHelperPane = ( onClose: () => void, onChange: (value: string) => void, addFunction?: (value: string) => void, - sx?: CSSProperties + sx?: CSSProperties, + height?: number, + isTokenEditor?: boolean, + isFullscreen?: boolean ) => { return ( ); }; diff --git a/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts b/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts index 4113b35d317..e1ecafc1a4e 100644 --- a/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts +++ b/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts @@ -178,7 +178,13 @@ export class MiVisualizerRpcManager implements MIVisualizerAPI { const projectName = projectDetails.primaryDetails.projectName.value; await langClient?.updateConnectorDependencies(); await extractCAppDependenciesAsProjects(projectName); - await langClient?.loadDependentCAppResources(); + const loadResult = await langClient?.loadDependentCAppResources(); + if (loadResult.startsWith("DUPLICATE ARTIFACTS")) { + await window.showWarningMessage( + loadResult, + { modal: true } + ); + } resolve(true); }); } diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/artifactTests/artifact.spec.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/artifactTests/artifact.spec.ts index df76b9d9375..c86f9c86a90 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/artifactTests/artifact.spec.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/artifactTests/artifact.spec.ts @@ -240,6 +240,9 @@ export default function createTests() { await ballerinaModule.openFromMediatorPaletteAndBuild(ballerinaModuleName); console.log('Create Ballerina Module from Project Explorer'); await ballerinaModule.createBallerinaModuleFromProjectExplorer("TestNewBallerinaModule" + testAttempt); + console.log('Uninstall Ballerina Extension'); + await ballerinaModule.removeBallerinaExtension(); + console.log('Successfully uninstalled Ballerina Extension'); await toggleNotifications(true); }); diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/ArtifactTest/BallerinaModule.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/ArtifactTest/BallerinaModule.ts index bc9a396e33f..fb34290df16 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/ArtifactTest/BallerinaModule.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/ArtifactTest/BallerinaModule.ts @@ -166,4 +166,13 @@ export class BallerinaModule { const notificationAlert = await page.page.getByText('Ballerina module build successful', { exact: true }) await expect(notificationAlert).toBeVisible({ timeout: 40000 }); } + + public async removeBallerinaExtension() { + await page.page.keyboard.press('Control+Shift+X'); + await page.page.keyboard.type('WSO2 Integrator BI'); + await page.page.getByText('WSO2 Integrator: BI').click(); + await page.page.getByRole('button', { name: 'Uninstall' }).click(); + await page.executePaletteCommand("Developer: Reload Window"); + await page.selectSidebarItem('WSO2 Integrator: MI'); + } } diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/UnitTest.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/UnitTest.ts index ce20decf596..ca1961ea51e 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/UnitTest.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/UnitTest.ts @@ -444,7 +444,7 @@ export class UnitTest { await testExplorer.init(); await testExplorer.findItem([`${this.projectName} (Not yet run)`, `${name} (Not yet run)`], true); console.log(`Expand the explorer to ensure the unit test "${name}" is visible`); - await this._page.getByRole('button', { name: 'Add test case' }).click(); + await this._page.getByLabel('Add test case').click(); console.log(`Clicked on "Add test case" button for unit test "${name}"`); } diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/Welcome.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/Welcome.ts index f808e5fb612..644bd5ff7ba 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/Welcome.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/Welcome.ts @@ -51,7 +51,7 @@ export class Welcome { } public async waitUntilDeattached() { - await this.page.page.waitForSelector('iframe.webview.ready', { state: 'detached', timeout: 20000 }); + await this.page.page.waitForSelector('iframe.webview.ready', { state: 'detached', timeout: 40000 }); } public async setupEnvironment() { diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/multiWorkspaceTests/multiWorkspace.spec.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/multiWorkspaceTests/multiWorkspace.spec.ts index a75bc193200..439f22b6c6f 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/multiWorkspaceTests/multiWorkspace.spec.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/multiWorkspaceTests/multiWorkspace.spec.ts @@ -21,9 +21,10 @@ import { clearNotificationAlerts, initTest, page, showNotifications, resumeVSCod import { ProjectExplorer } from '../components/ProjectExplorer'; import { Overview } from '../components/Overview'; import { AddArtifact } from '../components/AddArtifact'; -import { switchToIFrame } from '@wso2/playwright-vscode-tester'; +import { getVsCodeButton, switchToIFrame } from '@wso2/playwright-vscode-tester'; import { Form } from '../components/Form'; import path from 'path'; +import { MACHINE_VIEW } from "@wso2/mi-core"; export default function createTests() { test.describe('Multi Workspace Tests', { @@ -88,6 +89,13 @@ export default function createTests() { console.log("Creating new project for second API"); multiWorkspaceName = `newMultiProjectTestAPI${testAttempt}`; await page.page.getByRole('button', { name: 'Create New Project' }).click(); + const webview = await switchToIFrame(MACHINE_VIEW.Welcome, page.page, 20000) + if (!webview) { + throw new Error("Failed to switch to Design View iframe"); + } + const container = webview.locator('div#root'); + const newProjectbtn = await getVsCodeButton(container, 'Create New Project', 'primary'); + await newProjectbtn.click(); console.log("Clicked on Create New Project button"); const apiWebView = await switchToIFrame('Project Creation Form', page.page); if (!apiWebView) { diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/projectTests/createProject.spec.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/projectTests/createProject.spec.ts index c4a48956e28..873426de2cf 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/projectTests/createProject.spec.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/projectTests/createProject.spec.ts @@ -46,7 +46,7 @@ export default function createTests() { await test.step("Create New Project from Sample", async () => { console.log('Starting to create a new project from sample'); - await page.executePaletteCommand("MI: Open MI Welcome"); + await page.executePaletteCommand("MI: Create New Project"); const welcomePage = new Welcome(page); await welcomePage.init(); console.log('Creating new project from sample'); diff --git a/workspaces/mi/mi-extension/src/util/migrationUtils.ts b/workspaces/mi/mi-extension/src/util/migrationUtils.ts index 729f10e0004..9f8ce3953f5 100644 --- a/workspaces/mi/mi-extension/src/util/migrationUtils.ts +++ b/workspaces/mi/mi-extension/src/util/migrationUtils.ts @@ -78,6 +78,12 @@ type FileInfo = { projectType?: Nature; }; +type PomResolutionResult = { + success: boolean; + content?: string; + error?: string; +}; + interface ArtifactsRoot { artifacts: { artifact?: Artifact | Artifact[]; @@ -262,7 +268,14 @@ export async function generateProjectDirToResolvedPomMap(multiModuleProjectDir: const projectDirToResolvedPomMap = new Map(); await copyMavenWrapper(extension.context.asAbsolutePath(path.join('resources', 'maven-wrapper')), multiModuleProjectDir); - const resolvedPomContent = await getResolvedPomXmlContent(path.join(multiModuleProjectDir, 'pom.xml')); + const pomResolvedResult = await getResolvedPomXmlContent(path.join(multiModuleProjectDir, 'pom.xml')); + if (!pomResolvedResult.success) { + await window.showWarningMessage( + `Migration may fail: Unable to resolve the root pom.xml in ${multiModuleProjectDir}.\nError: ${pomResolvedResult.error}`, + { modal: true } + ); + } + const resolvedPomContent = pomResolvedResult.content || ''; const projectRegex = //g; let match; @@ -309,7 +322,7 @@ export function getProjectDetails(filePath: string, projectDirToResolvedPomMap?: const pomPath = path.join(filePath, "pom.xml"); if (fs.existsSync(pomPath)) { - if (projectDirToResolvedPomMap) { + if (projectDirToResolvedPomMap && projectDirToResolvedPomMap.get(filePath)) { const resolvedPomContent = projectDirToResolvedPomMap.get(filePath); const parser = new XMLParser({ ignoreAttributes: false }); const parsed = resolvedPomContent ? parser.parse(resolvedPomContent) : {}; @@ -726,7 +739,7 @@ function extractXmlFromMavenOutput(output: string): string | null { * @param pomFilePath - The absolute path to the `pom.xml` file for which to resolve the effective POM. * @returns A promise that resolves to the effective POM XML content as a string, or an empty string if extraction fails. */ -export async function getResolvedPomXmlContent(pomFilePath: string): Promise { +export async function getResolvedPomXmlContent(pomFilePath: string): Promise { const mvnCmd = process.platform === "win32" ? ".\\mvnw.cmd" : "./mvnw"; const command = `${mvnCmd} -f "${pomFilePath}" help:effective-pom`; const pomDir = path.dirname(pomFilePath); @@ -757,20 +770,23 @@ export async function getResolvedPomXmlContent(pomFilePath: string): Promise { - console.error(`Failed to run Maven help:effective-pom for ${pomFilePath}`, err); - resolve(''); + console.error(`Failed to run 'mvn help:effective-pom -f ${pomFilePath}'`, err); + const errMsg = `Failed to obtain effective-pom for '${pomFilePath}': ${err.message}`; + resolve({ success: false, error: errMsg }); }); }); } @@ -1487,7 +1503,17 @@ function readPomDependencies(source: string, projectDirToResolvedPomMap: Map Date: Fri, 25 Jul 2025 12:46:55 +0530 Subject: [PATCH 134/349] Update extension patch version --- workspaces/ballerina/ballerina-extension/package.json | 2 +- workspaces/bi/bi-extension/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 97966ca24e8..4fb7ac679de 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.2.0", + "version": "5.2.1", "publisher": "wso2", "icon": "resources/images/ballerina.png", "homepage": "https://wso2.com/ballerina/vscode/docs", diff --git a/workspaces/bi/bi-extension/package.json b/workspaces/bi/bi-extension/package.json index 8914918baac..5dea0196d3e 100644 --- a/workspaces/bi/bi-extension/package.json +++ b/workspaces/bi/bi-extension/package.json @@ -2,7 +2,7 @@ "name": "ballerina-integrator", "displayName": "WSO2 Integrator: BI", "description": "An extension which gives a development environment for designing, developing, debugging, and testing integration solutions.", - "version": "1.1.0", + "version": "1.1.1", "publisher": "wso2", "icon": "resources/images/wso2-ballerina-integrator-logo.png", "repository": { From b62504994823c60062458fdeedeeb107e959dc13 Mon Sep 17 00:00:00 2001 From: madushajg Date: Thu, 24 Jul 2025 19:28:03 +0530 Subject: [PATCH 135/349] Handle cases where fields being null from BE --- .../ArrayOutput/ArrayOuptutFieldWidget.tsx | 6 +-- .../ArrayOutput/OutputFieldPreviewWidget.tsx | 40 +++++++++++-------- .../Diagram/Node/Input/InputNode.ts | 2 +- .../Node/Input/InputNodeTreeItemWidget.tsx | 4 +- .../Diagram/Node/Input/InputNodeWidget.tsx | 5 ++- .../Node/LinkConnector/LinkConnectorNode.ts | 4 +- .../ObjectOutput/ObjectOutputFieldWidget.tsx | 8 ++-- .../QueryExprConnectorNode.ts | 4 +- .../QueryExprConnectorNodeWidget.tsx | 2 +- .../Node/SubMapping/SubMappingItemWidget.tsx | 5 ++- .../Diagram/Node/commons/DataMapperNode.ts | 28 ++++++------- .../components/Diagram/utils/common-utils.ts | 2 +- .../components/Diagram/utils/link-utils.ts | 4 +- .../Diagram/utils/modification-utils.ts | 2 +- .../components/Diagram/utils/search-utils.ts | 20 +++++----- 15 files changed, 75 insertions(+), 61 deletions(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/ArrayOutput/ArrayOuptutFieldWidget.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/ArrayOutput/ArrayOuptutFieldWidget.tsx index 5fb9bdbe05d..6948b1fdbad 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/ArrayOutput/ArrayOuptutFieldWidget.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/ArrayOutput/ArrayOuptutFieldWidget.tsx @@ -75,7 +75,7 @@ export function ArrayOutputFieldWidget(props: ArrayOutputFieldWidgetProps) { const expandedFieldsStore = useDMExpandedFieldsStore(); const setExprBarFocusedPort = useDMExpressionBarStore(state => state.setFocusedPort); - const arrayField = field.member; + const arrayField = field?.member; const typeName = getTypeName(field); let portName = getSanitizedId(parentId); @@ -101,7 +101,7 @@ export function ArrayOutputFieldWidget(props: ArrayOutputFieldWidgetProps) { indentation += 24; } - const hasDefaultValue = expression && getDefaultValue(field.kind) === expression.trim(); + const hasDefaultValue = expression && getDefaultValue(field?.kind) === expression.trim(); let isDisabled = portIn?.attributes.descendantHasValue; if (!isDisabled && !hasDefaultValue && portIn) { @@ -382,7 +382,7 @@ export function ArrayOutputFieldWidget(props: ArrayOutputFieldWidgetProps) {
)} - {(expanded && !connectedViaLink && !elements?.length) && ( + {(expanded && !connectedViaLink && !elements?.length && arrayField) && ( f !== null)) || (isArray && [field.member]); + const fields = (isRecord && field?.fields?.filter(f => f !== null)) || (isArray && [field?.member]); const handleExpand = () => { - if (field.kind === TypeKind.Array){ + if (field?.kind === TypeKind.Array){ const expandedFields = expandedFieldsStore.fields; if (expanded) { expandedFieldsStore.setFields(expandedFields.filter((element) => element !== portName)); @@ -183,20 +183,26 @@ export function OutputFieldPreviewWidget(props: OutputFieldPreviewWidgetProps) {
{fields && expanded && - fields.map((subField, index) => { - return ( - - ); - }) + fields + .filter((subField) => subField) + .map((subField, index) => { + const fieldKey = subField.variableName + ? `${portName}.${subField.variableName}` + : `${portName}.${index}`; + + return ( + + ); + }) } ); diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNode.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNode.ts index e65cd59183f..0f8f848726b 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNode.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNode.ts @@ -66,7 +66,7 @@ export class InputNode extends DataMapperNodeModel { }); if (this.filteredInputType.kind === TypeKind.Record) { - const fields = this.filteredInputType.fields; + const fields = this.filteredInputType.fields?.filter(f => f !== null); fields.forEach((subField) => { this.numberOfFields += this.addPortsForInputField({ field: subField, diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNodeTreeItemWidget.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNodeTreeItemWidget.tsx index 22b8a1c76ea..024821ceb43 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNodeTreeItemWidget.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNodeTreeItemWidget.tsx @@ -158,7 +158,9 @@ export function InputNodeTreeItemWidget(props: InputNodeTreeItemWidgetProps) { )} {fields && expanded && - fields.map((subField, index) => { + fields + ?.filter(f => !!f) + .map((subField, index) => { return ( { - dmType.fields.map((field, index) => { + dmType + ?.fields + ?.filter(f => !!f) + .map((field, index) => { return ( { - const inputField = field.split('.').pop(); + const inputField = field?.split('.').pop(); const matchedSearch = inputSearch === "" || inputField.toLowerCase().includes(inputSearch.toLowerCase()); if (!matchedSearch) return; const inputNode = findInputNode(field, this, focusedSourceField); if (inputNode) { - const inputPort = getInputPort(inputNode, field.replace(/\.\d+/g, '')); + const inputPort = getInputPort(inputNode, field?.replace(/\.\d+/g, '')); if (!this.sourcePorts.some(port => port.getID() === inputPort.getID())) { this.sourcePorts.push(inputPort); } diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/ObjectOutput/ObjectOutputFieldWidget.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/ObjectOutput/ObjectOutputFieldWidget.tsx index f4047e9c17e..2ed660ee94b 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/ObjectOutput/ObjectOutputFieldWidget.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/ObjectOutput/ObjectOutputFieldWidget.tsx @@ -71,7 +71,7 @@ export function ObjectOutputFieldWidget(props: ObjectOutputFieldWidgetProps) { let expanded = true; const typeName = getTypeName(field); - const typeKind = field.kind; + const typeKind = field?.kind; const isArray = typeKind === TypeKind.Array; const isRecord = typeKind === TypeKind.Record; @@ -86,9 +86,9 @@ export function ObjectOutputFieldWidget(props: ObjectOutputFieldWidgetProps) { const mapping = portIn && portIn.attributes.value; const { inputs, expression, diagnostics } = mapping || {}; const connectedViaLink = inputs?.length > 0; - const hasDefaultValue = expression && getDefaultValue(field.kind) === expression.trim(); + const hasDefaultValue = expression && getDefaultValue(field?.kind) === expression.trim(); - const fields = isRecord && field.fields.filter(f => f !== null); + const fields = isRecord && field?.fields?.filter(f => f !== null); const isWithinArray = fieldIndex !== undefined; const handleExpand = () => { @@ -107,7 +107,7 @@ export function ObjectOutputFieldWidget(props: ObjectOutputFieldWidgetProps) { const handleAddValue = async () => { setLoading(true); try { - const defaultValue = getDefaultValue(field.kind); + const defaultValue = getDefaultValue(field?.kind); await addValue(fieldFQNFromPortName(portName), defaultValue, context); } finally { setLoading(false); diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryExprConnector/QueryExprConnectorNode.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryExprConnector/QueryExprConnectorNode.ts index 0c09ac942b5..c47021de0d7 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryExprConnector/QueryExprConnectorNode.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryExprConnector/QueryExprConnectorNode.ts @@ -77,14 +77,14 @@ export class QueryExprConnectorNode extends DataMapperNodeModel { const focusedSourceField = views[views.length - 1].sourceField; this.mapping.inputs.forEach((field) => { - const inputField = field.split('.').pop(); + const inputField = field?.split('.').pop(); const matchedSearch = inputSearch === "" || inputField.toLowerCase().includes(inputSearch.toLowerCase()); if (!matchedSearch) return; const inputNode = findInputNode(field, this, focusedSourceField); if (inputNode) { - const inputPort = getInputPort(inputNode, field.replace(/\.\d+/g, '')); + const inputPort = getInputPort(inputNode, field?.replace(/\.\d+/g, '')); if (!this.sourcePorts.some(port => port.getID() === inputPort.getID())) { this.sourcePorts.push(inputPort); } diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryExprConnector/QueryExprConnectorNodeWidget.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryExprConnector/QueryExprConnectorNodeWidget.tsx index 6ed5f57ad2a..65768e4c1cd 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryExprConnector/QueryExprConnectorNodeWidget.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryExprConnector/QueryExprConnectorNodeWidget.tsx @@ -70,7 +70,7 @@ export function QueryExprConnectorNodeWidget(props: QueryExprConnectorNodeWidget collapsedFieldsStore.removeField(targetPort); expandedFieldsStore.removeField(targetPort); - expandArrayFn(node.context, node.sourcePorts[0].attributes.field.id, node.targetMappedPort.attributes.value?.output); + expandArrayFn(node.context, node.sourcePorts[0].attributes.field?.id, node.targetMappedPort.attributes.value?.output); }; const loadingScreen = ( diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/SubMapping/SubMappingItemWidget.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/SubMapping/SubMappingItemWidget.tsx index d735c682ad1..5b2351b3ff8 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/SubMapping/SubMappingItemWidget.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/SubMapping/SubMappingItemWidget.tsx @@ -215,7 +215,10 @@ export function SubMappingItemWidget(props: SubMappingItemProps) { { expanded && isRecord && hasFields && ( - {type.fields.map((field, index) => { + {type + ?.fields + ?.filter(f => !!f) + .map((field, index) => { return ( f !== null); if (fields && fields.length) { fields.forEach(subField => { numberOfFields += this.addPortsForInputField({ @@ -331,9 +331,9 @@ export abstract class DataMapperNodeModel extends NodeModel input.id === focusedMemberId); if (focusedMemberField) { @@ -344,22 +344,22 @@ export abstract class DataMapperNodeModel extends NodeModel f !== null); + const fields = attributes.field?.fields?.filter(f => f !== null); if (fields && fields.length) { fields.forEach((subField) => { this.addPortsForOutputField({ @@ -377,7 +377,7 @@ export abstract class DataMapperNodeModel extends NodeModel { this.addPortsForOutputField({ ...attributes, - field: attributes.field.member, + field: attributes.field?.member, mappings: element.mappings, elementIndex: index }); @@ -385,7 +385,7 @@ export abstract class DataMapperNodeModel extends NodeModel { return field; } - if (field.kind === TypeKind.Record) { - const matchedSubFields: IOType[] = field.fields + if (field?.kind === TypeKind.Record) { + const matchedSubFields: IOType[] = field?.fields ?.map((fieldItem) => getFilteredSubFields(fieldItem, searchValue)) .filter((fieldItem): fieldItem is IOType => fieldItem !== null); - const matchingName = field.variableName?.toLowerCase().includes(searchValue.toLowerCase()); + const matchingName = field?.variableName?.toLowerCase().includes(searchValue.toLowerCase()); if (matchingName || matchedSubFields?.length > 0) { return { ...field, - fields: matchingName ? field.fields : matchedSubFields + fields: matchingName ? field?.fields : matchedSubFields } } - } else if (field.kind === TypeKind.Array) { - const matchedSubFields: IOType[] = field.member?.fields + } else if (field?.kind === TypeKind.Array) { + const matchedSubFields: IOType[] = field?.member?.fields ?.map((fieldItem) => getFilteredSubFields(fieldItem, searchValue)) .filter((fieldItem): fieldItem is IOType => fieldItem !== null); - const matchingName = field.variableName?.toLowerCase().includes(searchValue.toLowerCase()); + const matchingName = field?.variableName?.toLowerCase().includes(searchValue.toLowerCase()); if (matchingName || matchedSubFields?.length > 0) { return { ...field, memberType: { - ...field.member, - fields: matchingName ? field.member?.fields : matchedSubFields + ...field?.member, + fields: matchingName ? field?.member?.fields : matchedSubFields } } } } else { - return field.variableName?.toLowerCase()?.includes(searchValue.toLowerCase()) ? field : null + return field?.variableName?.toLowerCase()?.includes(searchValue.toLowerCase()) ? field : null } return null; From 7ca2e4eef575471d382bc57f2a73bc2a394d8db2 Mon Sep 17 00:00:00 2001 From: madushajg Date: Fri, 25 Jul 2025 13:39:36 +0530 Subject: [PATCH 136/349] Fix issues in global scorlling --- .../Actions/IONodesScrollCanvasAction.ts | 139 ++++++++---------- 1 file changed, 58 insertions(+), 81 deletions(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Actions/IONodesScrollCanvasAction.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Actions/IONodesScrollCanvasAction.ts index 439ef584c76..8688fee82ca 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Actions/IONodesScrollCanvasAction.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Actions/IONodesScrollCanvasAction.ts @@ -68,63 +68,18 @@ export class IONodesScrollCanvasAction extends Action { isOutputScrollable = isOutputNode(element); } - let yDelta = options.inverseZoom ? - deltaY : deltaY; + let yDelta = (options.inverseZoom ? - deltaY : deltaY) as number; const diagramEngine = this.engine as DiagramEngine; - const inputNodes = getInputNodes(diagramEngine); - const ouputNode = getOutputNode(diagramEngine); - if (isInputScrollable) { - - const totalHeight = inputNodes.reduce((acc, node) => acc + node.height, 0); - const averageHeight = totalHeight / inputNodes.length; - let scrollStep = Math.min(Math.abs(yDelta), averageHeight / 2) * Math.sign(yDelta); - - const firstNode = inputNodes[0]; - const lastNode = inputNodes[inputNodes.length - 1]; - - if (firstNode) { - const newY = firstNode.getY() - scrollStep; - if (newY >= 0 && scrollStep < 0) { - // If the first node is at the top of the canvas, do not scroll further - scrollStep = firstNode.getY(); - } - } - - if (lastNode) { - const newY = lastNode.getY() - scrollStep; - const nodeBottomY = newY + lastNode.height; - if (nodeBottomY < MIN_VISIBLE_HEIGHT ) { - // If the last node is at the bottom of the canvas, do not scroll further - scrollStep = lastNode.getY() + lastNode.height - MIN_VISIBLE_HEIGHT; - } - } - inputNodes.forEach(element => { - element.setPosition(element.getX(), element.getY() - scrollStep); - }); + if (isInputScrollable) { + handleInputScroll(diagramEngine, yDelta); } else if (isOutputScrollable) { - - if (ouputNode) { - let scrollStep = Math.min(Math.abs(yDelta), ouputNode.height / 2) * Math.sign(yDelta); - let newY = ouputNode.getY() - scrollStep; - const nodeBottomY = newY + ouputNode.height; - if (newY >= 0 && scrollStep < 0) { - // If the output node is at the top of the canvas, do not scroll further - scrollStep = ouputNode.getY(); - } - if (nodeBottomY < MIN_VISIBLE_HEIGHT) { - // If the output node is at the bottom of the canvas, do not scroll further - scrollStep = ouputNode.getY() + ouputNode.height - MIN_VISIBLE_HEIGHT; - } - ouputNode.setPosition(ouputNode.getX(), ouputNode.getY() - scrollStep); - } - ouputNode && repositionIntermediateNodes(ouputNode); - - } else if (!element) { - yDelta = getYDeltaForGlobalScroll(diagramEngine, yDelta, zoomOffset); - const offsetY = Math.min(0, model.getOffsetY() - yDelta); - model.setOffset(model.getOffsetX(), offsetY); + handleOutputScroll(diagramEngine, yDelta); + } else { + handleInputScroll(diagramEngine, yDelta); + handleOutputScroll(diagramEngine, yDelta); } this.engine.repaintCanvas(); @@ -138,6 +93,57 @@ export class IONodesScrollCanvasAction extends Action { } } +function handleInputScroll(diagramEngine: DiagramEngine, yDelta: number) { + const inputNodes = getInputNodes(diagramEngine); + const totalHeight = inputNodes.reduce((acc, node) => acc + node.height, 0); + const averageHeight = totalHeight / inputNodes.length; + let scrollStep = Math.min(Math.abs(yDelta), averageHeight / 2) * Math.sign(yDelta); + + const firstNode = inputNodes[0]; + const lastNode = inputNodes[inputNodes.length - 1]; + + if (firstNode) { + const newY = firstNode.getY() - scrollStep; + if (newY >= 0 && scrollStep < 0) { + // If the first node is at the top of the canvas, do not scroll further + scrollStep = firstNode.getY(); + } + } + + if (lastNode) { + const newY = lastNode.getY() - scrollStep; + const nodeBottomY = newY + lastNode.height; + if (nodeBottomY < MIN_VISIBLE_HEIGHT) { + // If the last node is at the bottom of the canvas, do not scroll further + scrollStep = lastNode.getY() + lastNode.height - MIN_VISIBLE_HEIGHT; + } + } + + inputNodes.forEach(element => { + element.setPosition(element.getX(), element.getY() - scrollStep); + }); + +} + +function handleOutputScroll(diagramEngine: DiagramEngine, yDelta: number) { + const outputNode = getOutputNode(diagramEngine); + if (outputNode) { + let scrollStep = Math.min(Math.abs(yDelta), outputNode.height / 2) * Math.sign(yDelta); + let newY = outputNode.getY() - scrollStep; + const nodeBottomY = newY + outputNode.height; + if (newY >= 0 && scrollStep < 0) { + // If the output node is at the top of the canvas, do not scroll further + scrollStep = outputNode.getY(); + } + if (nodeBottomY < MIN_VISIBLE_HEIGHT) { + // If the output node is at the bottom of the canvas, do not scroll further + scrollStep = outputNode.getY() + outputNode.height - MIN_VISIBLE_HEIGHT; + } + outputNode.setPosition(outputNode.getX(), outputNode.getY() - scrollStep); + repositionIntermediateNodes(outputNode); + } +} + function getInputNodes(diagramEngine: DiagramEngine) { return diagramEngine.getModel().getNodes().filter(node => isInputNode(node)); } @@ -162,32 +168,3 @@ function repositionIntermediateNodes(outputNode: NodeModel) { } } } - - -function getYDeltaForGlobalScroll(diagramEngine: DiagramEngine, yDelta: number, zoomOffset: number) { - let newYDelta = yDelta; - const model = diagramEngine.getModel(); - const offsetY = model.getOffsetY() * zoomOffset; - - const lastInputNode = getInputNodes(diagramEngine).pop(); - const outputNode = getOutputNode(diagramEngine); - - if (!lastInputNode || !outputNode) return; // When data import nodes present - - const nodeWithMaxBottomY = [lastInputNode, outputNode].reduce((prevNode, currentNode) => { - return prevNode.getBoundingBox().getBottomLeft().y > currentNode.getBoundingBox().getBottomLeft().y - ? prevNode - : currentNode; - }); - - const nodeOffsetY = nodeWithMaxBottomY.getY() < 0 ? nodeWithMaxBottomY.getY() : 0; - let newY = offsetY - yDelta; - const visibleHeight = newY + nodeWithMaxBottomY.height + nodeOffsetY; - - if (visibleHeight < MIN_VISIBLE_HEIGHT ) { - // If the tallest node is at the bottom of the canvas, do not scroll further - newYDelta = offsetY + nodeWithMaxBottomY.height - MIN_VISIBLE_HEIGHT + nodeOffsetY; - } - - return newYDelta; -} From 57ac52b08fa0d9a761cad0d1beef79ae573098f8 Mon Sep 17 00:00:00 2001 From: madushajg Date: Fri, 25 Jul 2025 14:16:18 +0530 Subject: [PATCH 137/349] Fixes in primitive output node --- .../PrimitiveOutput/PrimitiveOutputNode.ts | 39 ++++++++++--------- .../PrimitiveOutput/PrimitiveOutputWidget.tsx | 13 ++++--- 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputNode.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputNode.ts index be9ea0f2596..d591fb8ddb8 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputNode.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputNode.ts @@ -108,8 +108,7 @@ export class PrimitiveOutputNode extends DataMapperNodeModel { private createLinks(mappings: Mapping[]) { - const query = this.context.model.query; - const { inputs: queryInputs, output: queryOutput} = query; + const query = this.context.model?.query; mappings.forEach((mapping) => { const { isComplex, isQueryExpression, inputs, output, expression, diagnostics } = mapping; @@ -137,7 +136,7 @@ export class PrimitiveOutputNode extends DataMapperNodeModel { value: expression, link: lm, deleteLink: () => this.deleteField(mapping), - ...(queryOutput === output && {collectClauseFn: query.resultClause.properties.func}) + ...(query?.output === output && {collectClauseFn: query?.resultClause?.properties?.func}) } )); @@ -157,29 +156,31 @@ export class PrimitiveOutputNode extends DataMapperNodeModel { } }); + if (query) { + const { inputs: queryInputs, output: queryOutput} = query; - const inputNode = findInputNode(queryInputs[0], this); - let inPort: InputOutputPortModel; - if (inputNode) { - inPort = getInputPort(inputNode, queryInputs[0].replace(/\.\d+/g, '')); - } + const inputNode = findInputNode(queryInputs[0], this); + let inPort: InputOutputPortModel; + if (inputNode) { + inPort = getInputPort(inputNode, queryInputs[0].replace(/\.\d+/g, '')); + } - const [_, mappedOutPort] = getOutputPort(this, `${queryOutput}.HEADER`); + const [_, mappedOutPort] = getOutputPort(this, `${queryOutput}.HEADER`); - if (inPort && mappedOutPort) { - const lm = new DataMapperLinkModel(undefined, undefined, true, undefined, true); + if (inPort && mappedOutPort) { + const lm = new DataMapperLinkModel(undefined, undefined, true, undefined, true); - lm.setTargetPort(mappedOutPort); - lm.setSourcePort(inPort); - inPort.addLinkedPort(mappedOutPort); + lm.setTargetPort(mappedOutPort); + lm.setSourcePort(inPort); + inPort.addLinkedPort(mappedOutPort); - lm.addLabel(new ExpressionLabelModel({ - isQuery: true - })); + lm.addLabel(new ExpressionLabelModel({ + isQuery: true + })); - this.getModel().addAll(lm as any); + this.getModel().addAll(lm as any); + } } - } async deleteField(mapping: Mapping) { diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputWidget.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputWidget.tsx index c5bebb9a9f0..beee2e05c38 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputWidget.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputWidget.tsx @@ -29,6 +29,7 @@ import { PrimitiveOutputElementWidget } from "./PrimitiveOutputElementWidget"; import { useIONodesStyles } from '../../../styles'; import { useDMCollapsedFieldsStore, useDMIOConfigPanelStore } from '../../../../store/store'; import { OutputSearchHighlight } from '../commons/Search'; +import { useShallow } from 'zustand/react/shallow'; export interface PrimitiveOutputWidgetProps { id: string; @@ -57,11 +58,13 @@ export function PrimitiveOutputWidget(props: PrimitiveOutputWidgetProps) { const collapsedFieldsStore = useDMCollapsedFieldsStore(); - const { setIsIOConfigPanelOpen, setIOConfigPanelType, setIsSchemaOverridden } = useDMIOConfigPanelStore(state => ({ - setIsIOConfigPanelOpen: state.setIsIOConfigPanelOpen, - setIOConfigPanelType: state.setIOConfigPanelType, - setIsSchemaOverridden: state.setIsSchemaOverridden - })); + const { setIsIOConfigPanelOpen, setIOConfigPanelType, setIsSchemaOverridden } = useDMIOConfigPanelStore( + useShallow(state => ({ + setIsIOConfigPanelOpen: state.setIsIOConfigPanelOpen, + setIOConfigPanelType: state.setIOConfigPanelType, + setIsSchemaOverridden: state.setIsSchemaOverridden + })) + ); const portIn = getPort(`${id}.HEADER.IN`); From 11b54a4ba4e24308c1c0ab70e72006f7aecf68b3 Mon Sep 17 00:00:00 2001 From: sachiniSam Date: Fri, 25 Jul 2025 14:27:59 +0530 Subject: [PATCH 138/349] Add model provider edit support for Np flow --- .../src/views/BI/FocusFlowDiagram/index.tsx | 35 ++- .../bi-diagram/src/components/Diagram.tsx | 6 + .../src/components/DiagramContext.tsx | 6 + .../nodes/PromptNode/PromptNodeWidget.tsx | 275 +++++++++++++----- 4 files changed, 242 insertions(+), 80 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx index 51e7fc9dbad..21059f273f3 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx @@ -44,6 +44,8 @@ import { TextEdit, ParentMetadata } from "@wso2/ballerina-core"; +import { PanelContainer } from "@wso2/ballerina-side-panel"; +import { ModelConfig } from "../AIChatAgent/ModelConfig"; import { addDraftNodeToDiagram, @@ -85,6 +87,8 @@ export function BIFocusFlowDiagram(props: BIFocusFlowDiagramProps) { const [suggestedModel, setSuggestedModel] = useState(); const [showProgressIndicator, setShowProgressIndicator] = useState(false); const [breakpointInfo, setBreakpointInfo] = useState(); + const [showModelConfigPanel, setShowModelConfigPanel] = useState(false); + const [selectedNodeForModelConfig, setSelectedNodeForModelConfig] = useState(); const selectedNodeRef = useRef(); const nodeTemplateRef = useRef(); @@ -447,7 +451,7 @@ export function BIFocusFlowDiagram(props: BIFocusFlowDiagramProps) { context: { expression: value, startLine: updateLineRange( - selectedNode.properties['prompt'].codedata.lineRange, + selectedNode.properties['prompt'].codedata.lineRange, expressionOffsetRef.current ).startLine, lineOffset: lineOffset, @@ -527,6 +531,17 @@ export function BIFocusFlowDiagram(props: BIFocusFlowDiagramProps) { handleExpressionEditorCancel(); }; + const handleOnEditAgentModel = (node: FlowNode) => { + console.log(">>> on edit agent model", node); + setSelectedNodeForModelConfig(node); + setShowModelConfigPanel(true); + }; + + const handleCloseModelConfigPanel = () => { + setShowModelConfigPanel(false); + setSelectedNodeForModelConfig(undefined); + }; + const memoizedDiagramProps = useMemo( () => ({ model: flowModel, @@ -546,7 +561,10 @@ export function BIFocusFlowDiagram(props: BIFocusFlowDiagramProps) { onCompletionItemSelect: handleCompletionItemSelect, onBlur: handleExpressionEditorBlur, onCancel: handleExpressionEditorCancel - } + }, + aiNodes: { + onModelSelect: handleOnEditAgentModel, + }, }), [flowModel, projectPath, breakpointInfo, filteredCompletions] ); @@ -566,6 +584,19 @@ export function BIFocusFlowDiagram(props: BIFocusFlowDiagramProps) { {model && } + + {showModelConfigPanel && selectedNodeForModelConfig && ( + + + + )} ); } diff --git a/workspaces/ballerina/bi-diagram/src/components/Diagram.tsx b/workspaces/ballerina/bi-diagram/src/components/Diagram.tsx index ead7cd4ffa8..8d80ff3b785 100644 --- a/workspaces/ballerina/bi-diagram/src/components/Diagram.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/Diagram.tsx @@ -71,6 +71,10 @@ export interface DiagramProps { onSelectMemoryManager: (node: FlowNode) => void; onDeleteMemoryManager: (node: FlowNode) => void; }; + // ai nodes callbacks + aiNodes?: { + onModelSelect: (node: FlowNode) => void; + }; // ai suggestions callbacks suggestions?: { fetching: boolean; @@ -96,6 +100,7 @@ export function Diagram(props: DiagramProps) { goToSource, openView, agentNode, + aiNodes, suggestions, projectPath, addBreakpoint, @@ -225,6 +230,7 @@ export function Diagram(props: DiagramProps) { goToSource: goToSource, openView: openView, agentNode: agentNode, + aiNodes: aiNodes, suggestions: suggestions, projectPath: projectPath, readOnly: onAddNode === undefined || onDeleteNode === undefined || onNodeSelect === undefined || readOnly, diff --git a/workspaces/ballerina/bi-diagram/src/components/DiagramContext.tsx b/workspaces/ballerina/bi-diagram/src/components/DiagramContext.tsx index d3534782a1c..7fefb902bf6 100644 --- a/workspaces/ballerina/bi-diagram/src/components/DiagramContext.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/DiagramContext.tsx @@ -76,6 +76,9 @@ export interface DiagramContextState { onSelectMemoryManager: (node: FlowNode) => void; onDeleteMemoryManager: (node: FlowNode) => void; }; + aiNodes?: { + onModelSelect: (node: FlowNode) => void; + }; suggestions?: { fetching: boolean; onAccept(): void; @@ -119,6 +122,9 @@ export const DiagramContext = React.createContext({ onSelectMemoryManager: () => {}, onDeleteMemoryManager: () => {}, }, + aiNodes: { + onModelSelect: () => {}, + }, suggestions: { fetching: false, onAccept: () => {}, diff --git a/workspaces/ballerina/bi-diagram/src/components/nodes/PromptNode/PromptNodeWidget.tsx b/workspaces/ballerina/bi-diagram/src/components/nodes/PromptNode/PromptNodeWidget.tsx index 8154180d53e..80350750937 100644 --- a/workspaces/ballerina/bi-diagram/src/components/nodes/PromptNode/PromptNodeWidget.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/nodes/PromptNode/PromptNodeWidget.tsx @@ -21,7 +21,11 @@ import styled from "@emotion/styled"; import { DiagramEngine, PortWidget } from "@projectstorm/react-diagrams-core"; import { DRAFT_NODE_BORDER_WIDTH, + LABEL_HEIGHT, + LABEL_WIDTH, NODE_BORDER_WIDTH, + NODE_GAP_X, + NODE_HEIGHT, NODE_PADDING, PROMPT_NODE_HEIGHT, PROMPT_NODE_WIDTH, @@ -30,10 +34,13 @@ import { Button, CompletionItem, FormExpressionEditor, FormExpressionEditorRef, import NodeIcon from "../../NodeIcon"; import { useDiagramContext } from "../../DiagramContext"; import { PromptNodeModel } from "./PromptNodeModel"; -import { ELineRange, ExpressionProperty } from "@wso2/ballerina-core"; +import { ELineRange, ExpressionProperty, NodeMetadata } from "@wso2/ballerina-core"; import { DiagnosticsPopUp } from "../../DiagnosticsPopUp"; import { getRawTemplate, nodeHasError } from "../../../utils/node"; import { cloneDeep } from "lodash"; +import { OpenAiIcon } from "../../../resources/icons/OpenAiIcon"; +import { DeepseekIcon } from "../../../resources/icons/DeepseekIcon"; +import { DefaultLlmIcon, MistralAIIcon, OllamaIcon, AzureOpenAiIcon, AnthropicIcon } from "../../../resources/icons"; export namespace NodeStyles { export type NodeStyleProp = { @@ -177,6 +184,13 @@ export namespace NodeStyles { align-items: center; gap: 8px; `; + + export const StyledCircle = styled.circle` + cursor: pointer; + &:hover { + stroke: ${ThemeColors.HIGHLIGHT}; + } + `; } const FETCH_COMPLETIONS_STATE = { @@ -192,7 +206,7 @@ export interface PromptNodeWidgetProps { engine: DiagramEngine; } -export interface NodeWidgetProps extends Omit {} +export interface NodeWidgetProps extends Omit { } export function PromptNodeWidget(props: PromptNodeWidgetProps) { const { model, engine } = props; @@ -201,7 +215,8 @@ export function PromptNodeWidget(props: PromptNodeWidgetProps) { goToSource, openView, onNodeSave, - expressionContext + expressionContext, + aiNodes, } = useDiagramContext(); const { completions, @@ -225,6 +240,7 @@ export function PromptNodeWidget(props: PromptNodeWidgetProps) { const fetchingStateRef = useRef(FETCH_COMPLETIONS_STATE.IDLE); const invalidateCacheRef = useRef(false); const field: ExpressionProperty = useMemo(() => model.node.properties['prompt'], [model]); + const nodeModelType = (model.node.properties?.modelProvider?.metadata?.data as NodeMetadata)?.module; const handleOnClick = async (event: React.MouseEvent) => { if (event.metaKey) { @@ -408,85 +424,169 @@ export function PromptNodeWidget(props: PromptNodeWidgetProps) { } } + const onModelEditClick = () => { + aiNodes?.onModelSelect(model.node); + }; + + return ( - setIsHovered(true)} - onMouseLeave={() => setIsHovered(false)} - > - {hasBreakpoint && ( -
- )} - - - - - +
+ setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} + > + {hasBreakpoint && ( +
+ )} + - - Prompt - - - {hasError && } - - - {!editable && ( - - + + + + + Prompt + + + {hasError && } + + + {!editable && ( + + + + )} + + + + + + {editable && ( + + + + )} - - - - - {editable && ( - - - - - )} - - + + + + + {/* NP function model circle */} + + + + {getLlmModelIcons(nodeModelType)} + + + + + + + + + + + + + +
); } @@ -522,3 +622,22 @@ function isExpression(value: string, cursorPosition: number) { return prefixMatch && suffixMatch; } + +function getLlmModelIcons(modelType: string) { + switch (modelType) { + case "ai.openai": + return ; + case "ai.azure": + return ; + case "ai.anthropic": + return ; + case "ai.ollama": + return ; + case "ai.mistral": + return ; + case "ai.deepseek": + return ; + default: + return ; + } +} From f8fc2a311b8e4169b045339301e6b56fd7c07339 Mon Sep 17 00:00:00 2001 From: sachiniSam Date: Fri, 25 Jul 2025 14:36:53 +0530 Subject: [PATCH 139/349] Support configureModel view for NP --- .../ballerina-core/src/interfaces/bi.ts | 2 ++ .../src/views/BI/AIChatAgent/ModelConfig.tsx | 32 +++++++++++++++---- .../src/views/BI/AIChatAgent/utils.ts | 7 ++++ 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts index c3c73dabb45..292a9084d28 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts @@ -86,6 +86,7 @@ export type NodeMetadata = { memory?: MemoryData; agent?: AgentData; paramsToHide?: string[]; // List of properties keys to to hide from forms + module?: string; }; export type ParentMetadata = { @@ -318,6 +319,7 @@ export type NodePropertyKey = | "memory" | "method" | "model" + | "modelProvider" | "msg" | "parameters" | "path" diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx index 86317c76849..607252afa84 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx @@ -26,7 +26,7 @@ import ConfigForm from "./ConfigForm"; import { Dropdown } from "@wso2/ui-toolkit"; import { cloneDeep } from "lodash"; import { RelativeLoader } from "../../../components/RelativeLoader"; -import { getAgentFilePath, getAiModuleOrg, getNodeTemplate } from "./utils"; +import { getAgentFilePath, getAiModuleOrg, getNodeTemplate, getNPFilePath } from "./utils"; import { BALLERINA, BALLERINAX, GET_DEFAULT_MODEL_PROVIDER, WSO2_MODEL_PROVIDER, PROVIDER_NAME_MAP } from "../../../constants"; const Container = styled.div` @@ -99,8 +99,18 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { const initPanel = async () => { setLoading(true); - agentFilePath.current = await getAgentFilePath(rpcClient); - aiModuleOrg.current = await getAiModuleOrg(rpcClient); + if (agentCallNode?.codedata?.node === "NP_FUNCTION") { + agentFilePath.current = await getNPFilePath(rpcClient); + } else { + agentFilePath.current = await getAgentFilePath(rpcClient); + } + + if (agentCallNode?.codedata?.node === "NP_FUNCTION") { + aiModuleOrg.current = "ballerina" + } else { + aiModuleOrg.current = await getAiModuleOrg(rpcClient); + } + // fetch all models await fetchModels(); // fetch selected agent model @@ -125,7 +135,12 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { const fetchModels = async () => { console.log(">>> agent call node", agentCallNode); - const agentName = agentCallNode?.properties.connection.value; + let agentName; + if (agentCallNode?.codedata?.node === "NP_FUNCTION") { + agentName = agentCallNode.properties?.modelProvider?.value; + } else { + agentName = agentCallNode?.properties.connection.value; + } if (!agentName) { console.error("Agent name not found", agentCallNode); return; @@ -145,7 +160,12 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { moduleConnectionNodes.current = moduleNodes.flowModel.connections; } // get agent name - const agentName = agentCallNode.properties.connection.value; + let agentName; + if (agentCallNode?.codedata?.node === "NP_FUNCTION") { + agentName = agentCallNode.properties?.modelProvider?.value; + } else { + agentName = agentCallNode.properties.connection.value; + } // get agent node const agentNode = moduleConnectionNodes.current.find((node) => node.properties.variable.value === agentName); console.log(">>> agent node", agentNode); @@ -154,7 +174,7 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { return; } // get model name - const modelName = agentNode?.properties.model.value; + const modelName = agentNode?.properties?.model?.value || agentNode?.properties?.variable?.value; console.log(">>> model name", modelName); // get model node const modelNode = moduleConnectionNodes.current.find((node) => node.properties.variable.value === modelName); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts index cebe57f935b..5fa6d60361d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts @@ -53,6 +53,13 @@ export const getAgentFilePath = async (rpcClient: BallerinaRpcClient) => { return agentFilePath; }; +export const getNPFilePath = async (rpcClient: BallerinaRpcClient) => { + const filePath = await rpcClient.getVisualizerLocation(); + // Create the NP file path + const agentFilePath = Utils.joinPath(URI.file(filePath.projectUri), "functions.bal").fsPath; + return agentFilePath; +}; + export const getMainFilePath = async (rpcClient: BallerinaRpcClient) => { // Get the main file path and update the node const filePath = await rpcClient.getVisualizerLocation(); From 8f8b57200e60cf5ea2d48e31b0ab5043abda606a Mon Sep 17 00:00:00 2001 From: sachiniSam Date: Fri, 25 Jul 2025 14:39:39 +0530 Subject: [PATCH 140/349] Update form descirption for default model provider --- .../src/components/Form/FormDescription.tsx | 7 +++++-- .../ballerina-side-panel/src/components/Form/utils.ts | 9 +++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/Form/FormDescription.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/Form/FormDescription.tsx index d3af2de5d00..4b3bd1d54e7 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/FormDescription.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/FormDescription.tsx @@ -22,7 +22,7 @@ import { ThemeColors, Codicon } from "@wso2/ui-toolkit"; import { NodeKind } from "@wso2/ballerina-core"; import { FormField } from "./types"; -import { hasRequiredParameters, hasOptionalParameters, hasReturnType, isPrioritizedField } from "./utils"; +import { hasRequiredParameters, hasOptionalParameters, hasReturnType, isPrioritizedField, isDefaultModelProvider } from "./utils"; namespace S { export const FormInfoDescription = styled.div` @@ -70,13 +70,16 @@ export const FormDescription: React.FC = ({ const hasRequired = hasRequiredParameters(formFields, selectedNode); const hasOptional = hasOptionalParameters(formFields); const hasReturn = hasReturnType(formFields); + const isDefaultProvider = isDefaultModelProvider(formFields); const hasAnyParams = formFields.filter(field => !isPrioritizedField(field) && field.type !== "VIEW" && !field.hidden ).length > 0; - if (!hasRequired && hasOptional) { + if (isDefaultProvider) { + return "This model provider does not require any fields to be configured."; + } else if (!hasRequired && hasOptional) { // Rule 1: No Required Params, but Optional Params Exist return "This operation has no required parameters. Optional settings can be configured below."; } else if (!hasAnyParams && hasReturn) { diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/Form/utils.ts b/workspaces/ballerina/ballerina-side-panel/src/components/Form/utils.ts index 65ad016eb91..b7796e90b36 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/utils.ts +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/utils.ts @@ -79,3 +79,12 @@ export function hasReturnType(formFields: FormField[]): boolean { field.key === "variable" || field.key === "type" || field.codedata?.kind === "PARAM_FOR_TYPE_INFER" ); } + +export function isDefaultModelProvider(formFields: FormField[]): boolean { + return formFields.some(field => + field.type === "TYPE" && + field.value && + field.value === "ai:Wso2ModelProvider" && + field.enabled === false + ); +} From 1ec900271be94ac6fbb94b946bdee18bcb3bb7a5 Mon Sep 17 00:00:00 2001 From: madushajg Date: Fri, 25 Jul 2025 14:47:54 +0530 Subject: [PATCH 141/349] Fix navigate into sub mapping views --- .../src/components/Diagram/utils/diagram-utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/diagram-utils.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/diagram-utils.ts index b4504fa67f7..1a8ae09c65a 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/diagram-utils.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/diagram-utils.ts @@ -75,7 +75,7 @@ export function getFieldCountMismatchIndex(newFieldCounts: FieldCount[], existin const newNode = newFieldCounts[i]; const existingNode = existingFieldCounts[i]; - if (newNode.numberOfFields !== existingNode.numberOfFields) { + if (newNode.numberOfFields !== existingNode?.numberOfFields) { return i; } } From 70711860ba26e6260d286c7cb73f1c64cf4c2f4b Mon Sep 17 00:00:00 2001 From: sachiniSam Date: Fri, 25 Jul 2025 15:26:46 +0530 Subject: [PATCH 142/349] Fix diagram update on panel close --- .../ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx index 97a0197d5af..7a427c7e73a 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx @@ -540,6 +540,7 @@ export function BIFocusFlowDiagram(props: BIFocusFlowDiagramProps) { const handleCloseModelConfigPanel = () => { setShowModelConfigPanel(false); setSelectedNodeForModelConfig(undefined); + debouncedGetFlowModel(); }; const memoizedDiagramProps = useMemo( From 9ff0c6d0345a314eaac855aa897207ed84641588 Mon Sep 17 00:00:00 2001 From: tharindulak Date: Fri, 25 Jul 2025 15:18:22 +0530 Subject: [PATCH 143/349] Fix PR comment posting by passing PR number from calling workflow - Modified test-pr.yml to pass github.event.pull_request.number to build.yml - Enhanced build.yml with 9 different PR detection methods including input parameter - Added explicit permissions for issues and pull-requests write access - Added GITHUB_REF merge ref parsing and deep payload inspection This resolves the issue where PR comments weren't posted because the reusable workflow couldn't determine the PR number in workflow_call context. --- .github/workflows/test-pr.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-pr.yml b/.github/workflows/test-pr.yml index f8a50275546..f4042e3614b 100644 --- a/.github/workflows/test-pr.yml +++ b/.github/workflows/test-pr.yml @@ -2,13 +2,18 @@ name: Test PR on: workflow_dispatch: - pull_request: + pull_request_target: types: [opened, reopened, synchronize, ready_for_review] concurrency: group: ${{ github.ref }} cancel-in-progress: true +permissions: + contents: read + issues: write + pull-requests: write + jobs: Build: if: github.event.pull_request.draft == false From fbe780160a2e0ae9cbafefa411a9856090150424 Mon Sep 17 00:00:00 2001 From: madushajg Date: Fri, 25 Jul 2025 16:09:36 +0530 Subject: [PATCH 144/349] Fix rendering links from ports outside focused query --- .../components/Diagram/utils/node-utils.ts | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/node-utils.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/node-utils.ts index 5068344c636..132eedfd446 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/node-utils.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/node-utils.ts @@ -20,13 +20,24 @@ import { InputNode } from "../Node"; export function findInputNode(field: string, outputNode: DataMapperNodeModel, focusedField?: string): InputNode { const nodes = outputNode.getModel().getNodes(); - const mappingStartsWith = (focusedField || field).split('.')[0]; + + // Helper function to find input node by field path + const findNodeByField = (fieldPath: string): InputNode | undefined => { + const mappingStartsWith = fieldPath.split('.')[0]; + return nodes.find(node => { + if (node instanceof InputNode) { + return node.inputType.id === mappingStartsWith; + } + }) as InputNode | undefined; + }; - const inputNode = nodes.find(node => { - if (node instanceof InputNode) { - return node.inputType.id === mappingStartsWith; - } - }); + // try finding input node using 'field' (map from other input ports) + let inputNode = findNodeByField(field); + + // if not found and focusedField exists, try with focusedField (map from focused input port) + if (!inputNode && focusedField) { + inputNode = findNodeByField(focusedField); + } - return inputNode ? inputNode as InputNode : undefined; + return inputNode; } From 7aeca2a35c4832576047546b47fbed3e5d381054 Mon Sep 17 00:00:00 2001 From: sachiniSam Date: Fri, 25 Jul 2025 16:31:27 +0530 Subject: [PATCH 145/349] Fix diagram rerender after model save --- .../src/views/BI/AIChatAgent/ModelConfig.tsx | 6 +-- .../src/views/BI/FocusFlowDiagram/index.tsx | 49 +++++++++++++++++-- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx index 607252afa84..3cb8d97e001 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx @@ -18,7 +18,7 @@ import React, { useEffect, useRef, useState } from "react"; import styled from "@emotion/styled"; -import { CodeData, FlowNode, NodeMetadata, NodeProperties } from "@wso2/ballerina-core"; +import { CodeData, FlowNode, NodeMetadata, NodeProperties, UpdatedArtifactsResponse } from "@wso2/ballerina-core"; import { FormField, FormValues } from "@wso2/ballerina-side-panel"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { convertConfig } from "../../../utils/bi"; @@ -51,7 +51,7 @@ const Row = styled.div` interface ModelConfigProps { agentCallNode: FlowNode; - onSave?: () => void; + onSave?: (response?: UpdatedArtifactsResponse) => void; } export function ModelConfig(props: ModelConfigProps): JSX.Element { @@ -240,7 +240,7 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { .getBIDiagramRpcClient() .getSourceCode({ filePath: agentFilePath.current, flowNode: nodeTemplate }); console.log(">>> response getSourceCode with template ", { response }); - onSave?.(); + onSave?.(response); setSavingForm(false); }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx index 7a427c7e73a..2c61f3e5dfd 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx @@ -42,7 +42,8 @@ import { TRIGGER_CHARACTERS, TriggerCharacter, TextEdit, - ParentMetadata + ParentMetadata, + UpdatedArtifactsResponse } from "@wso2/ballerina-core"; import { PanelContainer } from "@wso2/ballerina-side-panel"; import { ModelConfig } from "../AIChatAgent/ModelConfig"; @@ -326,6 +327,41 @@ export function BIFocusFlowDiagram(props: BIFocusFlowDiagramProps) { }); }; + const updateCurrentArtifactLocation = async (artifacts: UpdatedArtifactsResponse, identifier?: string) => { + console.log(">>> Updating current artifact location", { artifacts, identifier }); + // Get the updated component and update the location + const currentIdentifier = identifier || (await rpcClient.getVisualizerLocation()).identifier; + // Find the correct artifact by currentIdentifier (id) + let currentArtifact = artifacts.artifacts.at(0); + artifacts.artifacts.forEach((artifact: any) => { + 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: any) => resource.id === currentIdentifier || resource.name === currentIdentifier + ); + if (resource) { + currentArtifact = resource; + } + } + }); + + if (currentArtifact) { + console.log(">>> currentArtifact", currentArtifact); + await rpcClient.getVisualizerRpcClient().openView({ + type: EVENT_TYPE.UPDATE_PROJECT_LOCATION, + location: { + documentUri: currentArtifact.path, + position: currentArtifact.position, + identifier: currentIdentifier, + }, + }); + } + debouncedGetFlowModel(); + }; + const handleOnEditNode = (node: FlowNode) => { console.log(">>> on edit node", node); selectedNodeRef.current = node; @@ -537,10 +573,17 @@ export function BIFocusFlowDiagram(props: BIFocusFlowDiagramProps) { setShowModelConfigPanel(true); }; + const handleSaveModelConfigPanel = (response: UpdatedArtifactsResponse) => { + setShowModelConfigPanel(false); + setSelectedNodeForModelConfig(undefined); + if (response) { + updateCurrentArtifactLocation(response); + } + }; + const handleCloseModelConfigPanel = () => { setShowModelConfigPanel(false); setSelectedNodeForModelConfig(undefined); - debouncedGetFlowModel(); }; const memoizedDiagramProps = useMemo( @@ -594,7 +637,7 @@ export function BIFocusFlowDiagram(props: BIFocusFlowDiagramProps) { > )} From 85a92de5fd094f56c141a58097714b0c451b4631 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Fri, 25 Jul 2025 16:53:26 +0530 Subject: [PATCH 146/349] Add isUpdatingSource state to support progress bar in expression bar --- .../src/views/InlineDataMapper/DataMapperView.tsx | 10 +++++++++- .../src/components/DataMapper/Header/ExpressionBar.tsx | 7 +++---- workspaces/ballerina/inline-data-mapper/src/index.tsx | 1 + .../components/Header/ExpressionEditor.tsx | 3 ++- .../src/components/ExpressionEditor/types/common.ts | 1 + 5 files changed, 16 insertions(+), 6 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/InlineDataMapper/DataMapperView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/InlineDataMapper/DataMapperView.tsx index 30b2a73f15d..4270a5b9471 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/InlineDataMapper/DataMapperView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/InlineDataMapper/DataMapperView.tsx @@ -78,6 +78,7 @@ export function InlineDataMapperView(props: InlineDataMapperProps) { const prevCompletionFetchText = useRef(""); const [filteredCompletions, setFilteredCompletions] = useState([]); const expressionOffsetRef = useRef(0); // To track the expression offset on adding import statements + const [isUpdatingSource ,setIsUpdatingSource] = useState(false); // Keep track of previous inputs/outputs and sub mappings for comparison const prevSignatureRef = useRef(null); @@ -170,6 +171,12 @@ export function InlineDataMapperView(props: InlineDataMapperProps) { } }; + const updateExprFromExprBar = async (outputId: string, expression: string, viewId: string, name: string) => { + setIsUpdatingSource(true); + await updateExpression(outputId, expression, viewId, name); + setIsUpdatingSource(false); + } + const addArrayElement = async (outputId: string, viewId: string, name: string) => { try { const addElementRequest: AddArrayElementRequest = { @@ -478,9 +485,10 @@ export function InlineDataMapperView(props: InlineDataMapperProps) { goToFunction={goToFunction} expressionBar={{ completions: filteredCompletions, + isUpdatingSource, triggerCompletions: retrieveCompeletions, onCompletionSelect: handleCompletionSelect, - onSave: updateExpression, + onSave: updateExprFromExprBar, onCancel: handleExpressionCancel, }} /> diff --git a/workspaces/ballerina/inline-data-mapper/src/components/DataMapper/Header/ExpressionBar.tsx b/workspaces/ballerina/inline-data-mapper/src/components/DataMapper/Header/ExpressionBar.tsx index f63d21daefe..b6bc5b7562b 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/DataMapper/Header/ExpressionBar.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/DataMapper/Header/ExpressionBar.tsx @@ -75,7 +75,7 @@ export interface ExpressionBarProps { export default function ExpressionBarWrapper({ views }: ExpressionBarProps) { const classes = useStyles(); - const { completions, triggerCompletions, onCompletionSelect, onSave, onCancel } = useExpressionContext(); + const { completions, isUpdatingSource, triggerCompletions, onCompletionSelect, onSave, onCancel } = useExpressionContext(); const textFieldRef = useRef(); const savedTextFieldValue = useRef(''); const [textFieldValue, setTextFieldValue] = useState(''); @@ -201,9 +201,7 @@ export default function ExpressionBarWrapper({ views }: ExpressionBarProps) { if (e.target.closest('[id^="recordfield-"]')) { return; } - await saveSource(focusedPort, textFieldValue); - setTextFieldValue(""); - resetExprBarFocus(); + await textFieldRef.current.saveExpression(textFieldValue); }; const inputProps: InputProps = { @@ -271,6 +269,7 @@ export default function ExpressionBarWrapper({ views }: ExpressionBarProps) { inputProps={inputProps} autoSelectFirstItem={true} completions={completions} + isUpdatingSource={isUpdatingSource} onChange={handleChange} onCompletionSelect={onCompletionSelect} onSave={handleExpressionSave} diff --git a/workspaces/ballerina/inline-data-mapper/src/index.tsx b/workspaces/ballerina/inline-data-mapper/src/index.tsx index 2cb3ffa5a7a..81a23d45485 100644 --- a/workspaces/ballerina/inline-data-mapper/src/index.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/index.tsx @@ -51,6 +51,7 @@ const globalStyles = css` export interface ExpressionBarProps { completions: CompletionItem[]; + isUpdatingSource?: boolean; triggerCompletions: (outputId: string, viewId: string, value: string, cursorPosition?: number) => void; onCompletionSelect: (value: string) => void; onSave: (outputId: string, value: string, viewId: string, name: string) => Promise; diff --git a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Header/ExpressionEditor.tsx b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Header/ExpressionEditor.tsx index 02bc223962c..8ad6dd1be60 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Header/ExpressionEditor.tsx +++ b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Header/ExpressionEditor.tsx @@ -65,6 +65,7 @@ export const ExpressionEditor = forwardRef - {isSavingExpression && } + {(isSavingExpression || isUpdatingSource) && } {isFocused && createPortal( diff --git a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/types/common.ts b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/types/common.ts index cb7f45e7b25..3fa440c8460 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/types/common.ts +++ b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/types/common.ts @@ -128,6 +128,7 @@ type ExpressionEditorBaseProps = { sx?: React.CSSProperties; completionSx?: React.CSSProperties; inputProps?: InputProps; + isUpdatingSource?: boolean; onChange: (value: string, updatedCursorPosition: number) => void | Promise; onSelectionChange?: (value: string, updatedCursorPosition: number) => void | Promise; onFocus?: (e?: any) => void | Promise; From a14283775d2afbcff0d7216f9d2883f52f053899 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Fri, 25 Jul 2025 17:01:57 +0530 Subject: [PATCH 147/349] Add duration prop to ProgressIndicator for customizable animation timing --- .../src/components/ProgressIndicator/ProgressIndicator.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workspaces/common-libs/ui-toolkit/src/components/ProgressIndicator/ProgressIndicator.tsx b/workspaces/common-libs/ui-toolkit/src/components/ProgressIndicator/ProgressIndicator.tsx index 2229fa811f7..011853a8ce4 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/ProgressIndicator/ProgressIndicator.tsx +++ b/workspaces/common-libs/ui-toolkit/src/components/ProgressIndicator/ProgressIndicator.tsx @@ -22,6 +22,7 @@ export interface ProgressBarProps { barWidth?: number; sx?: any; color?: string; + duration?: number; } const Container = styled.div` @@ -60,7 +61,7 @@ const Container = styled.div` &.infinite .progress-bar { animation-name: progress; - animation-duration: 4s; + animation-duration: ${(props: ProgressBarProps) => props.duration || 4}s; animation-iteration-count: infinite; animation-timing-function: steps(100); transform: translateZ(0); @@ -83,9 +84,8 @@ const Container = styled.div` `; export const ProgressIndicator = (props: ProgressBarProps) => { - const { sx, id, barWidth, color } = props; return ( - +
); From e213c2fb8a4e703fbabee8cc7a3e97edb29e767e Mon Sep 17 00:00:00 2001 From: ChamodA Date: Fri, 25 Jul 2025 17:02:27 +0530 Subject: [PATCH 148/349] Increase ProgressIndicator animation speed --- .../ExpressionEditor/components/Header/ExpressionEditor.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Header/ExpressionEditor.tsx b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Header/ExpressionEditor.tsx index 8ad6dd1be60..d941015c1f4 100644 --- a/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Header/ExpressionEditor.tsx +++ b/workspaces/common-libs/ui-toolkit/src/components/ExpressionEditor/components/Header/ExpressionEditor.tsx @@ -404,7 +404,9 @@ export const ExpressionEditor = forwardRef - {(isSavingExpression || isUpdatingSource) && } + {(isSavingExpression || isUpdatingSource) && + + } {isFocused && createPortal( From 1377b5d28090fc9802987d95b827fd2c928e3873 Mon Sep 17 00:00:00 2001 From: Chinthaka Jayatilake <37581983+ChinthakaJ98@users.noreply.github.com> Date: Fri, 25 Jul 2025 18:24:42 +0530 Subject: [PATCH 149/349] Change default state --- workspaces/mi/mi-visualizer/src/RuntimeServicesPanel.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/mi/mi-visualizer/src/RuntimeServicesPanel.tsx b/workspaces/mi/mi-visualizer/src/RuntimeServicesPanel.tsx index 30db1ccbe90..a4dbfbc0f1f 100644 --- a/workspaces/mi/mi-visualizer/src/RuntimeServicesPanel.tsx +++ b/workspaces/mi/mi-visualizer/src/RuntimeServicesPanel.tsx @@ -162,7 +162,7 @@ export function RuntimeServicePanel() { const { rpcClient } = useVisualizerContext(); const [services, setAvailableServices] = useState(); const [isSwaggerEnabled, setSwaggerEnabled] = useState({ isSwaggerTriggered: false }); - const [serverRunStatus, setServerRunStatus] = useState('Stopped' as MiServerRunStatus); + const [serverRunStatus, setServerRunStatus] = useState('Running' as MiServerRunStatus); useEffect(() => { if (rpcClient) { From e98f7e536193afb257d1c608b021fad86abcfbf9 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Fri, 25 Jul 2025 19:57:56 +0530 Subject: [PATCH 150/349] Refactor completion filtering logic in InlineDataMapperView for improved accuracy --- .../src/views/InlineDataMapper/DataMapperView.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/InlineDataMapper/DataMapperView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/InlineDataMapper/DataMapperView.tsx index 4270a5b9471..b964334e1a0 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/InlineDataMapper/DataMapperView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/InlineDataMapper/DataMapperView.tsx @@ -393,9 +393,9 @@ export function InlineDataMapperView(props: InlineDataMapperProps) { expressionCompletions = completions .filter((completion) => { const lowerCaseText = currentContent.toLowerCase(); - const lowerCaseLabel = completion.label.toLowerCase(); + const lowerCaseLabel = completion.value.toLowerCase(); - return lowerCaseLabel.includes(lowerCaseText); + return lowerCaseText !== lowerCaseLabel && lowerCaseLabel.startsWith(lowerCaseText); }) .sort((a, b) => a.sortText.localeCompare(b.sortText)); } else { @@ -440,15 +440,15 @@ export function InlineDataMapperView(props: InlineDataMapperProps) { expressionCompletions = convertedCompletions .filter((completion) => { const lowerCaseText = currentContent.toLowerCase(); - const lowerCaseLabel = completion.label.toLowerCase(); + const lowerCaseLabel = completion.value.toLowerCase(); - return lowerCaseLabel.includes(lowerCaseText); + return lowerCaseText !== lowerCaseLabel && lowerCaseLabel.startsWith(lowerCaseText); }) .sort((a, b) => a.sortText.localeCompare(b.sortText)); } prevCompletionFetchText.current = parentContent ?? ""; - setFilteredCompletions(expressionCompletions); } + setFilteredCompletions(expressionCompletions); }, 150), [filePath, codedata, varName, completions] ); From eb1b39a87a01d7a7627259613fcf6999a3b54746 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Fri, 25 Jul 2025 20:00:34 +0530 Subject: [PATCH 151/349] Store the current value of the text field upon saving in ExpressionBar to prevent reapplying same content --- .../src/components/DataMapper/Header/ExpressionBar.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/DataMapper/Header/ExpressionBar.tsx b/workspaces/ballerina/inline-data-mapper/src/components/DataMapper/Header/ExpressionBar.tsx index b6bc5b7562b..622e6503565 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/DataMapper/Header/ExpressionBar.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/DataMapper/Header/ExpressionBar.tsx @@ -183,6 +183,7 @@ export default function ExpressionBarWrapper({ views }: ExpressionBarProps) { const viewId = views[views.length - 1]?.targetField; const name = views[0]?.targetField; await onSave(outputId, value, viewId, name); + savedTextFieldValue.current = value; }; const handleExpressionSave = async (value: string) => { From f8611def4d0ad9fd123bc2de8c77ab109773724f Mon Sep 17 00:00:00 2001 From: tharindulak Date: Fri, 25 Jul 2025 17:35:01 +0530 Subject: [PATCH 152/349] Fix trivy scan issues --- .github/workflows/build.yml | 501 +++++++--------------------------- .github/workflows/test-pr.yml | 3 +- 2 files changed, 98 insertions(+), 406 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b4e94487c47..0760d099366 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,10 +3,6 @@ name: Build and run Tests on: workflow_call: inputs: - prNumber: - description: Pull request number for commenting - type: number - required: false isPreRelease: default: true type: boolean @@ -176,10 +172,6 @@ jobs: needs: Build_Stage runs-on: ubuntu-latest timeout-minutes: 15 - permissions: - contents: read - issues: write - pull-requests: write steps: - name: Restore build uses: actions/download-artifact@v4 @@ -211,12 +203,22 @@ jobs: - name: Update Trivy vulnerability database run: | echo "🔄 Updating Trivy vulnerability database..." - # Force fresh download of vulnerability database + echo "🔄 Run attempt: ${{ github.run_attempt }}" + + # Force complete cleanup of any cached data rm -rf ~/.cache/trivy || true + rm -rf /tmp/trivy* || true + + # Download fresh vulnerability database trivy image --download-db-only + echo "✅ Trivy database updated successfully" echo "📊 Database info:" trivy version --format json | jq '.VulnerabilityDB' || trivy version + + # Show database timestamp to detect any caching issues + echo "📅 Database cache info:" + ls -la ~/.cache/trivy/ 2>/dev/null || echo "No cache directory found" - name: Verify Trivy installation run: | @@ -230,425 +232,116 @@ jobs: echo " - Severity levels: CRITICAL, HIGH, MEDIUM, LOW" echo " - Skipping directories: common/temp" echo " - Timeout: 10 minutes" - echo " - Exit on vulnerabilities: YES" + echo " - Exit on vulnerabilities: YES (Build will fail)" - - name: Debug dependency state + - name: Run Trivy vulnerability scanner run: | - echo "🔍 Debugging dependency state for vulnerability scanning..." - echo "Current directory contents:" - ls -la - echo "" - echo "=== COMPARING WITH LOCAL ENVIRONMENT ===" - echo "" - echo "1. Trivy version comparison:" - trivy version - echo "" - echo "2. Checking axios in ui-toolkit package.json:" - cat workspaces/common-libs/ui-toolkit/package.json | grep -A5 -B5 axios || echo "No axios found in ui-toolkit package.json" - echo "" - echo "3. Axios entries in pnpm-lock.yaml:" - echo " Total axios entries: $(grep -c "axios" pnpm-lock.yaml || echo "0")" - echo " Axios 0.21.0 entries:" - grep "axios@0.21.0" pnpm-lock.yaml || echo " No axios@0.21.0 found" - echo "" - echo "4. Lock file checksums (to compare with local):" - echo " pnpm-lock.yaml: $(md5sum pnpm-lock.yaml | cut -d' ' -f1)" - echo " common/config/rush/pnpm-lock.yaml: $(md5sum common/config/rush/pnpm-lock.yaml | cut -d' ' -f1)" + echo "🔍 Scanning for security vulnerabilities..." + echo "🔄 Run attempt: ${{ github.run_attempt }}" + echo "📂 Current working directory: $(pwd)" echo "" - echo "5. Rush installation status:" - echo " Rush version: $(node -e "console.log(require('@microsoft/rush/package.json').version)" 2>/dev/null || echo "Not found")" - echo " PNPM version: $(pnpm --version || echo "Not found")" + + # Debug: Check environment and file system state + echo "📊 Environment check:" + echo " - Build artifacts restored: $(test -f rush.json && echo 'YES' || echo 'NO')" + echo " - Rush installed: $(rush --version 2>/dev/null && echo 'YES' || echo 'NO')" + echo " - ui-toolkit exists: $(test -d workspaces/common-libs/ui-toolkit && echo 'YES' || echo 'NO')" + echo " - ui-toolkit node_modules: $(test -d workspaces/common-libs/ui-toolkit/node_modules && echo 'YES' || echo 'NO')" echo "" - echo "6. Node modules structure:" - echo " workspaces/common-libs/ui-toolkit/node_modules exists: $(test -d workspaces/common-libs/ui-toolkit/node_modules && echo 'YES' || echo 'NO')" - if [ -d "workspaces/common-libs/ui-toolkit/node_modules" ]; then - echo " axios version installed: $(cat workspaces/common-libs/ui-toolkit/node_modules/axios/package.json | grep '"version"' || echo "Not found")" + + # Check if axios is actually installed with vulnerable version + if [ -d "workspaces/common-libs/ui-toolkit/node_modules/axios" ]; then + AXIOS_VERSION=$(cat workspaces/common-libs/ui-toolkit/node_modules/axios/package.json | grep '"version"' | cut -d'"' -f4) + echo " - axios version found: $AXIOS_VERSION" + if [ "$AXIOS_VERSION" = "0.21.0" ]; then + echo " - ⚠️ VULNERABLE AXIOS VERSION DETECTED: $AXIOS_VERSION" + fi + else + echo " - axios not found in node_modules" fi echo "" - echo "7. Environment variables that might affect scanning:" - echo " PWD: $PWD" - echo " HOME: $HOME" - echo " NODE_ENV: ${NODE_ENV:-"not set"}" - echo "" - echo "8. Testing exact same command as local:" - echo " Running: trivy fs . --timeout 10m --skip-dirs common/temp --format table" - trivy fs . --timeout 10m --skip-dirs common/temp --format table | head -30 - echo "" - echo "9. Detailed Trivy analysis:" - echo " Scanning specific ui-toolkit directory:" - trivy fs workspaces/common-libs/ui-toolkit --format table --severity CRITICAL,HIGH,MEDIUM,LOW - echo "" - echo "10. Check if node_modules are being scanned:" - echo " Node modules in ui-toolkit:" - ls -la workspaces/common-libs/ui-toolkit/node_modules/ | head -10 || echo "No node_modules found" - echo "" - echo "11. Rush vs PNPM difference check:" - echo " Checking if Rush installed different versions:" - find . -name "node_modules" -type d | head -5 - echo "" - echo "12. Manual CVE check on axios 0.21.0:" - echo " Checking if this specific version has known CVEs:" - trivy fs workspaces/common-libs/ui-toolkit/node_modules/axios --format table || echo "Cannot scan axios directly" - echo "" - echo "13. Force vulnerability test with minimal package.json:" - mkdir -p /tmp/vuln-test - cat > /tmp/vuln-test/package.json << 'EOFVULN' - { - "name": "vuln-test", - "version": "1.0.0", - "dependencies": { - "axios": "0.21.0" - } - } - EOFVULN - cd /tmp/vuln-test && npm install --package-lock-only - echo " Scanning minimal test case:" - trivy fs /tmp/vuln-test --format table --severity CRITICAL,HIGH,MEDIUM,LOW - cd - - - - name: Run Trivy vulnerability scanner - run: | - echo "🔍 Running Trivy vulnerability scanner (table format)..." - # Run Trivy with verbose output for debugging + # Run Trivy vulnerability scan + echo "🚀 Starting Trivy scan..." trivy fs . \ --timeout 10m \ --skip-dirs common/temp \ --severity CRITICAL,HIGH,MEDIUM,LOW \ --format table \ - --output trivy-table-results.txt \ - --exit-code 0 \ - --debug + --output trivy-results.txt \ + --exit-code 0 - echo "📊 Table output complete." - echo "" - echo "📋 Trivy scan results preview:" - head -50 trivy-table-results.txt || echo "No output file generated" + TRIVY_EXIT_CODE=$? + echo "📊 Trivy scan exit code: $TRIVY_EXIT_CODE" echo "" - # Check if vulnerabilities were found by examining the table output - if [ -f "trivy-table-results.txt" ]; then - # Count vulnerability lines (exclude headers and empty lines) - VULN_COUNT=$(grep -c "CVE\|GHSA" trivy-table-results.txt 2>/dev/null || echo "0") - echo "🔢 CVE/GHSA count found: $VULN_COUNT" + # Always display the results for transparency + if [ -f "trivy-results.txt" ]; then + echo "📋 Complete vulnerability report:" + cat trivy-results.txt + echo "" - if [ "$VULN_COUNT" -gt 0 ]; then - echo "❌ Trivy scan found $VULN_COUNT vulnerabilities!" - echo "Check the table output for details." - echo "VULNERABILITIES_FOUND=true" >> $GITHUB_ENV - echo "VULN_COUNT=$VULN_COUNT" >> $GITHUB_ENV - else - echo "✅ No vulnerabilities found!" - echo "VULNERABILITIES_FOUND=false" >> $GITHUB_ENV - echo "VULN_COUNT=0" >> $GITHUB_ENV - fi - else - echo "⚠️ Table output file not generated!" - echo "VULNERABILITIES_FOUND=false" >> $GITHUB_ENV - echo "VULN_COUNT=0" >> $GITHUB_ENV - fi - - - name: Debug vulnerability detection results - run: | - echo "🔍 Vulnerability Detection Results:" - echo "VULNERABILITIES_FOUND: ${VULNERABILITIES_FOUND:-"not set"}" - echo "VULN_COUNT: ${VULN_COUNT:-"not set"}" - echo "File exists: $(test -f trivy-table-results.txt && echo 'YES' || echo 'NO')" - if [ -f "trivy-table-results.txt" ]; then - echo "File size: $(wc -c < trivy-table-results.txt) bytes" - echo "CVE/GHSA lines: $(grep -c "CVE\|GHSA" trivy-table-results.txt 2>/dev/null || echo "0")" - echo "Last 10 lines of results:" - tail -10 trivy-table-results.txt - fi - - - name: Create PR comment with vulnerability report - if: env.VULNERABILITIES_FOUND == 'true' - uses: actions/github-script@v7 - continue-on-error: true - with: - github-token: ${{ secrets.CHOREO_BOT_TOKEN || secrets.GITHUB_TOKEN }} - script: | - console.log('🔍 Token debugging:'); - console.log('CHOREO_BOT_TOKEN available:', '${{ secrets.CHOREO_BOT_TOKEN }}' !== ''); - console.log('GITHUB_TOKEN available:', '${{ secrets.GITHUB_TOKEN }}' !== ''); - console.log('Current token being used:', '${{ secrets.CHOREO_BOT_TOKEN }}' !== '' ? 'CHOREO_BOT_TOKEN' : 'GITHUB_TOKEN (fallback)'); - - const fs = require('fs'); - - // Read the table output - let tableOutput = ''; - try { - tableOutput = fs.readFileSync('trivy-table-results.txt', 'utf8'); - } catch (error) { - tableOutput = 'Unable to read vulnerability details.'; - } - - // Count vulnerabilities by severity - const vulnCount = process.env.VULN_COUNT || 'unknown'; - - const comment = `## 🚨 Security Vulnerabilities Detected - - **❌ Build Failed**: ${vulnCount} security vulnerabilities found in dependencies. - - ### 📊 Vulnerability Summary - \`\`\` - ${tableOutput} - \`\`\` - - ### 🔧 Next Steps - 1. **Review vulnerabilities** in the table above - 2. **Update vulnerable packages** to the fixed versions shown - 3. **Re-run the build** after fixing the issues - - ### 📋 Additional Information - - **Scan Type**: Production dependencies only - - **Severity Levels**: CRITICAL, HIGH, MEDIUM, LOW - - **Workflow**: Security_Scan job in build pipeline - - > 💡 **Tip**: Focus on CRITICAL and HIGH severity vulnerabilities first for maximum security impact.`; - - // Get PR number from various possible sources - let prNumber = null; - - console.log('🔍 Debugging context information:'); - console.log('Event name:', context.eventName); - console.log('Ref:', context.ref); - console.log('SHA:', context.sha); - console.log('Actor:', context.actor); - console.log('Repository:', context.repo.owner + '/' + context.repo.repo); - console.log('Payload keys:', Object.keys(context.payload)); - console.log('Full payload structure:'); - console.log(JSON.stringify(context.payload, null, 2)); - - // Method 0: Check if PR number is provided as input - const inputPrNumber = '${{ inputs.prNumber }}'; - if (inputPrNumber && inputPrNumber !== '' && inputPrNumber !== 'null') { - prNumber = parseInt(inputPrNumber); - console.log('✅ Found PR via input parameter:', prNumber); - } - - // Method 1: Direct PR context (pull_request events) - if (context.payload.pull_request) { - prNumber = context.payload.pull_request.number; - console.log('✅ Found PR via payload.pull_request:', prNumber); - } + # Count vulnerabilities with detailed breakdown + TOTAL_LINES=$(wc -l < trivy-results.txt) + CVE_COUNT=$(grep -c "CVE-" trivy-results.txt 2>/dev/null || echo "0") + GHSA_COUNT=$(grep -c "GHSA-" trivy-results.txt 2>/dev/null || echo "0") - // Method 2: Check if triggered by PR (workflow_run events) - if (!prNumber && context.payload.workflow_run && context.payload.workflow_run.pull_requests && context.payload.workflow_run.pull_requests.length > 0) { - prNumber = context.payload.workflow_run.pull_requests[0].number; - console.log('✅ Found PR via workflow_run:', prNumber); - } + # Clean the counts to remove any whitespace/newlines + CVE_COUNT=$(echo "$CVE_COUNT" | tr -d '\n\r ') + GHSA_COUNT=$(echo "$GHSA_COUNT" | tr -d '\n\r ') - // Method 3: Parse from ref if it's a PR branch - if (!prNumber && context.ref && context.ref.includes('refs/pull/')) { - const match = context.ref.match(/refs\/pull\/(\d+)\//); - if (match) { - prNumber = parseInt(match[1]); - console.log('✅ Found PR via ref parsing:', prNumber); - } - } + # Calculate total vulnerabilities safely + VULN_COUNT=$((CVE_COUNT + GHSA_COUNT)) - // Method 4: Search for PR using commit SHA (most reliable for workflow_call) - if (!prNumber) { - console.log('🔍 Searching for PR using commit SHA...'); - try { - const { data: prs } = await github.rest.repos.listPullRequestsAssociatedWithCommit({ - owner: context.repo.owner, - repo: context.repo.repo, - commit_sha: context.sha - }); - - console.log('Found PRs for commit:', prs.length); - if (prs && prs.length > 0) { - prNumber = prs[0].number; - console.log('✅ Found PR via commit SHA search:', prNumber); - console.log('PR details:', { - number: prs[0].number, - title: prs[0].title, - state: prs[0].state, - head: prs[0].head.ref, - base: prs[0].base.ref - }); - } - } catch (error) { - console.log('❌ Failed to search for PR via commit SHA:', error.message); - console.log('Error status:', error.status); - console.log('Error response:', error.response?.data); - } - } + # Debug vulnerability detection inconsistency + echo "🔍 Vulnerability Detection Analysis:" + echo " - CVE count (cleaned): '$CVE_COUNT'" + echo " - GHSA count (cleaned): '$GHSA_COUNT'" + echo " - Total vulnerabilities: $VULN_COUNT" + echo " - Run attempt: ${{ github.run_attempt }}" + echo " - Expected: Should ALWAYS find axios 0.21.0 vulnerabilities" - // Method 5: Try to find open PRs for this branch - if (!prNumber && context.ref) { - const branchName = context.ref.replace('refs/heads/', ''); - console.log('🔍 Searching for PRs for branch:', branchName); - try { - const { data: prs } = await github.rest.pulls.list({ - owner: context.repo.owner, - repo: context.repo.repo, - head: `${context.repo.owner}:${branchName}`, - state: 'open' - }); - - console.log('Found PRs for branch:', prs.length); - if (prs && prs.length > 0) { - prNumber = prs[0].number; - console.log('✅ Found PR via branch search:', prNumber); - } - } catch (error) { - console.log('❌ Failed to search for PR via branch:', error.message); - } - } - - // Method 6: Fallback - try common PR numbers if this is clearly a PR context - if (!prNumber && (context.ref.includes('pull') || context.actor !== 'dependabot[bot]')) { - console.log('🔍 Attempting fallback PR detection...'); - // Try to extract from git refs or environment - const gitRef = process.env.GITHUB_REF || context.ref || ''; - console.log('Git ref:', gitRef); - const headRef = process.env.GITHUB_HEAD_REF || ''; - console.log('Head ref:', headRef); - - // Check if we can find recent PRs that might match our commit - try { - const { data: recentPrs } = await github.rest.pulls.list({ - owner: context.repo.owner, - repo: context.repo.repo, - state: 'open', - sort: 'updated', - per_page: 10 - }); - - console.log(`Found ${recentPrs.length} recent open PRs`); - for (const pr of recentPrs) { - console.log(`PR #${pr.number}: ${pr.title} (head: ${pr.head.sha.substring(0, 8)})`); - if (pr.head.sha === context.sha) { - prNumber = pr.number; - console.log('✅ Found PR via SHA match in recent PRs:', prNumber); - break; - } - } - } catch (error) { - console.log('❌ Failed to search recent PRs:', error.message); - } - } - - // Method 7: Try to extract from run context if available - if (!prNumber) { - console.log('🔍 Checking for PR number in run context...'); - const runUrl = process.env.GITHUB_SERVER_URL + '/' + process.env.GITHUB_REPOSITORY + '/actions/runs/' + process.env.GITHUB_RUN_ID; - console.log('Run URL:', runUrl); - - // Check if there's a pattern in the workflow context that might indicate PR - if (context.payload.workflow_run && context.payload.workflow_run.html_url) { - const urlMatch = context.payload.workflow_run.html_url.match(/pr=(\d+)/); - if (urlMatch) { - prNumber = parseInt(urlMatch[1]); - console.log('✅ Found PR via workflow run URL:', prNumber); - } - } - } - - // Method 8: Extract from GitHub Actions environment (GITHUB_REF for pull request events) - if (!prNumber) { - console.log('🔍 Checking GITHUB_REF for PR information...'); - const githubRef = process.env.GITHUB_REF || ''; - console.log('GITHUB_REF:', githubRef); - - // Check if this is a merge ref (refs/pull/150/merge) - const mergeRefMatch = githubRef.match(/refs\/pull\/(\d+)\/merge/); - if (mergeRefMatch) { - prNumber = parseInt(mergeRefMatch[1]); - console.log('✅ Found PR via GITHUB_REF merge ref:', prNumber); - } - } + # Check if this is inconsistent behavior + if [ "${{ github.run_attempt }}" -gt 1 ] && [ "$VULN_COUNT" -eq 0 ]; then + echo " - 🚨 CRITICAL: Vulnerability detection is INCONSISTENT!" + echo " - 🚨 First run found vulnerabilities, but rerun shows clean results" + echo " - 🚨 This indicates a serious issue with the security scanning process" + fi - // Method 9: Try to get PR number from the event payload more deeply - if (!prNumber) { - console.log('🔍 Deep inspection of event payload...'); - - // Check if this is a pull_request_target event or similar - if (context.payload.number) { - prNumber = context.payload.number; - console.log('✅ Found PR via payload.number:', prNumber); - } - - // Check for pull request in nested structures - if (!prNumber && context.payload.pull_request && context.payload.pull_request.number) { - prNumber = context.payload.pull_request.number; - console.log('✅ Found PR via nested payload.pull_request.number:', prNumber); - } - } + echo "📊 Scan Analysis:" + echo " - Total lines in report: $TOTAL_LINES" + echo " - CVE entries found: $CVE_COUNT" + echo " - GHSA entries found: $GHSA_COUNT" + echo " - Total vulnerabilities: $VULN_COUNT" + echo " - File size: $(wc -c < trivy-results.txt) bytes" + echo "" - if (prNumber) { - try { - console.log(`📝 Attempting to post vulnerability report to PR #${prNumber}`); - - // First, verify the PR exists and is accessible - const { data: prDetails } = await github.rest.pulls.get({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: prNumber - }); - - console.log(`✅ PR #${prNumber} verified: "${prDetails.title}" (state: ${prDetails.state})`); - - // Now post the comment - const result = await github.rest.issues.createComment({ - issue_number: prNumber, - owner: context.repo.owner, - repo: context.repo.repo, - body: comment - }); - - console.log('✅ PR comment posted successfully!'); - console.log('Comment ID:', result.data.id); - console.log('Comment URL:', result.data.html_url); - - } catch (error) { - console.log('❌ Failed to post PR comment:', error.message); - console.log('Error status:', error.status); - console.log('Error response:', JSON.stringify(error.response?.data, null, 2)); - - if (error.status === 404) { - console.log('🔍 PR not found - checking if PR exists...'); - try { - const { data: prCheck } = await github.rest.pulls.get({ - owner: context.repo.owner, - repo: context.repo.repo, - pull_number: prNumber - }); - console.log('PR exists but comment failed:', prCheck.title); - } catch (prError) { - console.log('PR does not exist:', prError.message); - } - } - - console.log('Vulnerability report will be logged in job output instead'); - } - } else { - console.log('📋 No PR found - vulnerability report available in job output'); - console.log('All detection methods exhausted.'); - console.log('Environment details:'); - console.log('- GITHUB_REF:', process.env.GITHUB_REF); - console.log('- GITHUB_HEAD_REF:', process.env.GITHUB_HEAD_REF); - console.log('- GITHUB_BASE_REF:', process.env.GITHUB_BASE_REF); - console.log('- GITHUB_EVENT_NAME:', process.env.GITHUB_EVENT_NAME); - } + # Show specific axios vulnerabilities if found + echo "🔍 Axios-specific vulnerabilities:" + grep -i "axios" trivy-results.txt || echo " - No axios vulnerabilities found in report" + echo "" - // Always log the vulnerability details to job output - console.log('\n' + '='.repeat(80)); - console.log('🚨 SECURITY VULNERABILITY REPORT'); - console.log('='.repeat(80)); - console.log(comment); - console.log('='.repeat(80) + '\n'); - - - name: Fail build if vulnerabilities found - if: env.VULNERABILITIES_FOUND == 'true' + if [ "$VULN_COUNT" -gt 0 ]; then + echo "❌ SECURITY ALERT: Found $VULN_COUNT vulnerabilities" + echo "🚫 Build failed due to security vulnerabilities" + exit 1 + else + echo "✅ SUCCESS: No security vulnerabilities detected" + echo "⚠️ WARNING: If axios 0.21.0 is installed, this result is INCORRECT" + fi + else + echo "❌ ERROR: No scan results file generated!" + echo "This indicates a problem with the Trivy scan itself" + exit 1 + fi + + - name: Security scan diagnostics + if: failure() run: | - echo "❌ Build failed due to security vulnerabilities!" - echo "Please review the table output above for vulnerability details." - echo "Fix the vulnerabilities before proceeding." - exit 1 + echo "🔍 Security Scan Diagnostics:" + echo "Trivy version: $(trivy version --format json | jq -r '.Version' 2>/dev/null || trivy version)" + echo "Scan completed with vulnerabilities found" + echo "Review the vulnerability table above for details and remediation steps" ExtTest_Ballerina: name: Run Ballerina extension tests diff --git a/.github/workflows/test-pr.yml b/.github/workflows/test-pr.yml index f4042e3614b..c69e0acfe22 100644 --- a/.github/workflows/test-pr.yml +++ b/.github/workflows/test-pr.yml @@ -2,7 +2,7 @@ name: Test PR on: workflow_dispatch: - pull_request_target: + pull_request: types: [opened, reopened, synchronize, ready_for_review] concurrency: @@ -20,5 +20,4 @@ jobs: uses: ./.github/workflows/build.yml secrets: inherit with: - prNumber: ${{ github.event.pull_request.number }} runE2ETests: ${{ contains(github.event.pull_request.labels.*.name, 'Checks/Run with UI Tests') }} From d0721741987a226fb4a3164f7ee7f3fcf2c4b69f Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Sat, 26 Jul 2025 12:11:30 +0530 Subject: [PATCH 153/349] Set default value for modelType field if not set --- .../src/views/BI/AIChatAgent/ConfigForm.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ConfigForm.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ConfigForm.tsx index dd5ae9c0885..deeb26ae2ad 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ConfigForm.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ConfigForm.tsx @@ -69,6 +69,12 @@ export function ConfigForm(props: ConfigProps) { onSubmit(formFields, data); }; + // hack: set default value for modelType field if not set + const modelTypeField = formFields.find((field) => field.key === "modelType"); + if (modelTypeField && modelTypeField.value === undefined && (modelTypeField.defaultValue || modelTypeField.placeholder)) { + modelTypeField.value = modelTypeField.defaultValue || modelTypeField.placeholder; + } + // type field hide const typeField = formFields.find((field) => field.key === "type"); if (typeField) { From 816dbef3866fe8d07166b8e278e0596f138123ad Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Sat, 26 Jul 2025 12:11:43 +0530 Subject: [PATCH 154/349] Update model provider names --- .../ballerina-visualizer/src/constants.ts | 14 +++++++------- .../src/views/BI/FlowDiagram/index.tsx | 2 +- .../nodes/AgentCallNode/AgentCallNodeWidget.tsx | 6 ++++++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/constants.ts b/workspaces/ballerina/ballerina-visualizer/src/constants.ts index 21df505a070..8dddc832473 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/constants.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/constants.ts @@ -30,13 +30,13 @@ export const BALLERINAX = "ballerinax"; export const AI = "ai"; export const GET_DEFAULT_MODEL_PROVIDER = "getDefaultModelProvider"; -export const WSO2_MODEL_PROVIDER = "Wso2ModelProvider"; +export const WSO2_MODEL_PROVIDER = "Default Model Provider (WSO2)"; export const PROVIDER_NAME_MAP: Record = { - "ai.anthropic": "AnthropicProvider", - "ai.openai": "OpenAiProvider", - "ai.azure": "AzureOpenAiProvider", - "ai.mistral": "MistralAiProvider", - "ai.deepseek": "DeepseekProvider", - "ai.ollama": "OllamaProvider", + "ai.anthropic": "Anthropic Model Provider", + "ai.openai": "OpenAI Model Provider", + "ai.azure": "Azure Model Provider", + "ai.mistral": "Mistral Model Provider", + "ai.deepseek": "Deepseek Model Provider", + "ai.ollama": "Ollama Model Provider", }; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index 46b22c84ef3..7705d5f98ad 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -399,7 +399,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { const setModelType = (modelObj: any, providerName: string) => { if (modelObj) { - modelObj.type = PROVIDER_NAME_MAP?.[providerName] || providerName; + modelObj.type = providerName; } }; diff --git a/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx b/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx index b9e8fe659c4..21fe7b31f61 100644 --- a/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx @@ -1000,16 +1000,22 @@ function sanitizeAgentData(data: AgentData) { function getLlmModelIcons(modelType: string) { switch (modelType) { case "OpenAiProvider": + case "ai.openai": return ; case "AzureOpenAiProvider": + case "ai.azure": return ; case "AnthropicProvider": + case "ai.anthropic": return ; case "OllamaProvider": + case "ai.ollama": return ; case "MistralAiProvider": + case "ai.mistral": return ; case "DeepseekProvider": + case "ai.deepseek": return ; default: return ; From 4d30a07dd13c67dfa94484c118db1d3096769208 Mon Sep 17 00:00:00 2001 From: madushajg Date: Sat, 26 Jul 2025 12:36:46 +0530 Subject: [PATCH 155/349] Enhance artifact search logic in inline data mapper to support recursive matching and improve accuracy of relevant artifact retrieval --- .../rpc-managers/inline-data-mapper/utils.ts | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/inline-data-mapper/utils.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/inline-data-mapper/utils.ts index 8b79625e556..b77551183f4 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/inline-data-mapper/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/inline-data-mapper/utils.ts @@ -152,16 +152,32 @@ export async function updateSubMappingSource( /** * Finds the artifact that contains the code changes within the specified line range. + * Recursively searches through artifact hierarchy to find the most specific match. */ function findRelevantArtifact( artifacts: ProjectStructureArtifactResponse[], filePath: string, lineRange: ELineRange ): ProjectStructureArtifactResponse | null { - return artifacts.find(artifact => - artifact.path === filePath && - isWithinArtifact(artifact.position, lineRange) - ) || null; + if (!artifacts || artifacts.length === 0) { + return null; + } + + for (const currentArtifact of artifacts) { + 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); + // Return the nested match if found, otherwise return the current artifact + return nestedMatch || currentArtifact; + } + + // No nested resources + return currentArtifact; + } + } + + return null; } /** @@ -388,7 +404,16 @@ export function combineTextEdits(edits: TextEdit[]): TextEdit { /** * Determines whether a variable declaration range is completely contained within an artifact's position range. */ -function isWithinArtifact(artifactPosition: NodePosition, varDeclRange: ELineRange) { +function isWithinArtifact( + artifactPath: string, + filePath: string, + artifactPosition: NodePosition, + varDeclRange: ELineRange +) { + if (artifactPath !== filePath) { + return false; + } + const artifactStartLine = artifactPosition.startLine; const artifactEndLine = artifactPosition.endLine; const varDeclStartLine = varDeclRange.startLine.line; From 7a280103b720b4fe4ae6fd5bcbd3a045fcbb349b Mon Sep 17 00:00:00 2001 From: madushajg Date: Sat, 26 Jul 2025 14:38:38 +0530 Subject: [PATCH 156/349] Fix creating custom functions within query expressions --- .../Port/model/RecordFieldPortModel.ts | 2 +- .../src/components/Diagram/utils/dm-utils.ts | 61 +++++++++++-------- 2 files changed, 37 insertions(+), 26 deletions(-) diff --git a/workspaces/ballerina/data-mapper-view/src/components/Diagram/Port/model/RecordFieldPortModel.ts b/workspaces/ballerina/data-mapper-view/src/components/Diagram/Port/model/RecordFieldPortModel.ts index b46e9f3eae8..1ade0000943 100644 --- a/workspaces/ballerina/data-mapper-view/src/components/Diagram/Port/model/RecordFieldPortModel.ts +++ b/workspaces/ballerina/data-mapper-view/src/components/Diagram/Port/model/RecordFieldPortModel.ts @@ -127,7 +127,7 @@ export class RecordFieldPortModel extends PortModel linkId !== newLinkId) + .length > 0; + let targetPos: NodePosition; let targetType: TypeField; - Object.keys(targetPort.getLinks()).forEach((linkId) => { - if (linkId !== newLinkId) { - const targerPortLink = targetPort.getLinks()[linkId] - if (sourcePort instanceof IntermediatePortModel) { - if (sourcePort.getParent() instanceof LinkConnectorNode) { - targetPos = (sourcePort.getParent() as LinkConnectorNode).valueNode.position as NodePosition + + if (targetPortHasLinks) { + Object.keys(targetPort.getLinks()).forEach((linkId) => { + if (linkId !== newLinkId) { + const targerPortLink = targetPort.getLinks()[linkId] + if (sourcePort instanceof IntermediatePortModel) { + if (sourcePort.getParent() instanceof LinkConnectorNode) { + targetPos = (sourcePort.getParent() as LinkConnectorNode).valueNode.position as NodePosition + } + } else if (targerPortLink.getLabels().length > 0) { + targetPos = (targerPortLink.getLabels()[0] as ExpressionLabelModel).valueNode.position as NodePosition; + targetType = getTypeFromStore(targetPos); + } else if (targetNode instanceof MappingConstructorNode + || targetNode instanceof PrimitiveTypeNode + || targetNode instanceof ListConstructorNode) + { + const linkConnector = targetNode + .getModel() + .getNodes() + .find( + (node) => + node instanceof LinkConnectorNode && + node.targetPort.portName === (targerPortLink.getTargetPort() as RecordFieldPortModel).portName + ); + targetPos = (linkConnector as LinkConnectorNode).valueNode.position as NodePosition; } - } else if (targerPortLink.getLabels().length > 0) { - targetPos = (targerPortLink.getLabels()[0] as ExpressionLabelModel).valueNode.position as NodePosition; - targetType = getTypeFromStore(targetPos); - } else if (targetNode instanceof MappingConstructorNode - || targetNode instanceof PrimitiveTypeNode - || targetNode instanceof ListConstructorNode) - { - const linkConnector = targetNode - .getModel() - .getNodes() - .find( - (node) => - node instanceof LinkConnectorNode && - node.targetPort.portName === (targerPortLink.getTargetPort() as RecordFieldPortModel).portName - ); - targetPos = (linkConnector as LinkConnectorNode).valueNode.position as NodePosition; + } + }); + } else { + targetPos = targetPort?.editableRecordField?.value?.position as NodePosition; + targetType = getTypeFromStore(targetPos); + } - } - }); if (targetType && targetType.typeName === PrimitiveBalType.Json && (sourcePort as RecordFieldPortModel).field.typeName === PrimitiveBalType.Json) { @@ -1539,7 +1550,7 @@ export function getValueType(lm: DataMapperLinkModel): ValueType { value = "[]"; } - if (value !== undefined) { + if (value !== undefined && !isEmptyValue(innerExpr?.position)) { return isDefaultValue(editableRecordField.type, value) ? ValueType.Default : ValueType.NonEmpty; } } From 7f11efa0b52abd76b3a804a8b920430af4021e3e Mon Sep 17 00:00:00 2001 From: Madusha Gunasekera Date: Sat, 26 Jul 2025 14:57:30 +0530 Subject: [PATCH 157/349] Update workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../src/components/Diagram/Node/commons/DataMapperNode.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts index 64b4f944bfb..ae7f92663ce 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts @@ -320,7 +320,7 @@ export abstract class DataMapperNodeModel extends NodeModel f !== null); + const fields = attributes.field?.fields?.filter(f => !!f); if (fields && fields.length) { fields.forEach(subField => { numberOfFields += this.addPortsForInputField({ From 8ceda4057bad768d55558bb215efaa2b051f0df7 Mon Sep 17 00:00:00 2001 From: Madusha Gunasekera Date: Sat, 26 Jul 2025 14:57:43 +0530 Subject: [PATCH 158/349] Update workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNode.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../src/components/Diagram/Node/Input/InputNode.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNode.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNode.ts index 0f8f848726b..09e6465ac95 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNode.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNode.ts @@ -66,7 +66,7 @@ export class InputNode extends DataMapperNodeModel { }); if (this.filteredInputType.kind === TypeKind.Record) { - const fields = this.filteredInputType.fields?.filter(f => f !== null); + const fields = this.filteredInputType.fields?.filter(f => !!f); fields.forEach((subField) => { this.numberOfFields += this.addPortsForInputField({ field: subField, From d8df72bd93b73278a254e570d0651f0402706822 Mon Sep 17 00:00:00 2001 From: Madusha Gunasekera Date: Sat, 26 Jul 2025 14:57:48 +0530 Subject: [PATCH 159/349] Update workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../src/components/Diagram/Node/commons/DataMapperNode.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts index ae7f92663ce..91c09ba6239 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts @@ -359,7 +359,7 @@ export abstract class DataMapperNodeModel extends NodeModel f !== null); + const fields = attributes.field?.fields?.filter(f => !!f); if (fields && fields.length) { fields.forEach((subField) => { this.addPortsForOutputField({ From 99cab129cfe9d6924495795f706b5333cb402bd7 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Sat, 26 Jul 2025 15:04:35 +0530 Subject: [PATCH 160/349] Add moduleName for the typeName --- .../ballerina-core/src/interfaces/inline-data-mapper.ts | 8 ++++++++ .../src/components/Diagram/utils/type-utils.ts | 8 ++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/inline-data-mapper.ts b/workspaces/ballerina/ballerina-core/src/interfaces/inline-data-mapper.ts index 9d58bc2e7d6..369241f13b7 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/inline-data-mapper.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/inline-data-mapper.ts @@ -71,6 +71,13 @@ export interface IDMDiagnostic { }; } +export interface ModuleInfo { + org: string + packageName: string + moduleName: string + version: string +} + export interface IOType { id: string; category?: InputCategory; @@ -84,6 +91,7 @@ export interface IOType { optional?: boolean; focusedMemberId?: string; isFocused?: boolean; + moduleInfo? : ModuleInfo; } export interface Mapping { diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/type-utils.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/type-utils.ts index fc787f4c4d5..f4f965b7c52 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/type-utils.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/type-utils.ts @@ -23,10 +23,10 @@ export function getTypeName(fieldType: IOType): string { } let typeName = fieldType?.typeName || fieldType.kind; - - if (fieldType.kind === TypeKind.Array && fieldType.member) { - typeName = `${getTypeName(fieldType.member)}[]`; - } + + if (fieldType.moduleInfo?.moduleName) { + typeName = `${fieldType.moduleInfo.moduleName}:${typeName}`; + } return typeName; } From 4bebd27353d73faa04ab31496f622df2108dcb84 Mon Sep 17 00:00:00 2001 From: Nipuna Ranasinghe Date: Sat, 26 Jul 2025 13:19:00 +0530 Subject: [PATCH 161/349] Update fast-run request to send java command to the server --- .../src/features/debugger/config-provider.ts | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) 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 f68b9130a32..dfc152e73c4 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/debugger/config-provider.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/debugger/config-provider.ts @@ -41,12 +41,12 @@ import { TM_EVENT_START_DEBUG_SESSION, CMP_DEBUGGER, sendTelemetryEvent, sendTelemetryException, CMP_NOTEBOOK, TM_EVENT_START_NOTEBOOK_DEBUG } from '../telemetry'; -import { log, debug as debugLog, isSupportedSLVersion } from "../../utils"; +import { log, debug as debugLog, isSupportedSLVersion, isWindows } from "../../utils"; import { decimal, ExecutableOptions } from 'vscode-languageclient/node'; import { BAL_NOTEBOOK, getTempFile, NOTEBOOK_CELL_SCHEME } from '../../views/notebook'; import fileUriToPath from 'file-uri-to-path'; import { existsSync, readFileSync } from 'fs'; -import { dirname, sep } from 'path'; +import { dirname, join, sep } from 'path'; import { parseTomlToConfig } from '../config-generator/utils'; import { LoggingDebugSession, OutputEvent, TerminatedEvent } from 'vscode-debugadapter'; import { DebugProtocol } from 'vscode-debugprotocol'; @@ -62,6 +62,8 @@ import { VisualizerWebview } from '../../views/visualizer/webview'; import { URI } from 'vscode-uri'; import { prepareAndGenerateConfig, cleanAndValidateProject } from '../config-generator/configGenerator'; import { extension } from '../../BalExtensionContext'; +import * as fs from 'fs'; +import { findHighestVersionJdk } from '../../utils/server/server'; const BALLERINA_COMMAND = "ballerina.command"; const EXTENDED_CLIENT_CAPABILITIES = "capabilities"; @@ -761,7 +763,10 @@ async function runFast(root: string, options: { debugPort?: number; env?: Map { return (currentProject.kind !== PROJECT_TYPE.SINGLE_FILE) ? currentProject.path! : file; } +function getJavaCommand(): string { + const ballerinaHome = isWindows() ? fs.realpathSync.native(extension.ballerinaExtInstance.getBallerinaHome()) : extension.ballerinaExtInstance.getBallerinaHome(); + // Get the base ballerina home by removing the distribution part + const baseHome = ballerinaHome.includes('distributions') + ? ballerinaHome.substring(0, ballerinaHome.indexOf('distributions')) + : ballerinaHome; + + // Find any JDK in the dependencies directory + const dependenciesDir = join(baseHome, 'dependencies'); + const jdkDir = findHighestVersionJdk(dependenciesDir); + + if (!jdkDir) { + log(`No JDK found in dependencies directory: ${dependenciesDir}`); + throw new Error(`JDK not found in ${dependenciesDir}`); + } + + const jdkVersionMatch = jdkDir.match(/jdk-(.+)-jre/); + if (jdkVersionMatch) { + log(`JDK Version: ${jdkVersionMatch[1]}`); + } + + const javaExecutable = isWindows() ? 'java.exe' : 'java'; + const cmd = join(jdkDir, 'bin', javaExecutable); + return cmd; +} + function getWorkspaceRoot(): string | undefined { return workspace.workspaceFolders?.[0]?.uri.fsPath; } From 9f9f3a6a7ee2fe0b03891d07144fd49b4f25b538 Mon Sep 17 00:00:00 2001 From: Nipuna Ranasinghe Date: Sat, 26 Jul 2025 13:58:55 +0530 Subject: [PATCH 162/349] Fix fast-run when using via code lens and command --- .../src/features/config-generator/configGenerator.ts | 3 ++- .../src/features/project/cmds/run.ts | 10 ++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/config-generator/configGenerator.ts b/workspaces/ballerina/ballerina-extension/src/features/config-generator/configGenerator.ts index decb3f62705..5c437fd2363 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/config-generator/configGenerator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/config-generator/configGenerator.ts @@ -213,6 +213,7 @@ export async function handleOnUnSetValues(packageName: string, configFile: strin async function executeRunCommand(ballerinaExtInstance: BallerinaExtension, filePath: string, isBi?: boolean) { if (ballerinaExtInstance.enabledRunFast() || isBi) { + filePath = (await getCurrentBallerinaProject(filePath)).path; const projectHasErrors = await cleanAndValidateProject(ballerinaExtInstance.langClient, filePath); if (projectHasErrors) { window.showErrorMessage("Project contains errors. Please fix them and try again."); @@ -228,7 +229,7 @@ async function executeRunCommand(ballerinaExtInstance: BallerinaExtension, fileP export async function cleanAndValidateProject(langClient: ExtendedLangClient, path: string): Promise { try { // Get initial project diagnostics - const projectPath = extension.ballerinaExtInstance?.getDocumentContext()?.getCurrentProject()?.path || path; + const projectPath = (await getCurrentBallerinaProject(path)).path; let response: ProjectDiagnosticsResponse = await langClient.getProjectDiagnostics({ projectRootIdentifier: { uri: Uri.file(projectPath).toString() diff --git a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/run.ts b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/run.ts index 55733dc3d59..0a569981c9a 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/run.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/run.ts @@ -29,7 +29,13 @@ import { LANGUAGE } from "../../../core"; function activateRunCmdCommand() { commands.registerCommand(PALETTE_COMMANDS.RUN, async (filePath: Uri) => { - prepareAndGenerateConfig(extension.ballerinaExtInstance, filePath?.fsPath); + let actualFilePath: string | undefined; + if (typeof filePath === 'string') { + actualFilePath = Uri.parse(filePath).fsPath; + } else if (filePath instanceof Uri) { + actualFilePath = filePath.fsPath; + } + prepareAndGenerateConfig(extension.ballerinaExtInstance, actualFilePath); }); // register ballerina run handler @@ -92,7 +98,7 @@ function activateRunCmdCommand() { } function runCurrentFile() { - runCommand(getCurrenDirectoryPath(), extension.ballerinaExtInstance.getBallerinaCmd(), + runCommand(getCurrenDirectoryPath(), extension.ballerinaExtInstance.getBallerinaCmd(), getRunCommand(), getCurrentBallerinaFile()); } From 3ad27907a57999878e6a05b5c92917dc58029bb8 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Sat, 26 Jul 2025 15:15:46 +0530 Subject: [PATCH 163/349] Refactor completion filtering logic in InlineDataMapperView --- .../src/views/InlineDataMapper/DataMapperView.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/InlineDataMapper/DataMapperView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/InlineDataMapper/DataMapperView.tsx index b964334e1a0..d5e5c4d7e42 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/InlineDataMapper/DataMapperView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/InlineDataMapper/DataMapperView.tsx @@ -395,7 +395,7 @@ export function InlineDataMapperView(props: InlineDataMapperProps) { const lowerCaseText = currentContent.toLowerCase(); const lowerCaseLabel = completion.value.toLowerCase(); - return lowerCaseText !== lowerCaseLabel && lowerCaseLabel.startsWith(lowerCaseText); + return lowerCaseLabel.startsWith(lowerCaseText); }) .sort((a, b) => a.sortText.localeCompare(b.sortText)); } else { @@ -442,7 +442,7 @@ export function InlineDataMapperView(props: InlineDataMapperProps) { const lowerCaseText = currentContent.toLowerCase(); const lowerCaseLabel = completion.value.toLowerCase(); - return lowerCaseText !== lowerCaseLabel && lowerCaseLabel.startsWith(lowerCaseText); + return lowerCaseLabel.startsWith(lowerCaseText); }) .sort((a, b) => a.sortText.localeCompare(b.sortText)); } From 29c0fcb1dc693a9fe3dfcd838f5caf2a638b4e37 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Sat, 26 Jul 2025 15:22:52 +0530 Subject: [PATCH 164/349] Make ModuleInfo properties optional --- .../ballerina-core/src/interfaces/inline-data-mapper.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/inline-data-mapper.ts b/workspaces/ballerina/ballerina-core/src/interfaces/inline-data-mapper.ts index 369241f13b7..9cb08dd397e 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/inline-data-mapper.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/inline-data-mapper.ts @@ -72,10 +72,10 @@ export interface IDMDiagnostic { } export interface ModuleInfo { - org: string - packageName: string - moduleName: string - version: string + org?: string + packageName?: string + moduleName?: string + version?: string } export interface IOType { From 44fdd972131c0cb5e4053d6806f7cfbf156cba00 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Sat, 26 Jul 2025 15:51:41 +0530 Subject: [PATCH 165/349] Refactor type handling in custom function generation to use getTypeName utility --- .../src/components/Diagram/utils/modification-utils.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/modification-utils.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/modification-utils.ts index 887c8f5222f..2171c8d38f5 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/modification-utils.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/modification-utils.ts @@ -23,6 +23,7 @@ import { MappingFindingVisitor } from "../../../visitors/MappingFindingVisitor"; import { traverseNode } from "../../../utils/model-utils"; import { getDefaultValue } from "./common-utils"; import { CustomFnMetadata, CustomFnParams, Mapping } from "@wso2/ballerina-core"; +import { getTypeName } from "./type-utils"; export async function createNewMapping(link: DataMapperLinkModel) { const sourcePort = link.getSourcePort(); @@ -95,14 +96,14 @@ export async function mapWithCustomFn(link: DataMapperLinkModel, context: IDataM const outputField = outputPortModel.attributes.field; const inputParams: CustomFnParams[] = [{ name: inputField.variableName, - type: inputField.typeName.replace("record", "any"), + type: getTypeName(inputField).replace("record", "any"), isOptional: false, isNullable: false, kind: inputField.kind }]; const metadata: CustomFnMetadata = { - returnType: outputField.typeName.replace("record", "any"), + returnType: getTypeName(outputField).replace("record", "any"), parameters: inputParams } From 356f361fefa0e9e4ab8c41de7d8ae34e72fbfa71 Mon Sep 17 00:00:00 2001 From: sachiniSam Date: Sat, 26 Jul 2025 16:24:57 +0530 Subject: [PATCH 166/349] Fix comment incorrectly positioning issue --- .../bi-diagram/src/components/NodeLink/NodeLinkWidget.tsx | 2 +- workspaces/ballerina/bi-diagram/src/visitors/PositionVisitor.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/bi-diagram/src/components/NodeLink/NodeLinkWidget.tsx b/workspaces/ballerina/bi-diagram/src/components/NodeLink/NodeLinkWidget.tsx index 172d26a7aa7..ab27721d4a2 100644 --- a/workspaces/ballerina/bi-diagram/src/components/NodeLink/NodeLinkWidget.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/NodeLink/NodeLinkWidget.tsx @@ -140,7 +140,7 @@ export const NodeLinkWidget: React.FC = ({ link, engine }) {link.label && ( diff --git a/workspaces/ballerina/bi-diagram/src/visitors/PositionVisitor.ts b/workspaces/ballerina/bi-diagram/src/visitors/PositionVisitor.ts index 293b7df7d2f..74b8c422bc2 100644 --- a/workspaces/ballerina/bi-diagram/src/visitors/PositionVisitor.ts +++ b/workspaces/ballerina/bi-diagram/src/visitors/PositionVisitor.ts @@ -68,7 +68,7 @@ export class PositionVisitor implements BaseVisitor { beginVisitIf(node: FlowNode, parent?: FlowNode): void { if (!this.validateNode(node)) return; node.viewState.y = this.lastNodeY; - this.lastNodeY += node.viewState.h + (NODE_GAP_Y * 3) / 2; + this.lastNodeY += node.viewState.h + (NODE_GAP_Y * 4) / 2; const centerX = getTopNodeCenter(node, parent, this.diagramCenterX); node.viewState.x = centerX - node.viewState.lw; From 1446633898cfa81f405c7cfe0dff6be3660523cd Mon Sep 17 00:00:00 2001 From: madushajg Date: Sat, 26 Jul 2025 16:57:01 +0530 Subject: [PATCH 167/349] Refactor value type handling in ArrayMappingOptionsWidget and IncompatibleMappingOptionsWidget to use Replaceable and Mergeable types. --- .../Label/ArrayMappingOptionsWidget.tsx | 12 +++---- .../IncompatibleMappingOprionsWidget.tsx | 4 +-- .../Port/model/RecordFieldPortModel.ts | 26 +++----------- .../src/components/Diagram/utils/dm-utils.ts | 36 ++++++++++++++++--- .../Diagram/visitors/NodeInitVisitor.ts | 6 ++-- 5 files changed, 46 insertions(+), 38 deletions(-) diff --git a/workspaces/ballerina/data-mapper-view/src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx b/workspaces/ballerina/data-mapper-view/src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx index f7304d96e3a..8ff5483e5d5 100644 --- a/workspaces/ballerina/data-mapper-view/src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx +++ b/workspaces/ballerina/data-mapper-view/src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx @@ -68,13 +68,13 @@ export function ArrayMappingOptionsWidget(props: ArrayMappingOptionsWidgetProps) const targetPortHasLinks = Object.values(targetPort.links) ?.some(link => (link as DataMapperLinkModel)?.isActualLink); - const isValueModifiable = valueType === ValueType.Default - || (valueType === ValueType.NonEmpty && !targetPortHasLinks); + const isValueModifiable = valueType === ValueType.Replaceable + || (valueType === ValueType.Mergeable && !targetPortHasLinks); const onClickMapArrays = async () => { - if (valueType === ValueType.Default) { + if (valueType === ValueType.Replaceable) { await updateExistingValue(sourcePort, targetPort); - } else if (valueType === ValueType.NonEmpty) { + } else if (valueType === ValueType.Mergeable) { await modifySpecificFieldSource(sourcePort, targetPort, link.getID()); } else { await createSourceForMapping(sourcePort, targetPort); @@ -112,9 +112,9 @@ export function ArrayMappingOptionsWidget(props: ArrayMappingOptionsWidgetProps) const onClickMapArraysAccessSingleton = async () => { const newExpr = (sourcePort as RecordFieldPortModel).fieldFQN + genArrayElementAccessSuffix(sourcePort, targetPort); - if (valueType === ValueType.Default) { + if (valueType === ValueType.Replaceable) { await updateExistingValue(sourcePort, targetPort, newExpr); - } else if (valueType === ValueType.NonEmpty) { + } else if (valueType === ValueType.Mergeable) { await modifySpecificFieldSource(sourcePort, targetPort, link.getID(), newExpr); } else { await createSourceForMapping(sourcePort, targetPort, newExpr); diff --git a/workspaces/ballerina/data-mapper-view/src/components/Diagram/Label/IncompatibleMappingOprionsWidget.tsx b/workspaces/ballerina/data-mapper-view/src/components/Diagram/Label/IncompatibleMappingOprionsWidget.tsx index 304690d988b..1ab998a800d 100644 --- a/workspaces/ballerina/data-mapper-view/src/components/Diagram/Label/IncompatibleMappingOprionsWidget.tsx +++ b/workspaces/ballerina/data-mapper-view/src/components/Diagram/Label/IncompatibleMappingOprionsWidget.tsx @@ -67,9 +67,9 @@ export function IncompatibleMappingOprionsWidget(props: IncompatibleMappingOprio const valueType = getValueType(link); const onClickMapDirectly = async () => { - if (valueType === ValueType.Default) { + if (valueType === ValueType.Replaceable) { await updateExistingValue(sourcePort, targetPort); - } else if (valueType === ValueType.NonEmpty) { + } else if (valueType === ValueType.Mergeable) { await modifySpecificFieldSource(sourcePort, targetPort, link.getID()); } else { await createSourceForMapping(sourcePort, targetPort); diff --git a/workspaces/ballerina/data-mapper-view/src/components/Diagram/Port/model/RecordFieldPortModel.ts b/workspaces/ballerina/data-mapper-view/src/components/Diagram/Port/model/RecordFieldPortModel.ts index 1ade0000943..3a4c4f17093 100644 --- a/workspaces/ballerina/data-mapper-view/src/components/Diagram/Port/model/RecordFieldPortModel.ts +++ b/workspaces/ballerina/data-mapper-view/src/components/Diagram/Port/model/RecordFieldPortModel.ts @@ -47,9 +47,9 @@ export interface RecordFieldNodeModelGenerics { export const FORM_FIELD_PORT = "form-field-port"; export enum ValueType { - Default, + Replaceable, Empty, - NonEmpty + Mergeable } export enum MappingType { @@ -125,9 +125,9 @@ export class RecordFieldPortModel extends PortModel 1 || isIndexedExpression(innerExpr)) { + if (inputNodes.length > 1 || isIndexedExpression(innerExpr) || isComplexExpression(innerExpr)) { const linkConnectorNode = new LinkConnectorNode( this.context, innerExpr, @@ -910,7 +910,7 @@ export class NodeInitVisitor implements Visitor { ) { const inputNodes = getInputNodes(innerExpr); - if (inputNodes.length > 1 || isIndexedExpression(innerExpr)) { + if (inputNodes.length > 1 || isIndexedExpression(innerExpr) || isComplexExpression(innerExpr)) { const linkConnectorNode = new LinkConnectorNode( this.context, innerExpr, @@ -933,7 +933,7 @@ export class NodeInitVisitor implements Visitor { { const inputNodes = getInputNodes(expr); - if (inputNodes.length > 1 || isIndexedExpression(expr)) { + if (inputNodes.length > 1 || isIndexedExpression(expr) || isComplexExpression(expr)) { const linkConnectorNode = new LinkConnectorNode( this.context, node.expression, From a0944c2499239d45628faaad42f9c990288db031 Mon Sep 17 00:00:00 2001 From: madushajg Date: Sat, 26 Jul 2025 17:44:43 +0530 Subject: [PATCH 168/349] Enable navigate into functions used for mappigns --- .../src/views/DataMapper/index.tsx | 9 +++++--- .../LinkConnector/LinkConnectorNodeWidget.tsx | 7 +++--- .../Diagram/visitors/NodeInitVisitor.ts | 22 ++++++++++++++----- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/index.tsx index 22352e2a5e2..f16c9e408f6 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/DataMapper/index.tsx @@ -20,11 +20,10 @@ import React, { useMemo } from "react"; import { DataMapperView } from "@wso2/data-mapper-view"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; -import { STModification, HistoryEntry } from "@wso2/ballerina-core"; +import { STModification, HistoryEntry, EVENT_TYPE } from "@wso2/ballerina-core"; import { FunctionDefinition } from "@wso2/syntax-tree"; import { RecordEditor, StatementEditorComponentProps } from "@wso2/record-creator"; import { View } from "@wso2/ui-toolkit"; -import { URI, Utils } from "vscode-uri"; import { TopNavigationBar } from "../../components/TopNavigationBar"; import { FunctionForm } from "../BI"; @@ -55,7 +54,11 @@ export function DataMapper(props: DataMapperProps) { const goToFunction = async (entry: HistoryEntry) => { - rpcClient.getVisualizerRpcClient().addToHistory(entry); + const documentUri = entry?.location?.documentUri; + const position = entry?.location?.position; + rpcClient + .getVisualizerRpcClient() + .openView({ type: EVENT_TYPE.OPEN_VIEW, location: { documentUri, position } }); }; const applyRecordModifications = async (modifications: STModification[]) => { diff --git a/workspaces/ballerina/data-mapper-view/src/components/Diagram/Node/LinkConnector/LinkConnectorNodeWidget.tsx b/workspaces/ballerina/data-mapper-view/src/components/Diagram/Node/LinkConnector/LinkConnectorNodeWidget.tsx index d10f49fc20d..ea06525d5a3 100644 --- a/workspaces/ballerina/data-mapper-view/src/components/Diagram/Node/LinkConnector/LinkConnectorNodeWidget.tsx +++ b/workspaces/ballerina/data-mapper-view/src/components/Diagram/Node/LinkConnector/LinkConnectorNodeWidget.tsx @@ -49,7 +49,6 @@ export function LinkConnectorNodeWidget(props: LinkConnectorNodeWidgetProps) { const hasError = node.hasError(); const diagnostic = hasError ? node.diagnostics[0] : null; const fnDef = node.fnDefForFnCall; - const isTnfFunctionCall = fnDef && fnDef.isExprBodiedFn; const hasFieldAccessExpr = hasFieldAccessExpression(node.valueNode); const connectedViaCollectClause = context?.selection.selectedST?.mappingType && context.selection.selectedST.mappingType === QueryExprMappingType.A2SWithCollect; @@ -140,15 +139,15 @@ export function LinkConnectorNodeWidget(props: LinkConnectorNodeWidgetProps) {
- {isTnfFunctionCall ? ( + {fnDef ? ( ) : ( )} - {isTnfFunctionCall && ( + {fnDef && ( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/WaitingForLoginSection/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/WaitingForLoginSection/index.tsx index 07b56294e50..c0facb8b48d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/WaitingForLoginSection/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/WaitingForLoginSection/index.tsx @@ -209,7 +209,7 @@ const WaitingForLogin = ({ loginMethod, isValidating = false, errorMessage }: Wa Connect with Anthropic API Key - Enter your Anthropic API key to connect to the AI service. Your API key will be securely stored + Enter your Anthropic API key to connect to BI Copilot. Your API key will be securely stored and used for authentication. From 30d26d1e9c14fe8e5e2034dc8beec4ea358389ae Mon Sep 17 00:00:00 2001 From: Anjana Supun Date: Sat, 26 Jul 2025 21:58:12 +0530 Subject: [PATCH 171/349] Update workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/SettingsPanel/index.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../src/views/AIPanel/SettingsPanel/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/SettingsPanel/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/SettingsPanel/index.tsx index 2708b70bb0e..9961fdfce02 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/SettingsPanel/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/SettingsPanel/index.tsx @@ -102,7 +102,7 @@ export const SettingsPanel = (props: { onClose: () => void }) => { Connect to AI Platforms for Enhanced Features - Log out of BI Copilot + Logout from BI Copilot Logging out will end your session and disconnect access to AI-powered tools like code generation, completions, test generation, and data mappings. From 209aff28dfbec5dbe5cce7b97ff59acfb05861d8 Mon Sep 17 00:00:00 2001 From: Azeem Muzammil Date: Sat, 26 Jul 2025 22:07:17 +0530 Subject: [PATCH 172/349] Fix visual completion not working --- .../src/rpc-types/ai-panel/index.ts | 2 + .../src/rpc-types/ai-panel/rpc-type.ts | 4 +- .../src/features/ai/testGenerator.ts | 1 - .../src/features/natural-programming/utils.ts | 12 ++- .../src/rpc-managers/ai-panel/inline-utils.ts | 94 ++++++++++--------- .../src/rpc-managers/ai-panel/rpc-handler.ts | 2 + .../src/rpc-managers/ai-panel/rpc-manager.ts | 15 ++- .../rpc-managers/bi-diagram/rpc-manager.ts | 18 +++- .../src/rpc-clients/ai-panel/rpc-client.ts | 6 ++ .../src/views/AIPanel/utils/networkUtils.ts | 5 +- 10 files changed, 100 insertions(+), 59 deletions(-) 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 523cdbe4d89..a722377e4ae 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 @@ -17,6 +17,7 @@ * under the License. */ import { InlineAllDataMapperSourceRequest, MetadataWithAttachments } from "../../interfaces/extended-lang-client"; +import { LoginMethod } from "../../state-machine-types"; import { AddToProjectRequest, GetFromFileRequest, DeleteFromProjectRequest, GenerateMappingsRequest, GenerateMappingsResponse, NotifyAIMappingsRequest, ProjectSource, ProjectDiagnostics, GenerateMappingsFromRecordRequest, GenerateMappingFromRecordResponse, PostProcessRequest, PostProcessResponse, GenerateTypesFromRecordRequest, GenerateTypesFromRecordResponse, FetchDataRequest, FetchDataResponse, TestGenerationRequest, TestGenerationResponse, TestGenerationMentions, AIChatSummary, DeveloperDocument, RequirementSpecification, LLMDiagnostics, GetModuleDirParams, AIPanelPrompt, AIMachineSnapshot, SubmitFeedbackRequest, RelevantLibrariesAndFunctionsRequest, GenerateOpenAPIRequest, GenerateCodeRequest, TestPlanGenerationRequest, TestGeneratorIntermediaryState, RepairParams, RelevantLibrariesAndFunctionsResponse, CodeSegment } from "./interfaces"; export interface AIPanelAPI { @@ -25,6 +26,7 @@ export interface AIPanelAPI { // ================================== getBackendUrl: () => Promise; getProjectUuid: () => Promise; + getLoginMethod: () => Promise; getAccessToken: () => Promise; getRefreshedAccessToken: () => Promise; getDefaultPrompt: () => Promise; 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 98390e38bf3..1ba3d835f43 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 @@ -17,13 +17,15 @@ * * THIS FILE INCLUDES AUTO GENERATED CODE */ -import { InlineAllDataMapperSourceRequest, InlineDataMapperSourceResponse, MetadataWithAttachments } from "../../interfaces/extended-lang-client"; +import { InlineAllDataMapperSourceRequest, MetadataWithAttachments } from "../../interfaces/extended-lang-client"; +import { LoginMethod } from "../../state-machine-types"; import { AddToProjectRequest, GetFromFileRequest, DeleteFromProjectRequest, GenerateMappingsRequest, GenerateMappingsResponse, NotifyAIMappingsRequest, ProjectSource, ProjectDiagnostics, GenerateMappingsFromRecordRequest, GenerateMappingFromRecordResponse, PostProcessRequest, PostProcessResponse, GenerateTypesFromRecordRequest, GenerateTypesFromRecordResponse, FetchDataRequest, FetchDataResponse, TestGenerationRequest, TestGenerationResponse, TestGenerationMentions, AIChatSummary, DeveloperDocument, RequirementSpecification, LLMDiagnostics, GetModuleDirParams, AIPanelPrompt, AIMachineSnapshot, SubmitFeedbackRequest, RelevantLibrariesAndFunctionsRequest, GenerateOpenAPIRequest, GenerateCodeRequest, TestPlanGenerationRequest, TestGeneratorIntermediaryState, RepairParams, RelevantLibrariesAndFunctionsResponse, CodeSegment } 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` }; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/testGenerator.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/testGenerator.ts index 829cf863489..a74a3da6287 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/testGenerator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/testGenerator.ts @@ -26,7 +26,6 @@ import * as fs from 'fs'; import * as path from 'path'; import * as os from 'os'; import { writeBallerinaFileDidOpen } from '../../utils/modification'; -import { fetchData } from '../../rpc-managers/ai-panel/utils/fetch-data-utils'; import { closeAllBallerinaFiles } from './utils'; import { generateTestFromLLM, TestGenerationRequest1 } from './service/test/test'; 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 5084e24d0fe..208779e29e4 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts @@ -40,10 +40,10 @@ import { import { isError, isNumber } from 'lodash'; import { HttpStatusCode } from 'axios'; import { OLD_BACKEND_URL } from '../ai/utils'; -import { AIMachineEventType, BallerinaProject } from '@wso2/ballerina-core'; +import { AIMachineEventType, BallerinaProject, LoginMethod } from '@wso2/ballerina-core'; import { getCurrentBallerinaProjectFromContext } from '../config-generator/configGenerator'; import { BallerinaExtension } from 'src/core'; -import { getRefreshedAccessToken, REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE, TOKEN_REFRESH_ONLY_SUPPORTED_FOR_BI_INTEL } from '../../../src/utils/ai/auth'; +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'; @@ -505,7 +505,11 @@ export async function getBackendURL(): Promise { export async function getAccessToken(): Promise { return new Promise(async (resolve) => { - const token = await extension.context.secrets.get('BallerinaAIUser'); + let token: string; + const loginMethod = await getLoginMethod(); + if (loginMethod === LoginMethod.BI_INTEL) { + token = await getAccesstokenFromUtils() + } resolve(token as string); }); } @@ -659,7 +663,7 @@ export async function getConfigFilePath(ballerinaExtInstance: BallerinaExtension activeFilePath = activeTextEditor.document.uri.fsPath; } - if (currentProject == null && activeFilePath == "") { + if (currentProject == null && activeFilePath == "") { return await showNoBallerinaSourceWarningMessage(); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/inline-utils.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/inline-utils.ts index f916f453960..eb3522eec8b 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/inline-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/inline-utils.ts @@ -7,9 +7,9 @@ * You may not alter or remove any copyright or other notice from copies of this content. */ -import { AIMachineEventType, Attachment, ErrorCode, ExpandedDMModel, FieldConfig, FormField, InlineDataMapperModelResponse, InputCategory, IOType, Mapping, MappingElement, ParameterDefinitions, ParameterField, ParameterMetadata, RecordDefinitonObject, TypeKind } from "@wso2/ballerina-core"; +import { AIMachineEventType, Attachment, ErrorCode, ExpandedDMModel, FieldConfig, FormField, InlineDataMapperModelResponse, InputCategory, IOType, LoginMethod, Mapping, MappingElement, ParameterDefinitions, ParameterField, ParameterMetadata, RecordDefinitonObject, TypeKind } from "@wso2/ballerina-core"; import { fetchWithTimeout, filterResponse, generateBallerinaCode, isErrorCode, mappingFileInlineDataMapperModel, navigateTypeInfo, REQUEST_TIMEOUT } from "./utils"; -import { getAccessToken, getRefreshedAccessToken } from "../../utils/ai/auth"; +import { getAccessToken, getLoginMethod, getRefreshedAccessToken } from "../../utils/ai/auth"; import { NOT_LOGGED_IN, TIMEOUT } from "../../views/ai-panel/errorCodes"; import { AIStateMachine } from "../../views/ai-panel/aiMachine"; import { BACKEND_URL } from "../../features/ai/utils"; @@ -103,13 +103,13 @@ function transformInputs(inputs: IOType[]): { configurables: Record; variables: Record; parameters: ParameterField[]; - parameterFields: { [parameterName: string]: FormField[] }; + parameterFields: { [parameterName: string]: FormField[] }; } { const constants: Record = {}; const configurables: Record = {}; const variables: Record = {}; const parameters: ParameterField[] = []; - const parameterFields: { [parameterName: string]: FormField[] } = {}; + const parameterFields: { [parameterName: string]: FormField[] } = {}; inputs.forEach((input) => { // Helper function to create ParameterField @@ -182,7 +182,7 @@ function transformInputs(inputs: IOType[]): { if (input.category === InputCategory.Parameter) { const parameterField = createParameterField(input); parameters.push(parameterField); - + const parameterName = input.id; if (input.fields) { parameterFields[parameterName] = input.fields.map(transformIOType); @@ -221,7 +221,7 @@ function cleanIOType(ioType: IOType | null | undefined): IOType | null { .filter(field => !isNullOrUndefined(field)) .map(field => cleanIOType(field)) .filter(field => field !== null) as IOType[]; - + if (cleanedFields.length > 0) { cleaned.fields = cleanedFields; } @@ -237,12 +237,12 @@ function cleanIOType(ioType: IOType | null | undefined): IOType | null { // Clean members array - remove null/undefined elements if (ioType.members && Array.isArray(ioType.members)) { - const cleanedMembers = ioType.members.filter(member => - !isNullOrUndefined(member) && - !isNullOrUndefined(member.id) && + const cleanedMembers = ioType.members.filter(member => + !isNullOrUndefined(member) && + !isNullOrUndefined(member.id) && !isNullOrUndefined(member.value) ); - + if (cleanedMembers.length > 0) { cleaned.members = cleanedMembers; } @@ -261,7 +261,7 @@ function cleanExpandedDMModel(model: ExpandedDMModel): ExpandedDMModel { .filter(input => !isNullOrUndefined(input)) .map(input => cleanIOType(input)) .filter(input => input !== null) as IOType[]; - + cleaned.inputs = cleanedInputs; } @@ -279,7 +279,7 @@ function cleanExpandedDMModel(model: ExpandedDMModel): ExpandedDMModel { .filter(subMapping => !isNullOrUndefined(subMapping)) .map(subMapping => cleanIOType(subMapping)) .filter(subMapping => subMapping !== null) as IOType[]; - + if (cleanedSubMappings.length > 0) { cleaned.subMappings = cleanedSubMappings; } @@ -287,19 +287,19 @@ function cleanExpandedDMModel(model: ExpandedDMModel): ExpandedDMModel { // Clean mappings array - remove null/undefined elements if (model.mappings && Array.isArray(model.mappings)) { - const cleanedMappings = model.mappings.filter(mapping => - !isNullOrUndefined(mapping) && - !isNullOrUndefined(mapping.output) && + const cleanedMappings = model.mappings.filter(mapping => + !isNullOrUndefined(mapping) && + !isNullOrUndefined(mapping.output) && !isNullOrUndefined(mapping.expression) ); - + // Also clean inputs array within each mapping cleanedMappings.forEach(mapping => { if (mapping.inputs && Array.isArray(mapping.inputs)) { mapping.inputs = mapping.inputs.filter(input => !isNullOrUndefined(input)); } }); - + cleaned.mappings = cleanedMappings; } @@ -328,11 +328,11 @@ function cleanInlineDataMapperModelResponse( function transformCodeObjectToMappings(codeObject: any, request: InlineDataMapperModelResponse): Mapping[] { const mappings: Mapping[] = []; - + // Get the output variable name from the request const { output: mappingOutput } = request.mappingsModel as ExpandedDMModel; const outputVariableName = mappingOutput.variableName || extractNameFromId(mappingOutput.id); - + // Iterate through each property in codeObject Object.keys(codeObject).forEach(key => { const mapping: Mapping = { @@ -341,7 +341,7 @@ function transformCodeObjectToMappings(codeObject: any, request: InlineDataMappe }; mappings.push(mapping); }); - + return mappings; } @@ -358,30 +358,30 @@ export async function getInlineParamDefinitions( let transformedInputs = transformInputs(mappingInputs); let transformedOutputs = transformOutput(mappingOutput); - for (const parameter of transformedInputs.parameters) { - const inputDefinition: ErrorCode | RecordDefinitonObject = navigateTypeInfo(transformedInputs.parameterFields[parameter.parameterName], false); + for (const parameter of transformedInputs.parameters) { + const inputDefinition: ErrorCode | RecordDefinitonObject = navigateTypeInfo(transformedInputs.parameterFields[parameter.parameterName], false); - if (isErrorCode(inputDefinition)) { - return inputDefinition as ErrorCode; - } + if (isErrorCode(inputDefinition)) { + return inputDefinition as ErrorCode; + } - inputs = { - ...inputs, - [parameter.parameterName]: (inputDefinition as RecordDefinitonObject).recordFields - }; + inputs = { + ...inputs, + [parameter.parameterName]: (inputDefinition as RecordDefinitonObject).recordFields + }; + + inputMetadata = { + ...inputMetadata, + [parameter.parameterName]: { + "isArrayType": parameter.isArrayType, + "parameterName": parameter.parameterName, + "parameterType": parameter.parameterType, + "type": parameter.type, + "fields": (inputDefinition as RecordDefinitonObject).recordFieldsMetadata + } + }; + } - inputMetadata = { - ...inputMetadata, - [parameter.parameterName]: { - "isArrayType": parameter.isArrayType, - "parameterName": parameter.parameterName, - "parameterType": parameter.parameterType, - "type": parameter.type, - "fields": (inputDefinition as RecordDefinitonObject).recordFieldsMetadata - } - }; - } - const outputDefinition = navigateTypeInfo(transformedOutputs, false); if (isErrorCode(outputDefinition)) { @@ -425,10 +425,14 @@ async function sendInlineDatamapperRequest(inlineDataMapperResponse: InlineDataM async function getInlineDatamapperCode(inlineDataMapperResponse: InlineDataMapperModelResponse | ErrorCode, parameterDefinitions: ParameterMetadata | ErrorCode): Promise { let nestedKeyArray: string[] = []; try { - const accessToken = await getAccessToken().catch((error) => { - console.error(error); - return NOT_LOGGED_IN; - }); + let accessToken: string | ErrorCode; + const loginMethod = await getLoginMethod(); + if (loginMethod === LoginMethod.BI_INTEL) { + accessToken = await getAccessToken().catch((error) => { + console.error(error); + return NOT_LOGGED_IN; + }); + } let response = await sendInlineDatamapperRequest(inlineDataMapperResponse, accessToken); if (isErrorCode(response)) { return (response as ErrorCode); 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 92b7c82cd2b..132045a020a 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 @@ -58,6 +58,7 @@ import { getFromFile, GetFromFileRequest, getGeneratedTests, + getLoginMethod, getMappingsFromModel, getMappingsFromRecord, getModuleDirectory, @@ -109,6 +110,7 @@ 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()); 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 fc3b35e6b22..08f441e48f3 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 @@ -47,6 +47,7 @@ import { InlineAllDataMapperSourceRequest, InlineDataMapperModelResponse, LLMDiagnostics, + LoginMethod, MappingElement, MetadataWithAttachments, NotifyAIMappingsRequest, @@ -69,8 +70,7 @@ import { TestGenerationResponse, TestGeneratorIntermediaryState, TestPlanGenerationRequest, - TextEdit, - openInlineMappingChatWindow + TextEdit } from "@wso2/ballerina-core"; import { STKindChecker, STNode } from "@wso2/syntax-tree"; import * as crypto from 'crypto'; @@ -96,10 +96,10 @@ 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 { closeAllBallerinaFiles, OLD_BACKEND_URL } from "../../features/ai/utils"; +import { OLD_BACKEND_URL, closeAllBallerinaFiles } from "../../features/ai/utils"; import { getLLMDiagnosticArrayAsString, handleChatSummaryFailure } from "../../features/natural-programming/utils"; import { StateMachine, updateView } from "../../stateMachine"; -import { getAccessToken, getRefreshedAccessToken, loginGithubCopilot } from "../../utils/ai/auth"; +import { getAccessToken, getLoginMethod, getRefreshedAccessToken, loginGithubCopilot } from "../../utils/ai/auth"; import { modifyFileContent, writeBallerinaFileDidOpen } from "../../utils/modification"; import { updateSourceCode } from "../../utils/source-utils"; import { PARSING_ERROR, UNKNOWN_ERROR } from "../../views/ai-panel/errorCodes"; @@ -149,6 +149,13 @@ export class AiPanelRpcManager implements AIPanelAPI { }); } + async getLoginMethod(): Promise { + return new Promise(async (resolve) => { + const loginMethod = await getLoginMethod(); + resolve(loginMethod); + }); + } + async getAccessToken(): Promise { return new Promise(async (resolve, reject) => { try { 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 c10f529d34d..6eafee80608 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 @@ -134,6 +134,7 @@ import { WorkspacesResponse, DeleteConfigVariableRequestV2, DeleteConfigVariableResponseV2, + LoginMethod, } from "@wso2/ballerina-core"; import * as fs from "fs"; import * as path from 'path'; @@ -161,6 +162,7 @@ import { getCompleteSuggestions } from '../../utils/ai/completions'; import { README_FILE, createBIAutomation, createBIFunction, createBIProjectPure } from "../../utils/bi"; import { writeBallerinaFileDidOpen } from "../../utils/modification"; import { updateSourceCode } from "../../utils/source-utils"; +import { getAccessToken, getLoginMethod } from "../../utils/ai/auth"; export class BiDiagramRpcManager implements BIDiagramAPI { OpenConfigTomlRequest: (params: OpenConfigTomlRequest) => Promise; @@ -351,7 +353,7 @@ export class BiDiagramRpcManager implements BIDiagramAPI { resolve(undefined); }); }); - }); + }); } async getAvailableEmbeddingProviders(params: BIAvailableNodesRequest): Promise { @@ -488,7 +490,12 @@ export class BiDiagramRpcManager implements BIDiagramAPI { let suggestedContent; try { if (prompt) { - const token = await extension.context.secrets.get("BallerinaAIUser"); + let token: string; + const loginMethod = await getLoginMethod(); + if (loginMethod === LoginMethod.BI_INTEL) { + token = await getAccessToken() + } + if (!token) { resolve(undefined); return; @@ -508,6 +515,7 @@ export class BiDiagramRpcManager implements BIDiagramAPI { // generate new nodes const response = await fetchWithAuth(OLD_BACKEND_URL + "/inline/generation", requestOptions); if (!response.ok) { + console.log(">>> ai completion api call failed ", response.status); console.log(">>> ai completion api call failed ", response); return new Promise((resolve) => { resolve(undefined); @@ -520,7 +528,11 @@ export class BiDiagramRpcManager implements BIDiagramAPI { // get next suggestion const copilot_token = await extension.context.secrets.get("GITHUB_COPILOT_TOKEN"); if (!copilot_token) { - const token = await extension.context.secrets.get("BallerinaAIUser"); + let token: string; + const loginMethod = await getLoginMethod(); + if (loginMethod === LoginMethod.BI_INTEL) { + token = await getAccessToken() + } if (!token) { //TODO: Do we need to prompt to login here? If so what? Copilot or Ballerina AI? resolve(undefined); 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 8461b7a3f19..9a5f0cbe1df 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 @@ -40,6 +40,7 @@ import { GetModuleDirParams, InlineAllDataMapperSourceRequest, LLMDiagnostics, + LoginMethod, MetadataWithAttachments, NotifyAIMappingsRequest, PostProcessRequest, @@ -84,6 +85,7 @@ import { getFromDocumentation, getFromFile, getGeneratedTests, + getLoginMethod, getMappingsFromModel, getMappingsFromRecord, getModuleDirectory, @@ -133,6 +135,10 @@ export class AiPanelRpcClient implements AIPanelAPI { 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); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/utils/networkUtils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/utils/networkUtils.ts index 7eb6e98be93..0fbb924e3d0 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/utils/networkUtils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/utils/networkUtils.ts @@ -51,7 +51,10 @@ export const fetchWithAuth = async ({ let finalToken; try { - finalToken = await rpcClient.getAiPanelRpcClient().getAccessToken(); + const loginMethod = await rpcClient.getAiPanelRpcClient().getLoginMethod(); + if (loginMethod === "BI_INTEL") { + finalToken = await rpcClient.getAiPanelRpcClient().getAccessToken(); + } } catch (error) { if (isErrorWithMessage(error) && error?.message === "TOKEN_EXPIRED") { rpcClient.sendAIStateEvent(AIMachineEventType.SILENT_LOGOUT); From ad6527573cc368cc64a612bac7d9d42f34d17075 Mon Sep 17 00:00:00 2001 From: tharindulak Date: Sun, 27 Jul 2025 00:19:35 +0530 Subject: [PATCH 173/349] Fix connector test failure --- .../src/test/e2e-playwright-tests/components/Diagram.ts | 8 ++++---- .../src/test/e2e-playwright-tests/components/Welcome.ts | 2 +- .../e2e-playwright-tests/connectorTests/connector.spec.ts | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/Diagram.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/Diagram.ts index 5f514b3c7df..f29521164a7 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/Diagram.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/Diagram.ts @@ -142,11 +142,11 @@ export class Diagram { await sidePanel.close(); } - public async addConnectorOperation(connector: string, operation: string) { + public async addConnectorOperation(connector: string, operation: string, operationId?: string) { const sidePanel = new SidePanel(this.diagramWebView); await sidePanel.init(); await sidePanel.search(operation); - await sidePanel.addConnector(connector, operation); + await sidePanel.addConnector(connector, operation, operationId); } public async fillConnectorForm(props: FormFillProps) { @@ -316,12 +316,12 @@ export class SidePanel { await this.sidePanel.waitFor({ state: 'detached' }) } - public async addConnector(connectorName: string, operationName: string) { + public async addConnector(connectorName: string, operationName: string, operationId?: string) { const connector = this.sidePanel.locator(`#card-select-${connectorName}`).nth(0); await connector.waitFor(); const connectorComponent = connector.locator(`..`); - const operation = connectorComponent.locator(`#card-select-${operationName}`); + const operation = connectorComponent.locator(`#card-select-${operationId ? operationId : operationName}`); await operation.waitFor(); await operation.click(); } diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/Welcome.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/Welcome.ts index 4afb67f65c7..6ccbb22ff2d 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/Welcome.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/Welcome.ts @@ -51,7 +51,7 @@ export class Welcome { } public async waitUntilDeattached() { - await this.page.page.waitForSelector('iframe.webview.ready', { state: 'detached', timeout: 40000 }); + await this.page.page.waitForSelector('iframe.webview.ready', { state: 'detached', timeout: 75000 }); } public async setupEnvironment() { diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/connectorTests/connector.spec.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/connectorTests/connector.spec.ts index 121d6979e82..ff09b4bd96d 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/connectorTests/connector.spec.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/connectorTests/connector.spec.ts @@ -159,7 +159,7 @@ export default function createTests() { const diagram = new Diagram(page.page, 'Resource'); await diagram.init(); - await diagram.addConnectorOperation('CSV', 'csvToCsv'); + await diagram.addConnectorOperation('CSV', 'CSV to CSV', 'CSV\\ to\\ CSV'); // Fill connector form await diagram.fillConnectorForm({ From b271c20904332f077cda9c4562c975d6a001ca30 Mon Sep 17 00:00:00 2001 From: Nuvindu Date: Sun, 27 Jul 2025 11:22:01 +0530 Subject: [PATCH 174/349] Remove redundant default value field in mcp toolkit --- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index 95c22202cbb..324387edd6c 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -286,11 +286,13 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { org: "ballerina", module: "mcp", "packageName": "mcp", - version: "0.4.2", + version: "0.9.1", symbol: "init", object: "Client" } }); + // Remove defaultValue from info if it exists + removeDefaultValueFromInfo(mcpToolResponse.flowNode.properties); setMcpToolResponse(mcpToolResponse.flowNode) console.log(">>> response getSourceCode with template ", { mcpToolResponse }); console.log(">>> agent node ", { agentNode }); @@ -318,7 +320,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { properties: updatedProperties, codedata: mcpVariable.codedata, }; - + removeDefaultValueFromInfo(updatedMcpToolResponse.properties); setMcpToolResponse(updatedMcpToolResponse); } if (agentNode?.properties?.tools?.value) { @@ -690,6 +692,12 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { }] }; + function removeDefaultValueFromInfo(properties: any) { + if (properties && properties.info && typeof properties.info === 'object' && 'defaultValue' in properties.info) { + delete properties.info.defaultValue; + } + } + // Refactor to accept variableName as parameter const updateMcpToolResponseWithToolsField = (variableName?: string) => { if (mcpToolResponse) { @@ -722,7 +730,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { ...mcpToolResponse, properties: updatedProperties, }; - + removeDefaultValueFromInfo(updatedMcpToolResponse.properties); setMcpToolResponse(updatedMcpToolResponse); } }; From e5b4bde3f16407dbaa3dbd961458a4542940ce70 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Sat, 26 Jul 2025 16:23:37 +0530 Subject: [PATCH 175/349] Add getTool method in RPC handlers and clients --- .../src/interfaces/extended-lang-client.ts | 22 +++++++++++++++++-- .../src/rpc-types/ai-agent/index.ts | 3 ++- .../src/rpc-types/ai-agent/rpc-type.ts | 3 ++- .../src/core/extended-language-client.ts | 11 ++++++++-- .../src/rpc-managers/ai-agent/rpc-handler.ts | 3 +++ .../src/rpc-managers/ai-agent/rpc-manager.ts | 20 ++++++++++++++--- .../src/rpc-clients/ai-agent/rpc-client.ts | 7 ++++++ 7 files changed, 60 insertions(+), 9 deletions(-) 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 d23726e2ddc..d915d5f4804 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -352,7 +352,7 @@ export interface AddArrayElementRequest { propertyKey?: string; } -export interface ConvertToQueryRequest{ +export interface ConvertToQueryRequest { filePath: string; codedata: CodeData; varName?: string; @@ -387,7 +387,7 @@ export interface DeleteMappingRequest { targetField: string; } -export interface MapWithCustomFnRequest{ +export interface MapWithCustomFnRequest { filePath: string; codedata: CodeData; mapping: Mapping; @@ -1574,6 +1574,24 @@ export interface AIToolsResponse { tools: string[]; } +export interface AIToolRequest { + toolName: string; + projectPath: string; +} + +export interface AIToolResponse { + name: string; + source: string; + toolParameters: Property; + connection: string; + description: string; + toolDescription: string; + diagram: FunctionNode; + output: { + [key: string]: TextEdit[]; + }; +} + export interface McpToolsRequest { serviceUrl?: string; configs?: Record; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts index 1c93a7ae60f..1be262a1469 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts @@ -16,7 +16,7 @@ * under the License. */ -import { AiModuleOrgRequest, AiModuleOrgResponse, AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest, McpToolsRequest, McpToolsResponse } from "../../interfaces/extended-lang-client"; +import { AiModuleOrgRequest, AiModuleOrgResponse, AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest, McpToolsRequest, McpToolsResponse, AIToolResponse, AIToolRequest } from "../../interfaces/extended-lang-client"; import { AIAgentRequest, AIAgentResponse, AIAgentToolsUpdateRequest, McpToolUpdateRequest } from "./interfaces"; export interface AIAgentAPI { @@ -26,6 +26,7 @@ export interface AIAgentAPI { getAllMemoryManagers: (params: MemoryManagersRequest) => Promise; getModels: (params: AIModelsRequest) => Promise; getTools: (params: AIToolsRequest) => Promise; + getTool: (params: AIToolRequest) => Promise; getMcpTools: (params: McpToolsRequest) => Promise; genTool: (params: AIGentToolsRequest) => Promise; createAIAgent: (params: AIAgentRequest) => Promise; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts index d23d1998849..e57f06c3bae 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts @@ -17,7 +17,7 @@ * * THIS FILE INCLUDES AUTO GENERATED CODE */ -import { AiModuleOrgRequest, AiModuleOrgResponse, AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest, McpToolsRequest, McpToolsResponse } from "../../interfaces/extended-lang-client"; +import { AiModuleOrgRequest, AiModuleOrgResponse, AIGentToolsRequest, AIGentToolsResponse, AIModelsRequest, AINodesRequest, AINodesResponse, AIToolsRequest, AIToolsResponse, AIModelsResponse, MemoryManagersResponse, MemoryManagersRequest, McpToolsRequest, McpToolsResponse, AIToolResponse, AIToolRequest } from "../../interfaces/extended-lang-client"; import { AIAgentRequest, AIAgentResponse, AIAgentToolsUpdateRequest, McpToolUpdateRequest } from "./interfaces"; import { RequestType, NotificationType } from "vscode-messenger-common"; @@ -28,6 +28,7 @@ export const getAllModels: RequestType = { met export const getAllMemoryManagers: RequestType = { method: `${_preFix}/getAllMemoryManagers` }; export const getModels: RequestType = { method: `${_preFix}/getModels` }; export const getTools: RequestType = { method: `${_preFix}/getTools` }; +export const getTool: RequestType = { method: `${_preFix}/getTool` }; export const getMcpTools: RequestType = { method: `${_preFix}/getMcpTools` }; export const genTool: RequestType = { method: `${_preFix}/genTool` }; export const createAIAgent: RequestType = { method: `${_preFix}/createAIAgent` }; 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 093f18a8efd..d484b167161 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts @@ -246,7 +246,9 @@ import { GetSubMappingCodedataRequest, AddSubMappingRequest, DeleteMappingRequest, - MapWithCustomFnRequest + MapWithCustomFnRequest, + AIToolResponse, + AIToolRequest } from "@wso2/ballerina-core"; import { BallerinaExtension } from "./index"; import { debug, handlePullModuleProgress } from "../utils"; @@ -401,6 +403,7 @@ enum EXTENDED_APIS { BI_AI_ALL_MEMORY_MANAGERS = 'agentManager/getAllMemoryManagers', BI_AI_GET_MODELS = 'agentManager/getModels', BI_AI_GET_TOOLS = 'agentManager/getTools', + BI_AI_GET_TOOL = 'agentManager/getTool', BI_AI_GET_MCP_TOOLS = 'agentManager/getMcpTools', BI_AI_GEN_TOOLS = 'agentManager/genTool', BI_IS_ICP_ENABLED = 'icpService/isIcpEnabled', @@ -1184,7 +1187,7 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest(EXTENDED_APIS.BI_ADD_FUNCTION, params); } - async getAiModuleOrg(params: AiModuleOrgRequest) : Promise { + async getAiModuleOrg(params: AiModuleOrgRequest): Promise { return this.sendRequest(EXTENDED_APIS.BI_AI_AGENT_ORG, params); } @@ -1208,6 +1211,10 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest(EXTENDED_APIS.BI_AI_GET_TOOLS, params); } + async getTool(params: AIToolRequest): Promise { + return this.sendRequest(EXTENDED_APIS.BI_AI_GET_TOOL, params); + } + async getMcpTools(params: McpToolsRequest): Promise { return this.sendRequest(EXTENDED_APIS.BI_AI_GET_MCP_TOOLS, params); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts index c69e9f0922a..a6619a1e2c0 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts @@ -24,6 +24,7 @@ import { AIGentToolsRequest, AIModelsRequest, AINodesRequest, + AIToolRequest, AIToolsRequest, createAIAgent, genTool, @@ -33,6 +34,7 @@ import { getAllModels, getMcpTools, getModels, + getTool, getTools, McpToolsRequest, McpToolUpdateRequest, @@ -51,6 +53,7 @@ export function registerAiAgentRpcHandlers(messenger: Messenger) { messenger.onRequest(getAllMemoryManagers, (args: MemoryManagersRequest) => rpcManger.getAllMemoryManagers(args)); messenger.onRequest(getModels, (args: AIModelsRequest) => rpcManger.getModels(args)); messenger.onRequest(getTools, (args: AIToolsRequest) => rpcManger.getTools(args)); + messenger.onRequest(getTool, (args: AIToolRequest) => rpcManger.getTool(args)); messenger.onRequest(getMcpTools, (args: McpToolsRequest) => rpcManger.getMcpTools(args)); messenger.onRequest(genTool, (args: AIGentToolsRequest) => rpcManger.genTool(args)); messenger.onRequest(createAIAgent, (args: AIAgentRequest) => rpcManger.createAIAgent(args)); diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts index 5984ba94d2b..5a1fc6867f8 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts @@ -28,6 +28,8 @@ import { AIModelsResponse, AINodesRequest, AINodesResponse, + AIToolRequest, + AIToolResponse, AIToolsRequest, AIToolsResponse, AgentTool, @@ -158,7 +160,7 @@ export class AiAgentRpcManager implements AIAgentAPI { // Create the model Second const aiModuleOrg = await StateMachine.langClient().getAiModuleOrg({ projectPath: projectUri }); - const allAgents = (await StateMachine.langClient().getAllAgents({ filePath, orgName: aiModuleOrg.orgName})); + const allAgents = (await StateMachine.langClient().getAllAgents({ filePath, orgName: aiModuleOrg.orgName })); console.log("All Agents: ", allAgents); const fixedAgentCodeData = allAgents.agents.at(0); @@ -408,7 +410,7 @@ export class AiAgentRpcManager implements AIAgentAPI { async updateMCPToolKit(params: McpToolUpdateRequest): Promise { const projectUri = StateMachine.context().projectUri; const filePath = Utils.joinPath(URI.file(projectUri), "agents.bal").fsPath; - + // Generate the variable name from the server name const variableName = params.updatedNode.properties["variable"].value; @@ -489,7 +491,7 @@ export class AiAgentRpcManager implements AIAgentAPI { } } } - + // 2. Update the agent's tools array to include the variable name (following updateAIAgentTools pattern) const agentFlowNode = params.agentFlowNode; let toolsValue = agentFlowNode.properties["tools"].value; @@ -552,4 +554,16 @@ export class AiAgentRpcManager implements AIAgentAPI { ) .join(''); } + + async getTool(params: AIToolRequest): Promise { + return new Promise(async (resolve) => { + const context = StateMachine.context(); + try { + const res: AIToolResponse = await context.langClient.getTool(params); + resolve(res); + } catch (error) { + console.log(error); + } + }); + } } diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts index 67a8dd8ab3c..28e025127dd 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts @@ -30,6 +30,8 @@ import { AIModelsResponse, AINodesRequest, AINodesResponse, + AIToolRequest, + AIToolResponse, AIToolsRequest, AIToolsResponse, createAIAgent, @@ -40,6 +42,7 @@ import { getAllModels, getMcpTools, getModels, + getTool, getTools, McpToolsRequest, McpToolsResponse, @@ -83,6 +86,10 @@ export class AiAgentRpcClient implements AIAgentAPI { return this._messenger.sendRequest(getTools, HOST_EXTENSION, params); } + getTool(params: AIToolRequest): Promise { + return this._messenger.sendRequest(getTool, HOST_EXTENSION, params); + } + getMcpTools(params: McpToolsRequest): Promise { return this._messenger.sendRequest(getMcpTools, HOST_EXTENSION, params); } From c39e7bc3fccb5fb63ef55451d51d26f9e4235853 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Sun, 27 Jul 2025 00:06:04 +0530 Subject: [PATCH 176/349] Update new tool form to support param editing for FUNCTION_CALL nodes --- .../ballerina-core/src/interfaces/bi.ts | 3 + .../src/interfaces/extended-lang-client.ts | 2 + .../src/rpc-types/ai-agent/interfaces.ts | 42 +++- .../views/BI/AIChatAgent/AIAgentSidePanel.tsx | 227 ++++++++++++++---- .../src/views/BI/AIChatAgent/NewTool.tsx | 26 +- .../src/views/BI/AIChatAgent/utils.ts | 78 ++++-- 6 files changed, 302 insertions(+), 76 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts index 292a9084d28..4167bc1f4d5 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts @@ -315,6 +315,8 @@ export type NodePropertyKey = | "enableModelContext" | "expression" | "functionName" + | "functionNameDescription" + | "isIsolated" | "maxIter" | "memory" | "method" @@ -334,6 +336,7 @@ export type NodePropertyKey = | "targetType" | "tools" | "type" + | "typeDescription" | "variable" | "verbose" | "view"; 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 d915d5f4804..8b337d495a4 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -31,6 +31,7 @@ import { CDModel } from "./component-diagram"; import { DMModel, ExpandedDMModel, IntermediateClause, Mapping, VisualizableField, CustomFnMetadata } from "./inline-data-mapper"; import { DataMapperMetadata, SCOPE } from "../state-machine-types"; import { Attachment } from "../rpc-types/ai-panel/interfaces"; +import { ToolParameters } from "../rpc-types/ai-agent/interfaces"; export interface DidOpenParams { textDocument: TextDocumentItem; @@ -1612,6 +1613,7 @@ export interface AIGentToolsRequest { toolName: string; description: string; connection: string; + toolParameters?: ToolParameters; } export interface AIGentToolsResponse { 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 4b3d3d03c18..9b613d728a2 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 } from "../../interfaces/bi"; +import { CodeData, FlowNode, Metadata } from "../../interfaces/bi"; export interface AgentTool { toolName: string; @@ -44,6 +44,7 @@ export interface AgentToolRequest { toolName: string; description: string; selectedCodeData: CodeData; // Codedata can be FUNCTION_CALL | REMOTE_ACTION_CALL + toolParameters?: ToolParameters; // Optional: Parameters for the tool, can be an object or array } export interface AIAgentRequest { @@ -76,3 +77,42 @@ export interface McpToolUpdateRequest { mcpTools?: any[]; // Optional: list of MCP tools codedata?: CodeData; // Optional: code data for MCP toolkit } + +export interface ToolParameters { + metadata: Metadata; + valueType: string; + valueTypeConstraint: ValueTypeConstraint; + value: ToolParametersValue; + optional: boolean; + editable: boolean; + advanced: boolean; +} + +export interface ToolParametersValue { + [key: string]: ValueTypeConstraint; +} + +export interface ValueTypeConstraint { + metadata: Metadata; + valueType: string; + value: ValueTypeConstraintValue; + optional: boolean; + editable: boolean; + advanced: boolean; +} + +export interface ValueTypeConstraintValue { + type: ValueType; + variable: ValueType; + parameterDescription: ValueType; +} + +export interface ValueType { + metadata: Metadata; + valueType: string; + valueTypeConstraint?: string; + value: string; + optional: boolean; + editable: boolean; + advanced: boolean; +} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx index 5ed17d18a65..c69807ba2bc 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx @@ -18,7 +18,7 @@ import { useEffect, useRef, useState } from "react"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; -import { NodeList, Category as PanelCategory, FormField, FormValues } from "@wso2/ballerina-side-panel"; +import { NodeList, Category as PanelCategory, FormField, FormValues, Parameter } from "@wso2/ballerina-side-panel"; import { BIAvailableNodesRequest, Category, @@ -31,15 +31,26 @@ import { BISearchRequest, CodeData, AgentToolRequest, + NodeMetadata, + FunctionNode, + FlowNode, + Property, + ToolParameters, + ValueTypeConstraint, + ToolParametersValue, } from "@wso2/ballerina-core"; import { convertBICategoriesToSidePanelCategories, + convertConfig, convertFunctionCategoriesToSidePanelCategories, } from "../../../utils/bi"; import FormGeneratorNew from "../Forms/FormGeneratorNew"; import { RelativeLoader } from "../../../components/RelativeLoader"; import styled from "@emotion/styled"; +import { URI, Utils } from "vscode-uri"; +import { cloneDeep } from "lodash"; +import { createDefaultParameterValue } from "./utils"; const LoaderContainer = styled.div` display: flex; @@ -55,7 +66,12 @@ export enum SidePanelView { export interface BIFlowDiagramProps { projectPath: string; - onSubmit: (data: AgentToolRequest) => void; + onSubmit: (data: ExtendedAgentToolRequest) => void; +} + +export interface ExtendedAgentToolRequest extends AgentToolRequest { + functionNode?: FunctionNode; + flowNode?: FlowNode; } export function AIAgentSidePanel(props: BIFlowDiagramProps) { @@ -65,11 +81,42 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { const [sidePanelView, setSidePanelView] = useState(SidePanelView.NODE_LIST); const [categories, setCategories] = useState([]); const [selectedNodeCodeData, setSelectedNodeCodeData] = useState(undefined); + const [toolNodeId, setToolNodeId] = useState(undefined); + const [functionNode, setFunctionNode] = useState(null); + const [flowNode, setFlowNode] = useState(null); const [loading, setLoading] = useState(false); + const [fields, setFields] = useState([ + { + key: `name`, + label: "Tool Name", + type: "IDENTIFIER", + valueType: "IDENTIFIER", + optional: false, + editable: true, + documentation: "Enter the name of the tool.", + value: "", + valueTypeConstraint: "Global", + enabled: true, + }, + { + key: `description`, + label: "Description", + type: "TEXTAREA", + optional: true, + editable: true, + documentation: "Enter the description of the tool.", + value: "", + valueType: "STRING", + valueTypeConstraint: "", + enabled: true, + }, + ]); const targetRef = useRef({ startLine: { line: 0, offset: 0 }, endLine: { line: 0, offset: 0 } }); const initialCategoriesRef = useRef([]); const selectedNodeRef = useRef(undefined); + const agentFilePath = useRef(Utils.joinPath(URI.file(projectPath), "agents.bal").fsPath); + const functionFilePath = useRef(Utils.joinPath(URI.file(projectPath), "functions.bal").fsPath); useEffect(() => { fetchNodes(); }, []); @@ -90,7 +137,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { setLoading(true); const getNodeRequest: BIAvailableNodesRequest = { position: targetRef.current.startLine, - filePath: projectPath, + filePath: agentFilePath.current, }; rpcClient .getBIDiagramRpcClient() @@ -138,14 +185,14 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { startLine: targetRef.current.startLine, endLine: targetRef.current.endLine, }, - filePath: projectPath, + filePath: agentFilePath.current, queryMap: searchText.trim() ? { - q: searchText, - limit: 12, - offset: 0, - includeAvailableFunctions: "true", - } + q: searchText, + limit: 12, + offset: 0, + includeAvailableFunctions: "true", + } : undefined, searchKind: "FUNCTION", }; @@ -164,7 +211,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { const currentIntegrationCategory = filteredResponse.find((category) => category.metadata.label === "Current Integration"); if (currentIntegrationCategory && Array.isArray(currentIntegrationCategory.items)) { currentIntegrationCategory.items = currentIntegrationCategory.items.filter((item) => { - return !item.metadata?.data?.isAgentTool; + return !(item.metadata?.data as NodeMetadata)?.isAgentTool; }); } @@ -178,12 +225,84 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { return convertFunctionCategoriesToSidePanelCategories(filteredResponse, functionType); }; - const handleOnSelectNode = (nodeId: string, metadata?: any) => { + const handleOnSelectNode = async (nodeId: string, metadata?: any) => { const { node } = metadata as { node: AvailableNode }; // default node + setToolNodeId(nodeId); console.log(">>> on select node", { nodeId, metadata }); selectedNodeRef.current = node; setSelectedNodeCodeData(node.codedata); + + if (nodeId === "FUNCTION_CALL") { + try { + const functionNodeResponse = await rpcClient.getBIDiagramRpcClient().getFunctionNode({ + functionName: node.codedata.symbol, + fileName: functionFilePath.current, + projectPath: projectPath, + }); + console.log(">>> Function definition response", { functionNodeResponse }); + + setFunctionNode(functionNodeResponse.functionDefinition); + + // Hide unnecessary properties + (["functionName", "functionNameDescription", "isIsolated", "type", "typeDescription"] as Array).forEach( + key => { + if (functionNodeResponse.functionDefinition.properties[key]) { + functionNodeResponse.functionDefinition.properties[key].hidden = true; + } + } + ); + + functionNodeResponse.functionDefinition.properties.parameters.metadata.label = "Tool Inputs"; + functionNodeResponse.functionDefinition.properties.parameters.metadata.description = ""; + + const toolInputFields = convertConfig(functionNodeResponse.functionDefinition.properties); + + const functionNodeTemplate = await rpcClient.getBIDiagramRpcClient().getNodeTemplate({ + position: functionNodeResponse.functionDefinition.codedata.lineRange.startLine, + filePath: functionFilePath.current, + id: node.codedata + }); + console.log(">>> Function node template response", { functionNodeTemplate }); + + const functionParameterFields = convertConfig(functionNodeTemplate.flowNode.properties); + functionParameterFields.forEach((field) => { + field.value = field.key; + field.optional = false; + }); + console.log(">>> Function parameter fields", { functionParameterFields }); + + // Optionally deduplicate fields by key + const allFields = [...toolInputFields, ...functionParameterFields]; + const dedupedFields = Array.from( + new Map(allFields.map(field => [field.key, field])).values() + ); + + setFields((prevFields) => { + return [...prevFields, ...dedupedFields]; + }); + } catch (error) { + console.error(">>> Error fetching function node or template", error); + } + } else if (nodeId === "REMOTE_ACTION_CALL" || nodeId === "METHOD_CALL") { + try { + const nodeTemplate = await rpcClient.getBIDiagramRpcClient().getNodeTemplate({ + position: node.codedata.lineRange.startLine, + filePath: agentFilePath.current, + id: node.codedata, + }); + console.log(">>> Node template response", { nodeTemplate }); + + if (nodeTemplate.flowNode) { + setFlowNode(nodeTemplate.flowNode); + } else { + console.error("Node template flowNode not found"); + } + } catch (error) { + console.error(">>> Error fetching node template", error); + } + } + setSidePanelView(SidePanelView.TOOL_FORM); }; @@ -192,7 +311,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { type: EVENT_TYPE.OPEN_VIEW, location: { view: MACHINE_VIEW.AddConnectionWizard, - documentUri: projectPath, + documentUri: agentFilePath.current, }, isPopup: true, }); @@ -208,42 +327,66 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { data.description = data.description.replace(/\n/g, " "); } - const toolModel: AgentToolRequest = { + console.log(">>> handleToolSubmit", { data }); + console.log(">>> toolNodeId", { toolNodeId }); + console.log(">>> functionNode", { functionNode }); + + const clonedFunctionNode = functionNode ? cloneDeep(functionNode) : null; + const toolParameters = cloneDeep(functionNode?.properties?.parameters) as unknown as ToolParameters; + + if (toolNodeId === "FUNCTION_CALL" && Array.isArray(data["parameters"])) { + // Update clonedFunctionNode parameter values from data["parameters"] + const parametersValue = clonedFunctionNode?.properties?.parameters?.value; + if (parametersValue && typeof parametersValue === "object" && !Array.isArray(parametersValue)) { + Object.keys(parametersValue).forEach((key) => { + const paramValue = data[key]; + if ((parametersValue as ToolParametersValue)[key]?.value?.variable) { + (parametersValue as ToolParametersValue)[key].value.variable.value = paramValue; + } + }); + } + + // Update toolParameters: remove keys not present, and set values from data + const paramKeys = data["parameters"].map((param: any) => param.key); + if (toolParameters && typeof toolParameters.value === "object" && !Array.isArray(toolParameters.value)) { + Object.keys(toolParameters.value).forEach((key) => { + if (!paramKeys.includes(key)) { + delete toolParameters.value[key]; + } + }); + paramKeys.forEach((key) => { + const paramObj = toolParameters.value[key]; + if (paramObj && paramObj.value && paramObj.value.variable) { + paramObj.value.variable.value = key; + paramObj.value.parameterDescription.value = data["parameters"].find((param: any) => param.key === key)?.formValues.parameterDescription || ""; + paramObj.value.type.value = data["parameters"].find((param: any) => param.key === key)?.formValues.type || ""; + } + if (!toolParameters.value[key]) { + toolParameters.value[key] = createDefaultParameterValue({ + value: key, + parameterDescription: data["parameters"].find((param: any) => param.key === key)?.formValues.parameterDescription, + type: data["parameters"].find((param: any) => param.key === key)?.formValues.type + }); + } + }); + } + } + + console.log(">>> toolParameters", { toolParameters }); + console.log(">>> clonedFunctionNode", { clonedFunctionNode }); + + const toolModel: ExtendedAgentToolRequest = { toolName: cleanName, description: data["description"], selectedCodeData: selectedNodeCodeData, + toolParameters: toolParameters, + functionNode: clonedFunctionNode, + flowNode: flowNode, }; console.log("New Agent Tool:", toolModel); onSubmit(toolModel); }; - const fields: FormField[] = [ - { - key: `name`, - label: "Tool Name", - type: "IDENTIFIER", - valueType: "IDENTIFIER", - optional: false, - editable: true, - documentation: "Enter the name of the tool.", - value: "", - valueTypeConstraint: "Global", - enabled: true, - }, - { - key: `description`, - label: "Description", - type: "TEXTAREA", - optional: true, - editable: true, - documentation: "Enter the description of the tool.", - value: "", - valueType: "STRING", - valueTypeConstraint: "", - enabled: true, - }, - ]; - // add concert message to the fields if the tool is a function call let concertMessage = ""; let concertRequired = false; @@ -251,7 +394,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { if ( selectedNodeRef.current && selectedNodeRef.current.codedata.node === "FUNCTION_CALL" && - !selectedNodeRef.current.metadata?.data?.isIsolatedFunction + !(selectedNodeRef.current.metadata?.data as NodeMetadata)?.isIsolatedFunction ) { concertMessage = `Convert ${selectedNodeRef.current.metadata.label} function to an isolated function`; concertRequired = true; @@ -278,7 +421,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { )} {sidePanelView === SidePanelView.TOOL_FORM && ( >> agent node", { agentNode }); }; - const handleOnSubmit = async (data: AgentToolRequest) => { + const handleOnSubmit = async (data: ExtendedAgentToolRequest) => { console.log(">>> submit value", { data }); setSavingForm(true); if (!data.toolName) { @@ -90,19 +90,15 @@ export function NewTool(props: NewToolProps): JSX.Element { if (data.selectedCodeData.node === "FUNCTION_CALL") { // create tool from existing function // get function definition - const functionDefinition = await rpcClient.getBIDiagramRpcClient().getFunctionNode({ - functionName: data.selectedCodeData.symbol, - fileName: "functions.bal", - projectPath: projectUri.current, - }); + const functionDefinition = data.functionNode; console.log(">>> response get function definition", { functionDefinition }); - if (!functionDefinition.functionDefinition) { + if (!functionDefinition) { console.error("Function definition not found"); return; } - if (functionDefinition.functionDefinition?.codedata) { - functionDefinition.functionDefinition.codedata.isNew = true; - functionDefinition.functionDefinition.codedata.lineRange = { + if (functionDefinition?.codedata) { + functionDefinition.codedata.isNew = true; + functionDefinition.codedata.lineRange = { ...agentNode.codedata.lineRange, endLine: agentNode.codedata.lineRange.startLine, }; @@ -112,8 +108,9 @@ export function NewTool(props: NewToolProps): JSX.Element { toolName: data.toolName, description: data.description, filePath: agentFilePath.current, - flowNode: functionDefinition.functionDefinition as FlowNode, + flowNode: functionDefinition as FlowNode, connection: "", + toolParameters: data.toolParameters, }); console.log(">>> response save tool", { toolResponse }); } else { @@ -144,6 +141,7 @@ export function NewTool(props: NewToolProps): JSX.Element { filePath: agentFilePath.current, flowNode: nodeTemplate.flowNode, connection: data.selectedCodeData.parentSymbol || "", + toolParameters: data.toolParameters, }); console.log(">>> response save tool", { toolResponse }); } @@ -158,7 +156,7 @@ export function NewTool(props: NewToolProps): JSX.Element { return ( <> {agentFilePath.current && !savingForm && ( - + )} {(!agentFilePath.current || savingForm) && ( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts index c524ed50799..8c8aa99e9b5 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts @@ -16,7 +16,7 @@ * under the License. */ -import { BINodeTemplateRequest, CodeData, FlowNode, LinePosition } from "@wso2/ballerina-core"; +import { BINodeTemplateRequest, CodeData, FlowNode, LinePosition, ValueTypeConstraint } from "@wso2/ballerina-core"; import { BallerinaRpcClient } from "@wso2/ballerina-rpc-client"; import { cloneDeep } from "lodash"; import { URI, Utils } from "vscode-uri"; @@ -160,20 +160,20 @@ export const addToolToAgentNode = async (agentNode: FlowNode, toolName: string) }; export interface McpServerConfig { - name: string; - serviceUrl: string; - configs: Record; - toolSelection: string; - selectedTools: string[]; + name: string; + serviceUrl: string; + configs: Record; + toolSelection: string; + selectedTools: string[]; }; export const updateMcpServerToAgentNode = async ( - agentNode: FlowNode, - toolConfig: McpServerConfig, + agentNode: FlowNode, + toolConfig: McpServerConfig, originalToolName: string ) => { if (!agentNode || agentNode.codedata?.node !== "AGENT") return null; - + const updatedAgentNode = cloneDeep(agentNode); let toolsValue = updatedAgentNode.properties.tools.value; @@ -198,10 +198,10 @@ export const updateMcpServerToAgentNode = async ( console.log(">>> Regex pattern:", pattern); console.log(">>> Testing pattern against toolsValue:", pattern.test(toolsValue)); - + // Reset the regex lastIndex since test() modifies it pattern.lastIndex = 0; - + if (pattern.test(toolsValue)) { console.log(">>> Found existing tool to replace"); // Reset lastIndex again before replace @@ -210,10 +210,10 @@ export const updateMcpServerToAgentNode = async ( } else { const trimmedValue = toolsValue.trim(); const isWrappedInBrackets = trimmedValue.startsWith('[') && trimmedValue.endsWith(']'); - const innerContent = isWrappedInBrackets - ? trimmedValue.slice(1, -1).trim() + const innerContent = isWrappedInBrackets + ? trimmedValue.slice(1, -1).trim() : trimmedValue; - toolsValue = innerContent + toolsValue = innerContent ? `[${innerContent}, ${newToolString}]` : `[${newToolString}]`; } @@ -224,7 +224,7 @@ export const updateMcpServerToAgentNode = async ( updatedAgentNode.properties.tools.value = toolsValue; updatedAgentNode.codedata.isNew = false; - + console.log(">>> Final updated tools value", toolsValue); return updatedAgentNode; }; @@ -281,7 +281,7 @@ export const removeMcpServerFromAgentNode = ( const startPattern = 'check new ai:McpToolKit('; let startIndex = 0; let found = false; - + while (!found && startIndex < toolsValue.length) { startIndex = toolsValue.indexOf(startPattern, startIndex); if (startIndex === -1) break; @@ -303,9 +303,9 @@ export const removeMcpServerFromAgentNode = ( newStartIndex--; hasCommaBefore = true; } - + let isLastItem = !hasCommaAfter; - + let before = toolsValue.substring(0, newStartIndex); let after = toolsValue.substring(endIndex); @@ -317,7 +317,7 @@ export const removeMcpServerFromAgentNode = ( before = before.substring(0, before.length - 1).trim(); } } - + toolsValue = before + after; found = true; } else { @@ -406,3 +406,43 @@ const parseToolsString = (toolsStr: string): string[] => { // Split by comma and trim each element return inner.split(",").map((tool) => tool.trim()); }; + +export function createDefaultParameterValue({ value, parameterDescription, type }: { value: string, parameterDescription?: string, type?: string }): ValueTypeConstraint { + const defaultMetadata = { + label: "", + description: "", + }; + return { + metadata: defaultMetadata, + valueType: "", + value: { + variable: { + value, + metadata: defaultMetadata, + valueType: "", + optional: false, + editable: false, + advanced: false + }, + parameterDescription: { + value: parameterDescription || "", + metadata: defaultMetadata, + valueType: "", + optional: false, + editable: false, + advanced: false + }, + type: { + value: type || "", + metadata: defaultMetadata, + valueType: "", + optional: false, + editable: false, + advanced: false + } + }, + optional: false, + editable: false, + advanced: false + }; +} \ No newline at end of file From 774e5ac70359f6da5ba4bc800f0304861a514b07 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Sun, 27 Jul 2025 12:00:41 +0530 Subject: [PATCH 177/349] Update agent tool form to support param editing for REMOTE_ACTION_CALL nodes --- .../src/rpc-types/ai-agent/interfaces.ts | 39 +-- .../src/features/natural-programming/utils.ts | 2 +- .../rpc-managers/bi-diagram/rpc-manager.ts | 4 +- .../views/BI/AIChatAgent/AIAgentSidePanel.tsx | 88 ++++++- .../src/views/BI/AIChatAgent/NewTool.tsx | 19 +- .../src/views/BI/AIChatAgent/formUtils.ts | 225 ++++++++++++++++++ .../src/views/BI/AIChatAgent/utils.ts | 40 ---- 7 files changed, 332 insertions(+), 85 deletions(-) create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/formUtils.ts 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 9b613d728a2..90b3380c1de 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 @@ -79,13 +79,14 @@ export interface McpToolUpdateRequest { } export interface ToolParameters { - metadata: Metadata; - valueType: string; + metadata: Metadata; + valueType: string; valueTypeConstraint: ValueTypeConstraint; - value: ToolParametersValue; - optional: boolean; - editable: boolean; - advanced: boolean; + value: ToolParametersValue; + optional: boolean; + editable: boolean; + advanced: boolean; + hidden?: boolean; } export interface ToolParametersValue { @@ -93,26 +94,28 @@ export interface ToolParametersValue { } export interface ValueTypeConstraint { - metadata: Metadata; + metadata: Metadata; valueType: string; - value: ValueTypeConstraintValue; - optional: boolean; - editable: boolean; - advanced: boolean; + value: ValueTypeConstraintValue; + optional: boolean; + editable: boolean; + advanced: boolean; + hidden?: boolean; } export interface ValueTypeConstraintValue { - type: ValueType; + type: ValueType; variable: ValueType; parameterDescription: ValueType; } export interface ValueType { - metadata: Metadata; - valueType: string; + metadata: Metadata; + valueType: string; valueTypeConstraint?: string; - value: string; - optional: boolean; - editable: boolean; - advanced: boolean; + value: string; + optional: boolean; + editable: boolean; + advanced: boolean; + hidden?: boolean; } 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 208779e29e4..529e6976983 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts @@ -508,7 +508,7 @@ export async function getAccessToken(): Promise { let token: string; const loginMethod = await getLoginMethod(); if (loginMethod === LoginMethod.BI_INTEL) { - token = await getAccesstokenFromUtils() + token = await getAccesstokenFromUtils(); } resolve(token as string); }); 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 6eafee80608..f33425140a9 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 @@ -493,7 +493,7 @@ export class BiDiagramRpcManager implements BIDiagramAPI { let token: string; const loginMethod = await getLoginMethod(); if (loginMethod === LoginMethod.BI_INTEL) { - token = await getAccessToken() + token = await getAccessToken(); } if (!token) { @@ -531,7 +531,7 @@ export class BiDiagramRpcManager implements BIDiagramAPI { let token: string; const loginMethod = await getLoginMethod(); if (loginMethod === LoginMethod.BI_INTEL) { - token = await getAccessToken() + token = await getAccessToken(); } if (!token) { //TODO: Do we need to prompt to login here? If so what? Copilot or Ballerina AI? diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx index c69807ba2bc..025016966e9 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx @@ -50,7 +50,7 @@ import { RelativeLoader } from "../../../components/RelativeLoader"; import styled from "@emotion/styled"; import { URI, Utils } from "vscode-uri"; import { cloneDeep } from "lodash"; -import { createDefaultParameterValue } from "./utils"; +import { createDefaultParameterValue, createToolInputFields, createToolParameters } from "./formUtils"; const LoaderContainer = styled.div` display: flex; @@ -257,6 +257,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { functionNodeResponse.functionDefinition.properties.parameters.metadata.description = ""; const toolInputFields = convertConfig(functionNodeResponse.functionDefinition.properties); + console.log(">>> Tool input fields", { toolInputFields }); const functionNodeTemplate = await rpcClient.getBIDiagramRpcClient().getNodeTemplate({ position: functionNodeResponse.functionDefinition.codedata.lineRange.startLine, @@ -287,7 +288,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { } else if (nodeId === "REMOTE_ACTION_CALL" || nodeId === "METHOD_CALL") { try { const nodeTemplate = await rpcClient.getBIDiagramRpcClient().getNodeTemplate({ - position: node.codedata.lineRange.startLine, + position: { line: 0, offset: 0 }, filePath: agentFilePath.current, id: node.codedata, }); @@ -298,6 +299,26 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { } else { console.error("Node template flowNode not found"); } + + const includedKeys: string[] = []; + const nodeParameterFields = convertConfig(nodeTemplate.flowNode.properties); + nodeParameterFields.forEach((field) => { + if (["type", "targetType", "variable", "checkError", "connection"].includes(field.key)) { + field.hidden = true; + return; + } + field.value = field.key; + field.optional = false; + includedKeys.push(field.key); + }); + console.log(">>> Tool input fields", { nodeParameterFields }); + + const filteredNodeParameterFields = nodeParameterFields.filter(field => includedKeys.includes(field.key)); + const toolInputFields = createToolInputFields(filteredNodeParameterFields); + + setFields((prevFields) => { + return [...prevFields, ...toolInputFields, ...nodeParameterFields]; + }); } catch (error) { console.error(">>> Error fetching node template", error); } @@ -330,20 +351,65 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { console.log(">>> handleToolSubmit", { data }); console.log(">>> toolNodeId", { toolNodeId }); console.log(">>> functionNode", { functionNode }); + console.log(">>> flowNode", { flowNode }); - const clonedFunctionNode = functionNode ? cloneDeep(functionNode) : null; - const toolParameters = cloneDeep(functionNode?.properties?.parameters) as unknown as ToolParameters; + let toolParameters: ToolParameters | null = null; + let clonedFunctionNode: FunctionNode | null = null; if (toolNodeId === "FUNCTION_CALL" && Array.isArray(data["parameters"])) { + clonedFunctionNode = functionNode ? cloneDeep(functionNode) : null; + toolParameters = cloneDeep(functionNode?.properties?.parameters) as unknown as ToolParameters; + // Update clonedFunctionNode parameter values from data["parameters"] const parametersValue = clonedFunctionNode?.properties?.parameters?.value; if (parametersValue && typeof parametersValue === "object" && !Array.isArray(parametersValue)) { - Object.keys(parametersValue).forEach((key) => { - const paramValue = data[key]; - if ((parametersValue as ToolParametersValue)[key]?.value?.variable) { - (parametersValue as ToolParametersValue)[key].value.variable.value = paramValue; - } - }); + Object.keys(parametersValue).forEach((key) => { + const paramValue = data[key]; + if ((parametersValue as ToolParametersValue)[key]?.value?.variable) { + (parametersValue as ToolParametersValue)[key].value.variable.value = paramValue; + } + }); + } + + // Update toolParameters: remove keys not present, and set values from data + const paramKeys = data["parameters"].map((param: any) => param.key); + if (toolParameters && typeof toolParameters.value === "object" && !Array.isArray(toolParameters.value)) { + Object.keys(toolParameters.value).forEach((key) => { + if (!paramKeys.includes(key)) { + delete toolParameters.value[key]; + } + }); + paramKeys.forEach((key: string) => { + const paramObj = toolParameters.value[key]; + if (paramObj && paramObj.value && paramObj.value.variable) { + paramObj.value.variable.value = key; + paramObj.value.parameterDescription.value = data["parameters"].find((param: any) => param.key === key)?.formValues.parameterDescription || ""; + paramObj.value.type.value = data["parameters"].find((param: any) => param.key === key)?.formValues.type || ""; + } + if (!toolParameters.value[key]) { + toolParameters.value[key] = createDefaultParameterValue({ + value: key, + parameterDescription: data["parameters"].find((param: any) => param.key === key)?.formValues.parameterDescription, + type: data["parameters"].find((param: any) => param.key === key)?.formValues.type + }); + } + }); + } + } else if (toolNodeId === "REMOTE_ACTION_CALL" || toolNodeId === "METHOD_CALL" && Array.isArray(data["parameters"])) { + toolParameters = createToolParameters(); + + // Update clonedFunctionNode parameter values from data["parameters"] + const parametersValue = flowNode?.properties; + if (parametersValue && typeof parametersValue === "object" && !Array.isArray(parametersValue)) { + Object.keys(parametersValue).forEach((key) => { + if (!data[key]) { + return; + } + const paramValue = data[key]; + if ((parametersValue as ToolParametersValue)[key]) { + (parametersValue as ToolParametersValue)[key].value = paramValue; + } + }); } // Update toolParameters: remove keys not present, and set values from data @@ -354,7 +420,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { delete toolParameters.value[key]; } }); - paramKeys.forEach((key) => { + paramKeys.forEach((key: string) => { const paramObj = toolParameters.value[key]; if (paramObj && paramObj.value && paramObj.value.variable) { paramObj.value.variable.value = key; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewTool.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewTool.tsx index 1f37b1410bd..3cb0773f7a0 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewTool.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewTool.tsx @@ -115,31 +115,24 @@ export function NewTool(props: NewToolProps): JSX.Element { console.log(">>> response save tool", { toolResponse }); } else { // create tool from existing connection - // get nodeTemplate - const nodeTemplate = await rpcClient.getBIDiagramRpcClient().getNodeTemplate({ - position: { line: 0, offset: 0 }, - filePath: agentFilePath.current, - id: data.selectedCodeData, - }); - console.log(">>> node template", { nodeTemplate }); - if (!nodeTemplate.flowNode) { + if (!data.flowNode) { console.error("Node template not found"); return; } - if (nodeTemplate.flowNode?.codedata) { - nodeTemplate.flowNode.codedata.isNew = true; - nodeTemplate.flowNode.codedata.lineRange = { + if (data.flowNode?.codedata) { + data.flowNode.codedata.isNew = true; + data.flowNode.codedata.lineRange = { ...agentNode.codedata.lineRange, endLine: agentNode.codedata.lineRange.startLine, }; } - updateFlowNodePropertyValuesWithKeys(nodeTemplate.flowNode); + updateFlowNodePropertyValuesWithKeys(data.flowNode); // save tool const toolResponse = await rpcClient.getAIAgentRpcClient().genTool({ toolName: data.toolName, description: data.description, filePath: agentFilePath.current, - flowNode: nodeTemplate.flowNode, + flowNode: data.flowNode, connection: data.selectedCodeData.parentSymbol || "", toolParameters: data.toolParameters, }); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/formUtils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/formUtils.ts new file mode 100644 index 00000000000..19b9597f69d --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/formUtils.ts @@ -0,0 +1,225 @@ +/** + * 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 { ValueTypeConstraint, ToolParameters } from "@wso2/ballerina-core"; +import { FormField, Parameter } from "@wso2/ballerina-side-panel"; + +export function createToolInputFields(filteredNodeParameterFields: FormField[]): FormField[] { + const paramManagerValues = filteredNodeParameterFields.map((field, idx) => ({ + id: idx, + icon: "", + key: field.key, + value: `${field.valueType} ${field.key}`, + identifierEditable: true, + identifierRange: { + fileName: "functions.bal", + startLine: { line: 0, offset: 0 }, + endLine: { line: 0, offset: 0 } + }, + formValues: { + variable: field.key, + type: field.valueTypeConstraint, + parameterDescription: field.documentation || "" + } + })); + + const paramManagerFormFields: FormField[] = [ + { + key: "type", + label: "Type", + type: "TYPE", + optional: false, + advanced: false, + editable: true, + enabled: true, + hidden: false, + documentation: "Type of the parameter", + value: "", + advanceProps: [], + valueType: "TYPE", + diagnostics: [], + metadata: { label: "Type", description: "Type of the parameter" }, + valueTypeConstraint: "" + }, + { + key: "variable", + label: "Name", + type: "IDENTIFIER", + optional: false, + advanced: false, + editable: true, + enabled: true, + hidden: false, + documentation: "Name of the parameter", + value: "", + advanceProps: [], + valueType: "IDENTIFIER", + diagnostics: [], + metadata: { label: "Name", description: "Name of the parameter" }, + valueTypeConstraint: "" + }, + { + key: "parameterDescription", + label: "Description", + type: "STRING", + optional: true, + advanced: false, + editable: true, + enabled: true, + hidden: false, + documentation: "Description of the parameter", + value: "", + advanceProps: [], + valueType: "STRING", + diagnostics: [], + metadata: { label: "Description", description: "Description of the parameter" }, + valueTypeConstraint: "" + } + ]; + + return [ + { + key: "parameters", + label: "Tool Inputs", + type: "PARAM_MANAGER", + optional: true, + advanced: false, + editable: false, + enabled: true, + hidden: false, + documentation: "", + value: paramManagerValues, + advanceProps: [], + valueType: "PARAM_MANAGER", + diagnostics: [], + valueTypeConstraint: "", + paramManagerProps: { + paramValues: paramManagerValues, + formFields: paramManagerFormFields, + handleParameter: function (parameter: Parameter): Parameter { + throw new Error("Function not implemented."); + } + } + } + ]; +} + + +export function createDefaultParameterValue({ value, parameterDescription, type }: { value: string, parameterDescription?: string, type?: string }): ValueTypeConstraint { + const defaultMetadata = { + label: "", + description: "", + }; + return { + metadata: defaultMetadata, + valueType: "", + value: { + variable: { + value, + metadata: defaultMetadata, + valueType: "", + optional: false, + editable: false, + advanced: false + }, + parameterDescription: { + value: parameterDescription || "", + metadata: defaultMetadata, + valueType: "", + optional: false, + editable: false, + advanced: false + }, + type: { + value: type || "", + metadata: defaultMetadata, + valueType: "", + optional: false, + editable: false, + advanced: false + } + }, + optional: false, + editable: false, + advanced: false + }; +} + +export function createToolParameters(): ToolParameters { + return { + metadata: { + label: "Tool Inputs", + description: "" + }, + valueType: "REPEATABLE_PROPERTY", + valueTypeConstraint: { + metadata: { + label: "Parameter", + description: "Function parameter" + }, + valueType: "FIXED_PROPERTY", + value: { + type: { + metadata: { + label: "Type", + description: "Type of the parameter" + }, + valueType: "TYPE", + value: "", + optional: false, + editable: true, + advanced: false, + hidden: false + }, + variable: { + metadata: { + label: "Name", + description: "Name of the parameter" + }, + valueType: "IDENTIFIER", + value: "", + optional: false, + editable: true, + advanced: false, + hidden: false + }, + parameterDescription: { + metadata: { + label: "Description", + description: "Description of the parameter" + }, + valueType: "STRING", + value: "", + optional: true, + editable: true, + advanced: false, + hidden: false + } + }, + optional: false, + editable: false, + advanced: false, + hidden: false + }, + value: {}, + optional: true, + editable: false, + advanced: false, + hidden: false + }; +} \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts index 8c8aa99e9b5..b7daf411c67 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/utils.ts @@ -406,43 +406,3 @@ const parseToolsString = (toolsStr: string): string[] => { // Split by comma and trim each element return inner.split(",").map((tool) => tool.trim()); }; - -export function createDefaultParameterValue({ value, parameterDescription, type }: { value: string, parameterDescription?: string, type?: string }): ValueTypeConstraint { - const defaultMetadata = { - label: "", - description: "", - }; - return { - metadata: defaultMetadata, - valueType: "", - value: { - variable: { - value, - metadata: defaultMetadata, - valueType: "", - optional: false, - editable: false, - advanced: false - }, - parameterDescription: { - value: parameterDescription || "", - metadata: defaultMetadata, - valueType: "", - optional: false, - editable: false, - advanced: false - }, - type: { - value: type || "", - metadata: defaultMetadata, - valueType: "", - optional: false, - editable: false, - advanced: false - } - }, - optional: false, - editable: false, - advanced: false - }; -} \ No newline at end of file From a50218cb8b7b78044211fac8092b6f11956bf83c Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Sat, 5 Jul 2025 11:31:46 +0530 Subject: [PATCH 178/349] Handle project file missing by checking pom file --- .../mi/mi-extension/src/stateMachine.ts | 21 +- .../mi-extension/src/util/migrationUtils.ts | 249 +++++++++++------- 2 files changed, 170 insertions(+), 100 deletions(-) diff --git a/workspaces/mi/mi-extension/src/stateMachine.ts b/workspaces/mi/mi-extension/src/stateMachine.ts index 5eb77ee8e5b..860c3ac3df0 100644 --- a/workspaces/mi/mi-extension/src/stateMachine.ts +++ b/workspaces/mi/mi-extension/src/stateMachine.ts @@ -30,6 +30,7 @@ import { DMProject } from './datamapper/DMProject'; import { setupEnvironment } from './util/onboardingUtils'; import { getPopupStateMachine } from './stateMachinePopup'; import { askForProject } from './util/workspace'; +import { extractNatureFromPomContent } from './util/migrationUtils'; const fs = require('fs'); interface MachineContext extends VisualizerLocation { @@ -745,16 +746,26 @@ async function checkIfMiProject(projectUri) { // If not found, check for .project files if (!isProject) { const projectFiles = await vscode.workspace.findFiles(new vscode.RelativePattern(projectUri, '.project'), '**/node_modules/**', 1); + const oldProjectNatures = [ + 'org.wso2.developerstudio.eclipse.mavenmultimodule.project.nature', + 'org.eclipse.m2e.core.maven2Nature' + ]; if (projectFiles.length > 0) { - const oldProjectNatures = [ - 'org.wso2.developerstudio.eclipse.mavenmultimodule.project.nature', - 'org.eclipse.m2e.core.maven2Nature' - ]; const projectContent = await vscode.workspace.openTextDocument(projectFiles[0]); - if (oldProjectNatures.some(nature => projectContent.getText().includes(nature))) { + if (oldProjectNatures.some(nature => projectContent.getText().includes('' + nature + ''))) { isOldProject = true; log("Integration Studio project detected in " + projectUri); } + } else { + if (fs.existsSync(pomFilePath)) { + const pomContent = await fs.promises.readFile(pomFilePath, 'utf-8'); + const projectNature = await extractNatureFromPomContent(pomContent); + + if (projectNature && oldProjectNatures.includes(projectNature)) { + isOldProject = true; + log("Integration Studio project detected"); + } + } } } } catch (err) { diff --git a/workspaces/mi/mi-extension/src/util/migrationUtils.ts b/workspaces/mi/mi-extension/src/util/migrationUtils.ts index 9f8ce3953f5..8b7eb281e92 100644 --- a/workspaces/mi/mi-extension/src/util/migrationUtils.ts +++ b/workspaces/mi/mi-extension/src/util/migrationUtils.ts @@ -43,33 +43,33 @@ enum Nature { } interface ArtifactItem { - file: string; - path: string; - mediaType: string; - properties: any; + file: string; + path: string; + mediaType: string; + properties: any; } interface ArtifactCollection { - directory: string; - path: string; - properties: any; + directory: string; + path: string; + properties: any; } interface Dependency { - groupId: string; - artifactId: string; - version: string; + groupId: string; + artifactId: string; + version: string; } interface Artifact { - '@_name': string; - '@_groupId': string; - '@_version': string; - '@_type': string; - '@_serverRole': string; - file: string; - item: ArtifactItem | ArtifactItem[]; - collection: ArtifactCollection | ArtifactCollection[]; + '@_name': string; + '@_groupId': string; + '@_version': string; + '@_type': string; + '@_serverRole': string; + file: string; + item: ArtifactItem | ArtifactItem[]; + collection: ArtifactCollection | ArtifactCollection[]; } type FileInfo = { @@ -85,30 +85,30 @@ type PomResolutionResult = { }; interface ArtifactsRoot { - artifacts: { - artifact?: Artifact | Artifact[]; - }; + artifacts: { + artifact?: Artifact | Artifact[]; + }; } const xmlParserOptions = { - ignoreAttributes: false, - attributeNamePrefix: '@_', - parseAttributeValue: false, - trimValues: true, - parseTrueNumberOnly: false, - arrayMode: false, - parseTagValue: false, - parseNodeValue: false + ignoreAttributes: false, + attributeNamePrefix: '@_', + parseAttributeValue: false, + trimValues: true, + parseTrueNumberOnly: false, + arrayMode: false, + parseTagValue: false, + parseNodeValue: false }; const xmlBuilderOptions = { - ignoreAttributes: false, - format: true, - indentBy: ' ', - suppressEmptyNode: true, - suppressBooleanAttributes: false, - attributeNamePrefix: '@_', - textNodeName: '#text' + ignoreAttributes: false, + format: true, + indentBy: ' ', + suppressEmptyNode: true, + suppressBooleanAttributes: false, + attributeNamePrefix: '@_', + textNodeName: '#text' }; const BACKUP_DIR = '.backup'; @@ -382,7 +382,7 @@ export async function migrateConfigs( createdProjectCount: number ): Promise { // determine the project type here - const projectType = determineProjectType(source); + const projectType = await determineProjectType(source); let hasClassMediatorModule = false; if (projectType === Nature.MULTIMODULE) { @@ -424,17 +424,17 @@ export async function migrateConfigs( } } else if (projectType === Nature.LEGACY) { const items = fs.readdirSync(source, { withFileTypes: true }); - items.forEach(item => { + for (const item of items) { if (item.isDirectory()) { const sourceAbsolutePath = path.join(source, item.name); - const moduleType = determineProjectType(path.join(source, item.name)); + const moduleType = await determineProjectType(path.join(source, item.name)); if (moduleType === Nature.LEGACY) { processArtifactsFolder(sourceAbsolutePath, target); processMetaDataFolder(sourceAbsolutePath, target); processTestsFolder(sourceAbsolutePath, target); } } - }); + } } else if (projectType === Nature.ESB || projectType === Nature.DS || projectType === Nature.DATASOURCE || projectType === Nature.CONNECTOR || projectType === Nature.REGISTRY || projectType === Nature.CLASS) { copyConfigsToNewProjectStructure(projectType, source, target); @@ -486,14 +486,14 @@ function writeUnusedFileInfos( function getProjectDirectoriesWithType(rootDir: string, items?: fs.Dirent[]): { projectDir: string, projectType: Nature }[] { const results: { projectDir: string, projectType: Nature }[] = []; - function traverse(dir: string) { + async function traverse(dir: string) { const items = fs.readdirSync(dir, { withFileTypes: true }); for (const item of items) { const fullPath = path.join(dir, item.name); if (item.isDirectory()) { - const projectType = determineProjectType(fullPath); + const projectType = await determineProjectType(fullPath); if (projectType !== undefined) { results.push({ projectDir: fullPath, projectType }); } @@ -568,7 +568,7 @@ function generateArtifactIdToFileInfoMap( */ function generateConfigToTestAndMockServiceMaps( source: string, - projectDirsWithType: { projectDir: string, projectType: Nature }[] + projectDirsWithType: { projectDir: string, projectType: Nature }[] ): { configToTests: Map, configToMockServices: Map @@ -718,15 +718,15 @@ function getPomIdentifierStr(groupId: string, artifactId: string, version: strin * @returns The extracted XML string if found, or `null` if no `` block is present. */ function extractXmlFromMavenOutput(output: string): string | null { - const start = output.indexOf(''); + const start = output.indexOf(''); - if (start === -1 || end === -1) { - return null; // XML not found - } + if (start === -1 || end === -1) { + return null; // XML not found + } - // +10 to include length of '' - return output.substring(start, end + 10); + // +10 to include length of '' + return output.substring(start, end + 10); } /** @@ -887,58 +887,65 @@ function getFolderStructure( }; } -function determineProjectType(source: string): Nature | undefined { +async function determineProjectType(source: string): Promise { const rootMetaDataFilePath = path.join(source, '.project'); + const rootPomFilePath = path.join(source, 'pom.xml'); let configType; if (fs.existsSync(rootMetaDataFilePath)) { const projectFileContent = fs.readFileSync(rootMetaDataFilePath, 'utf-8'); - parseString(projectFileContent, { explicitArray: false, ignoreAttrs: true }, (err, result) => { - if (err) { - console.error('Error occured while reading ' + rootMetaDataFilePath, err); - return; - } + const result = await new Promise((resolve, reject) => { + parseString(projectFileContent, { explicitArray: false, ignoreAttrs: true }, (err, result) => { + if (err) { + console.error('Error occured while reading ' + rootMetaDataFilePath, err); + resolve(''); + } else { + resolve(result); + } + }); + }); + if (result && result.projectDescription) { const projectDescription = result.projectDescription; if (projectDescription && projectDescription.natures && projectDescription.natures.nature) { let nature = projectDescription.natures.nature; if (Array.isArray(nature)) { nature = nature.find(element => element.startsWith("org.wso2.developerstudio.eclipse")); } - - switch (nature) { - case 'org.wso2.developerstudio.eclipse.mavenmultimodule.project.nature': - configType = Nature.MULTIMODULE; - break; - case 'org.wso2.developerstudio.eclipse.esb.project.nature': - configType = Nature.ESB; - break; - case 'org.wso2.developerstudio.eclipse.ds.project.nature': - configType = Nature.DS; - break; - case 'org.wso2.developerstudio.eclipse.datasource.project.nature': - configType = Nature.DATASOURCE; - break; - case 'org.wso2.developerstudio.eclipse.artifact.connector.project.nature': - configType = Nature.CONNECTOR; - break; - case 'org.wso2.developerstudio.eclipse.general.project.nature': - configType = Nature.REGISTRY; - break; - case 'org.wso2.developerstudio.eclipse.artifact.mediator.project.nature': - configType = Nature.CLASS; - break; - case 'org.eclipse.m2e.core.maven2Nature': - configType = Nature.LEGACY; - break; - case 'org.wso2.developerstudio.eclipse.distribution.project.nature': - configType = Nature.DISTRIBUTION; - break; - } + configType = getNatureFromString(nature); } - }); + } + } else if (fs.existsSync(rootPomFilePath)) { + const pomContent = fs.readFileSync(rootPomFilePath, 'utf-8'); + const fetchedNatureStr = await extractNatureFromPomContent(pomContent); + configType = getNatureFromString(fetchedNatureStr); } return configType; } +function getNatureFromString(nature: string | undefined): Nature | undefined { + switch (nature) { + case 'org.wso2.developerstudio.eclipse.mavenmultimodule.project.nature': + return Nature.MULTIMODULE; + case 'org.wso2.developerstudio.eclipse.esb.project.nature': + return Nature.ESB; + case 'org.wso2.developerstudio.eclipse.ds.project.nature': + return Nature.DS; + case 'org.wso2.developerstudio.eclipse.datasource.project.nature': + return Nature.DATASOURCE; + case 'org.wso2.developerstudio.eclipse.artifact.connector.project.nature': + return Nature.CONNECTOR; + case 'org.wso2.developerstudio.eclipse.general.project.nature': + return Nature.REGISTRY; + case 'org.wso2.developerstudio.eclipse.artifact.mediator.project.nature': + return Nature.CLASS; + case 'org.eclipse.m2e.core.maven2Nature': + return Nature.LEGACY; + case 'org.wso2.developerstudio.eclipse.distribution.project.nature': + return Nature.DISTRIBUTION; + default: + return undefined; + } +} + function copyConfigToNewProjectStructure(sourceFileInfo: FileInfo, target: string) { switch (sourceFileInfo.projectType) { case Nature.ESB: @@ -1368,19 +1375,19 @@ function processArtifactForWrite(artifact: Artifact): void { if (artifact.item) { const items = Array.isArray(artifact.item) ? artifact.item : [artifact.item]; items.forEach(item => { - if (item.file && typeof item.file === 'string') { - const parts = item.file.split('/'); - item.file = parts[parts.length - 1]; - } + if (item.file && typeof item.file === 'string') { + const parts = item.file.split('/'); + item.file = parts[parts.length - 1]; + } }); artifact.item = Array.isArray(artifact.item) ? items : items[0]; } else if (artifact.collection) { const collections = Array.isArray(artifact.collection) ? artifact.collection : [artifact.collection]; collections.forEach(collection => { - if (collection.directory && typeof collection.directory === 'string') { - const parts = collection.directory.split('/'); - collection.directory = parts[parts.length - 1]; - } + if (collection.directory && typeof collection.directory === 'string') { + const parts = collection.directory.split('/'); + collection.directory = parts[parts.length - 1]; + } }); artifact.collection = Array.isArray(artifact.collection) ? collections : collections[0]; } @@ -1529,6 +1536,58 @@ function readPomDependencies(source: string, projectDirToResolvedPomMap: Map value from the given pom.xml content. + * Assumes structure always contains one or more elements. + */ +export function extractNatureFromPomContent(pomXmlContent: string): Promise { + return new Promise((resolve, reject) => { + parseString(pomXmlContent, { explicitArray: false, ignoreAttrs: true }, (err, result) => { + if (err) { + return reject('Failed to parse pom.xml: ' + err); + } + + const nature = findProjectNature(result); + resolve(nature); + }); + }); +} + +/** + * Recursively searches for ... + * and returns the first matching value that starts with the expected prefix. + */ +function findProjectNature(node: any): string | undefined { + if (typeof node !== 'object' || node === null) return undefined; + + for (const key of Object.keys(node)) { + const value = node[key]; + + if (key.toLowerCase() === 'projectnatures') { + const natures = value.projectnature; + + if (typeof natures === 'string') { + if (natures.startsWith('org.wso2.developerstudio.eclipse')) { + return natures; + } + } else if (Array.isArray(natures)) { + const match = natures.find(n => + typeof n === 'string' && n.startsWith('org.wso2.developerstudio.eclipse') + ); + if (match) return match; + } + } + + // Recurse into nested objects + if (typeof value === 'object') { + const nestedResult = findProjectNature(value); + if (nestedResult) return nestedResult; + } + } + + return undefined; +} + /** * Extracts and returns a record of property key-value pairs from the given XML object. * From 4dc16f9ae9ee1fe02a0e0c2919ca106d68435c4d Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Sun, 27 Jul 2025 13:57:55 +0530 Subject: [PATCH 179/349] Refactor AIAgentSidePanel to use refs for functionNode and flowNode --- .../views/BI/AIChatAgent/AIAgentSidePanel.tsx | 48 ++++++++++--------- .../src/views/BI/AIChatAgent/NewTool.tsx | 1 - 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx index 025016966e9..8dd0c0ca211 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx @@ -34,9 +34,7 @@ import { NodeMetadata, FunctionNode, FlowNode, - Property, ToolParameters, - ValueTypeConstraint, ToolParametersValue, } from "@wso2/ballerina-core"; @@ -82,8 +80,10 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { const [categories, setCategories] = useState([]); const [selectedNodeCodeData, setSelectedNodeCodeData] = useState(undefined); const [toolNodeId, setToolNodeId] = useState(undefined); - const [functionNode, setFunctionNode] = useState(null); - const [flowNode, setFlowNode] = useState(null); + + const functionNode = useRef(null); + const flowNode = useRef(null); + const [loading, setLoading] = useState(false); const [fields, setFields] = useState([ { @@ -242,7 +242,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { }); console.log(">>> Function definition response", { functionNodeResponse }); - setFunctionNode(functionNodeResponse.functionDefinition); + functionNode.current = functionNodeResponse.functionDefinition; // Hide unnecessary properties (["functionName", "functionNameDescription", "isIsolated", "type", "typeDescription"] as Array).forEach( @@ -285,7 +285,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { } catch (error) { console.error(">>> Error fetching function node or template", error); } - } else if (nodeId === "REMOTE_ACTION_CALL" || nodeId === "METHOD_CALL") { + } else if (nodeId === "REMOTE_ACTION_CALL" || nodeId === "RESOURCE_ACTION_CALL" || nodeId === "METHOD_CALL") { try { const nodeTemplate = await rpcClient.getBIDiagramRpcClient().getNodeTemplate({ position: { line: 0, offset: 0 }, @@ -295,7 +295,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { console.log(">>> Node template response", { nodeTemplate }); if (nodeTemplate.flowNode) { - setFlowNode(nodeTemplate.flowNode); + flowNode.current = nodeTemplate.flowNode; } else { console.error("Node template flowNode not found"); } @@ -303,7 +303,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { const includedKeys: string[] = []; const nodeParameterFields = convertConfig(nodeTemplate.flowNode.properties); nodeParameterFields.forEach((field) => { - if (["type", "targetType", "variable", "checkError", "connection"].includes(field.key)) { + if (["type", "targetType", "variable", "checkError", "connection", "resourcePath"].includes(field.key)) { field.hidden = true; return; } @@ -355,10 +355,11 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { let toolParameters: ToolParameters | null = null; let clonedFunctionNode: FunctionNode | null = null; + let clonedFlowNode: FlowNode | null = null; if (toolNodeId === "FUNCTION_CALL" && Array.isArray(data["parameters"])) { - clonedFunctionNode = functionNode ? cloneDeep(functionNode) : null; - toolParameters = cloneDeep(functionNode?.properties?.parameters) as unknown as ToolParameters; + clonedFunctionNode = functionNode.current ? cloneDeep(functionNode.current) : null; + toolParameters = cloneDeep(functionNode.current?.properties?.parameters) as unknown as ToolParameters; // Update clonedFunctionNode parameter values from data["parameters"] const parametersValue = clonedFunctionNode?.properties?.parameters?.value; @@ -395,24 +396,26 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { } }); } - } else if (toolNodeId === "REMOTE_ACTION_CALL" || toolNodeId === "METHOD_CALL" && Array.isArray(data["parameters"])) { - toolParameters = createToolParameters(); + } else if ((toolNodeId === "REMOTE_ACTION_CALL" || toolNodeId === "RESOURCE_ACTION_CALL" || toolNodeId === "METHOD_CALL") && Array.isArray(data["parameters"])) { + clonedFlowNode = flowNode.current ? cloneDeep(flowNode.current) : null; - // Update clonedFunctionNode parameter values from data["parameters"] - const parametersValue = flowNode?.properties; - if (parametersValue && typeof parametersValue === "object" && !Array.isArray(parametersValue)) { - Object.keys(parametersValue).forEach((key) => { - if (!data[key]) { - return; - } + // Update flowNode parameter values from data["parameters"] + if (clonedFlowNode?.properties && typeof clonedFlowNode?.properties === "object" && !Array.isArray(clonedFlowNode?.properties)) { + const newProperties = { ...clonedFlowNode.properties }; + Object.keys(newProperties).forEach((key) => { const paramValue = data[key]; - if ((parametersValue as ToolParametersValue)[key]) { - (parametersValue as ToolParametersValue)[key].value = paramValue; + if (paramValue !== undefined) { + (newProperties as ToolParametersValue)[key] = { + ...((newProperties as ToolParametersValue)[key]!), + value: paramValue + }; } }); + clonedFlowNode.properties = newProperties; } // Update toolParameters: remove keys not present, and set values from data + toolParameters = createToolParameters(); const paramKeys = data["parameters"].map((param: any) => param.key); if (toolParameters && typeof toolParameters.value === "object" && !Array.isArray(toolParameters.value)) { Object.keys(toolParameters.value).forEach((key) => { @@ -440,6 +443,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { console.log(">>> toolParameters", { toolParameters }); console.log(">>> clonedFunctionNode", { clonedFunctionNode }); + console.log(">>> clonedFlowNode", { clonedFlowNode }); const toolModel: ExtendedAgentToolRequest = { toolName: cleanName, @@ -447,7 +451,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { selectedCodeData: selectedNodeCodeData, toolParameters: toolParameters, functionNode: clonedFunctionNode, - flowNode: flowNode, + flowNode: clonedFlowNode, }; console.log("New Agent Tool:", toolModel); onSubmit(toolModel); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewTool.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewTool.tsx index 3cb0773f7a0..3c2dec9f0c1 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewTool.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewTool.tsx @@ -126,7 +126,6 @@ export function NewTool(props: NewToolProps): JSX.Element { endLine: agentNode.codedata.lineRange.startLine, }; } - updateFlowNodePropertyValuesWithKeys(data.flowNode); // save tool const toolResponse = await rpcClient.getAIAgentRpcClient().genTool({ toolName: data.toolName, From 29d3048cdfce4dcf3cf3a8f1a2324b3006f23376 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Sun, 27 Jul 2025 15:34:45 +0530 Subject: [PATCH 180/349] Show implementation field in agent tool creation form --- .../ballerina-core/src/interfaces/bi.ts | 1 + .../ballerina-visualizer/src/constants.ts | 5 + .../views/BI/AIChatAgent/AIAgentSidePanel.tsx | 92 +++++++++++++++---- .../src/views/BI/AIChatAgent/NewTool.tsx | 3 +- 4 files changed, 80 insertions(+), 21 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts index 4167bc1f4d5..9e124873c35 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts @@ -381,6 +381,7 @@ export type NodeKind = | "LOCK" | "LV_EXPRESSION" | "MATCH" + | "METHOD_CALL" | "MODEL_PROVIDER" | "VECTOR_STORE" | "VECTOR_KNOWLEDGE_BASE" diff --git a/workspaces/ballerina/ballerina-visualizer/src/constants.ts b/workspaces/ballerina/ballerina-visualizer/src/constants.ts index 8dddc832473..b49839d7c65 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/constants.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/constants.ts @@ -40,3 +40,8 @@ export const PROVIDER_NAME_MAP: Record = { "ai.deepseek": "Deepseek Model Provider", "ai.ollama": "Ollama Model Provider", }; + +export const RESOURCE_ACTION_CALL = "RESOURCE_ACTION_CALL"; +export const REMOTE_ACTION_CALL = "REMOTE_ACTION_CALL"; +export const FUNCTION_CALL = "FUNCTION_CALL"; +export const METHOD_CALL = "METHOD_CALL"; \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx index 8dd0c0ca211..b4c964fa8ad 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx @@ -18,7 +18,7 @@ import { useEffect, useRef, useState } from "react"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; -import { NodeList, Category as PanelCategory, FormField, FormValues, Parameter } from "@wso2/ballerina-side-panel"; +import { NodeList, Category as PanelCategory, FormField, FormValues } from "@wso2/ballerina-side-panel"; import { BIAvailableNodesRequest, Category, @@ -49,6 +49,7 @@ import styled from "@emotion/styled"; import { URI, Utils } from "vscode-uri"; import { cloneDeep } from "lodash"; import { createDefaultParameterValue, createToolInputFields, createToolParameters } from "./formUtils"; +import { FUNCTION_CALL, METHOD_CALL, REMOTE_ACTION_CALL, RESOURCE_ACTION_CALL } from "../../../constants"; const LoaderContainer = styled.div` display: flex; @@ -57,6 +58,19 @@ const LoaderContainer = styled.div` height: 100%; `; +const ImplementationInfo = styled.div` + display: flex; + align-items: center; + background-color: var(--vscode-input-background); + border: 1px solid var(--vscode-editorWidget-border); + padding: 5px 10px; + margin-top: 5px; + cursor: pointer; + p { + margin: 0; + } +`; + export enum SidePanelView { NODE_LIST = "NODE_LIST", TOOL_FORM = "TOOL_FORM", @@ -84,8 +98,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { const functionNode = useRef(null); const flowNode = useRef(null); - const [loading, setLoading] = useState(false); - const [fields, setFields] = useState([ + const initialFields: FormField[] = [ { key: `name`, label: "Tool Name", @@ -110,7 +123,10 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { valueTypeConstraint: "", enabled: true, }, - ]); + ]; + + const [loading, setLoading] = useState(false); + const [fields, setFields] = useState(initialFields); const targetRef = useRef({ startLine: { line: 0, offset: 0 }, endLine: { line: 0, offset: 0 } }); const initialCategoriesRef = useRef([]); @@ -121,6 +137,34 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { fetchNodes(); }, []); + const handleBackToNodeList = () => { + setSidePanelView(SidePanelView.NODE_LIST); + setFields(initialFields); + setSelectedNodeCodeData(undefined); + setToolNodeId(undefined); + selectedNodeRef.current = undefined; + functionNode.current = null; + flowNode.current = null; + }; + + const getImplementationString = (codeData: CodeData | undefined): string => { + if (!codeData) { + return ""; + } + switch (codeData.node) { + case RESOURCE_ACTION_CALL: + return `${codeData.parentSymbol} -> ${codeData.symbol} ${codeData.resourcePath}`; + case REMOTE_ACTION_CALL: + return `${codeData.parentSymbol} -> ${codeData.symbol}`; + case FUNCTION_CALL: + return `${codeData.symbol}`; + case METHOD_CALL: + return `${codeData.parentSymbol} -> ${codeData.symbol}`; + default: + return ""; + } + }; + // Use effects to refresh the panel useEffect(() => { rpcClient.onParentPopupSubmitted((parent: ParentPopupData) => { @@ -233,7 +277,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { selectedNodeRef.current = node; setSelectedNodeCodeData(node.codedata); - if (nodeId === "FUNCTION_CALL") { + if (nodeId === FUNCTION_CALL) { try { const functionNodeResponse = await rpcClient.getBIDiagramRpcClient().getFunctionNode({ functionName: node.codedata.symbol, @@ -285,7 +329,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { } catch (error) { console.error(">>> Error fetching function node or template", error); } - } else if (nodeId === "REMOTE_ACTION_CALL" || nodeId === "RESOURCE_ACTION_CALL" || nodeId === "METHOD_CALL") { + } else if (nodeId === REMOTE_ACTION_CALL || nodeId === RESOURCE_ACTION_CALL || nodeId === METHOD_CALL) { try { const nodeTemplate = await rpcClient.getBIDiagramRpcClient().getNodeTemplate({ position: { line: 0, offset: 0 }, @@ -357,7 +401,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { let clonedFunctionNode: FunctionNode | null = null; let clonedFlowNode: FlowNode | null = null; - if (toolNodeId === "FUNCTION_CALL" && Array.isArray(data["parameters"])) { + if (toolNodeId === FUNCTION_CALL && Array.isArray(data["parameters"])) { clonedFunctionNode = functionNode.current ? cloneDeep(functionNode.current) : null; toolParameters = cloneDeep(functionNode.current?.properties?.parameters) as unknown as ToolParameters; @@ -396,7 +440,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { } }); } - } else if ((toolNodeId === "REMOTE_ACTION_CALL" || toolNodeId === "RESOURCE_ACTION_CALL" || toolNodeId === "METHOD_CALL") && Array.isArray(data["parameters"])) { + } else if ((toolNodeId === REMOTE_ACTION_CALL || toolNodeId === RESOURCE_ACTION_CALL || toolNodeId === METHOD_CALL) && Array.isArray(data["parameters"])) { clonedFlowNode = flowNode.current ? cloneDeep(flowNode.current) : null; // Update flowNode parameter values from data["parameters"] @@ -463,7 +507,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { let description = ""; if ( selectedNodeRef.current && - selectedNodeRef.current.codedata.node === "FUNCTION_CALL" && + selectedNodeRef.current.codedata.node === FUNCTION_CALL && !(selectedNodeRef.current.metadata?.data as NodeMetadata)?.isIsolatedFunction ) { concertMessage = `Convert ${selectedNodeRef.current.metadata.label} function to an isolated function`; @@ -490,17 +534,25 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { /> )} {sidePanelView === SidePanelView.TOOL_FORM && ( - + <> +
+

Implementation

+ +

{getImplementationString(selectedNodeRef.current.codedata)}

+
+
+ + )} ); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewTool.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewTool.tsx index 3c2dec9f0c1..2c69f92a583 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewTool.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewTool.tsx @@ -24,6 +24,7 @@ import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { AIAgentSidePanel, ExtendedAgentToolRequest } from "./AIAgentSidePanel"; import { RelativeLoader } from "../../../components/RelativeLoader"; import { addToolToAgentNode, findAgentNodeFromAgentCallNode, updateFlowNodePropertyValuesWithKeys } from "./utils"; +import { FUNCTION_CALL } from "../../../constants"; const LoaderContainer = styled.div` display: flex; @@ -87,7 +88,7 @@ export function NewTool(props: NewToolProps): JSX.Element { await new Promise((resolve) => setTimeout(resolve, 2000)); // add tools - if (data.selectedCodeData.node === "FUNCTION_CALL") { + if (data.selectedCodeData.node === FUNCTION_CALL) { // create tool from existing function // get function definition const functionDefinition = data.functionNode; From bc21623b88f329612507ac662a3ebead7a7ea2ec Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Sun, 27 Jul 2025 16:20:45 +0530 Subject: [PATCH 181/349] Refactor PanelManager to use onClose for save actions for agent views --- .../src/views/BI/FlowDiagram/PanelManager.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx index 30ee896888e..409c26aa2a8 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx @@ -218,12 +218,12 @@ export function PanelManager(props: PanelManagerProps) { agentCallNode={selectedNode} fileName={fileName} lineRange={targetLineRange} - onSave={handleSubmitAndClose} + onSave={onClose} /> ); case SidePanelView.ADD_TOOL: - return ; + return ; case SidePanelView.ADD_MCP_SERVER: return ( @@ -241,22 +241,22 @@ export function PanelManager(props: PanelManagerProps) { return ; case SidePanelView.NEW_TOOL: - return ; + return ; case SidePanelView.AGENT_TOOL: const selectedTool = (selectedNode?.metadata.data as NodeMetadata).tools?.find( (tool) => tool.name === selectedClientName ); - return ; + return ; case SidePanelView.AGENT_MODEL: - return ; + return ; case SidePanelView.AGENT_CONFIG: return ; case SidePanelView.AGENT_MEMORY_MANAGER: - return ; + return ; case SidePanelView.FUNCTION_LIST: return ( From b544ee6d443beb38f66f48e53eae773ceaccf30a Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Sun, 27 Jul 2025 17:11:06 +0530 Subject: [PATCH 182/349] Add new node kind for VectorKnowledgeBaseCall --- .../ballerina/ballerina-core/src/flow-model/BaseVisitor.ts | 3 +++ workspaces/ballerina/ballerina-core/src/interfaces/bi.ts | 7 ++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/flow-model/BaseVisitor.ts b/workspaces/ballerina/ballerina-core/src/flow-model/BaseVisitor.ts index 7489e98ac0d..30fe83be8b2 100644 --- a/workspaces/ballerina/ballerina-core/src/flow-model/BaseVisitor.ts +++ b/workspaces/ballerina/ballerina-core/src/flow-model/BaseVisitor.ts @@ -90,6 +90,9 @@ export interface BaseVisitor { beginVisitAgentCall?(node: FlowNode, parent?: FlowNode): void; endVisitAgentCall?(node: FlowNode, parent?: FlowNode): void; + beginVisitVectorKnowledgeBaseCall?(node: FlowNode, parent?: FlowNode): void; + endVisitVectorKnowledgeBaseCall?(node: FlowNode, parent?: FlowNode): void; + beginVisitParallelFlow?(node: FlowNode, parent?: FlowNode): void; endVisitParallelFlow?(node: FlowNode, parent?: FlowNode): void; diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts index 292a9084d28..ea6bd13f7ce 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts @@ -379,12 +379,13 @@ export type NodeKind = | "LV_EXPRESSION" | "MATCH" | "MODEL_PROVIDER" - | "VECTOR_STORE" - | "VECTOR_KNOWLEDGE_BASE" - | "EMBEDDING_PROVIDER" | "MODEL_PROVIDERS" + | "VECTOR_STORE" | "VECTOR_STORES" + | "VECTOR_KNOWLEDGE_BASE" + | "VECTOR_KNOWLEDGE_BASE_CALL" | "VECTOR_KNOWLEDGE_BASES" + | "EMBEDDING_PROVIDER" | "EMBEDDING_PROVIDERS" | "NEW_CONNECTION" | "NEW_DATA" From 1c183756643d5d1ab17c2597a7d3f29ff4090efd Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Sun, 27 Jul 2025 17:14:41 +0530 Subject: [PATCH 183/349] Add custom node for VectorKnowledgeBaseCall kind and refactor nodeIcon and connectorIcon libs --- .../src/components/ConnectorIcon/index.tsx | 47 +++++++++++++++++++ .../src/components/NodeIcon/index.tsx | 10 ++-- .../AgentCallNode/AgentCallNodeWidget.tsx | 42 ++--------------- .../nodes/PromptNode/PromptNodeWidget.tsx | 25 +--------- .../src/visitors/BreakpointVisitor.ts | 4 ++ .../src/visitors/NodeFactoryVisitor.ts | 5 ++ .../bi-diagram/src/visitors/SizingVisitor.ts | 5 ++ .../font-wso2-vscode/src/icons/bi-db-kb.svg | 22 +++++++++ 8 files changed, 94 insertions(+), 66 deletions(-) create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-db-kb.svg diff --git a/workspaces/ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx b/workspaces/ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx index 8a9e951ee64..9b5c2e3652b 100644 --- a/workspaces/ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx @@ -20,6 +20,13 @@ import React, { CSSProperties, useState } from "react"; import { Icon } from "@wso2/ui-toolkit"; import { ApiIcon } from "../../resources"; import { getAIColor, ThemeListener } from "../NodeIcon"; +import OpenAiIcon from "../../resources/icons/OpenAiIcon"; +import AzureOpenAiIcon from "../../resources/icons/AzureOpenAiIcon"; +import AnthropicIcon from "../../resources/icons/AnthropicIcon"; +import OllamaIcon from "../../resources/icons/OllamaIcon"; +import MistralAIIcon from "../../resources/icons/MistralAIIcon"; +import DeepseekIcon from "../../resources/icons/DeepseekIcon"; +import DefaultLlmIcon from "../../resources/icons/DefaultLlmIcon"; interface ConnectorIconProps { url?: string; @@ -43,6 +50,13 @@ export function ConnectorIcon(props: ConnectorIconProps): React.ReactElement { return ; } + // use custom icon for ai model providers + const aiModules = ["ai.openai", "ai.azure", "ai.anthropic", "ai.ollama", "ai.mistral", "ai.deepseek"]; + if (aiModules.some(module => url?.includes(module))) { + const selectedModule = aiModules.find(module => url?.includes(module)); + return getLlmModelIcons(selectedModule); + } + // use custom icon for ai module if (url?.includes("ballerinax_ai_")) { return ( @@ -57,6 +71,12 @@ export function ConnectorIcon(props: ConnectorIconProps): React.ReactElement { ); } + if (url?.includes("ballerina_ai")) { + return ( + + ); + } + if (url && isValidUrl(url) && !imageError) { return setImageError(true)} style={{ ...style }} />; } @@ -81,4 +101,31 @@ function isValidUrl(url: string): boolean { } } +// get llm model icons +// this should replace with CDN icons +export function getLlmModelIcons(modelType: string) { + switch (modelType) { + case "OpenAiProvider": + case "ai.openai": + return ; + case "AzureOpenAiProvider": + case "ai.azure": + return ; + case "AnthropicProvider": + case "ai.anthropic": + return ; + case "OllamaProvider": + case "ai.ollama": + return ; + case "MistralAiProvider": + case "ai.mistral": + return ; + case "DeepseekProvider": + case "ai.deepseek": + return ; + default: + return ; + } +} + export default ConnectorIcon; diff --git a/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx b/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx index ac58153cf18..4ad857c65b0 100644 --- a/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx @@ -82,12 +82,13 @@ const NODE_COLOR_GROUPS = { "NP_FUNCTION", "NP_FUNCTION_CALL", "MODEL_PROVIDER", - "VECTOR_KNOWLEDGE_BASE", - "VECTOR_STORE", - "EMBEDDING_PROVIDER", "MODEL_PROVIDERS", + "VECTOR_KNOWLEDGE_BASE", "VECTOR_KNOWLEDGE_BASES", + "VECTOR_KNOWLEDGE_BASE_CALL", + "VECTOR_STORE", "VECTOR_STORES", + "EMBEDDING_PROVIDER", "EMBEDDING_PROVIDERS", ], // Data related - magenta variants @@ -222,7 +223,8 @@ const NODE_ICONS: Record> = RETRY: ({ size, color }) => , AGENT_CALL: ({ size, color }) => , MODEL_PROVIDERS: ({ size, color }) => , - VECTOR_KNOWLEDGE_BASES: ({ size, color }) => , + VECTOR_KNOWLEDGE_BASES: ({ size, color }) => , + VECTOR_KNOWLEDGE_BASE_CALL: ({ size, color }) => , VECTOR_STORES: ({ size, color }) => , EMBEDDING_PROVIDERS: ({ size, color }) => , // Default case for any NodeKind not explicitly handled diff --git a/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx b/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx index 21fe7b31f61..c3a1d55c29c 100644 --- a/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx @@ -33,20 +33,11 @@ import { NODE_PADDING, NODE_WIDTH, } from "../../../resources/constants"; -import { Button, Icon, Item, Menu, MenuItem, Popover, ThemeColors, Tooltip } from "@wso2/ui-toolkit"; -import { - MoreVertIcon, - OpenAiIcon, - AzureOpenAiIcon, - AnthropicIcon, - OllamaIcon, - DefaultLlmIcon, - MistralAIIcon, - DeepseekIcon -} from "../../../resources/icons"; +import { Button, Icon, Item, Menu, MenuItem, Popover, ThemeColors } from "@wso2/ui-toolkit"; +import { MoreVertIcon } from "../../../resources/icons"; import { AgentData, FlowNode, ToolData } from "../../../utils/types"; import NodeIcon from "../../NodeIcon"; -import ConnectorIcon from "../../ConnectorIcon"; +import ConnectorIcon, { getLlmModelIcons } from "../../ConnectorIcon"; import { useDiagramContext } from "../../DiagramContext"; import { DiagnosticsPopUp } from "../../DiagnosticsPopUp"; import { nodeHasError } from "../../../utils/node"; @@ -994,30 +985,3 @@ function sanitizeAgentData(data: AgentData) { } return data; } - -// get llm model icons -// this should replace with CDN icons -function getLlmModelIcons(modelType: string) { - switch (modelType) { - case "OpenAiProvider": - case "ai.openai": - return ; - case "AzureOpenAiProvider": - case "ai.azure": - return ; - case "AnthropicProvider": - case "ai.anthropic": - return ; - case "OllamaProvider": - case "ai.ollama": - return ; - case "MistralAiProvider": - case "ai.mistral": - return ; - case "DeepseekProvider": - case "ai.deepseek": - return ; - default: - return ; - } -} diff --git a/workspaces/ballerina/bi-diagram/src/components/nodes/PromptNode/PromptNodeWidget.tsx b/workspaces/ballerina/bi-diagram/src/components/nodes/PromptNode/PromptNodeWidget.tsx index 80350750937..21178f6c3d1 100644 --- a/workspaces/ballerina/bi-diagram/src/components/nodes/PromptNode/PromptNodeWidget.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/nodes/PromptNode/PromptNodeWidget.tsx @@ -36,11 +36,9 @@ import { useDiagramContext } from "../../DiagramContext"; import { PromptNodeModel } from "./PromptNodeModel"; import { ELineRange, ExpressionProperty, NodeMetadata } from "@wso2/ballerina-core"; import { DiagnosticsPopUp } from "../../DiagnosticsPopUp"; -import { getRawTemplate, nodeHasError } from "../../../utils/node"; +import { nodeHasError } from "../../../utils/node"; import { cloneDeep } from "lodash"; -import { OpenAiIcon } from "../../../resources/icons/OpenAiIcon"; -import { DeepseekIcon } from "../../../resources/icons/DeepseekIcon"; -import { DefaultLlmIcon, MistralAIIcon, OllamaIcon, AzureOpenAiIcon, AnthropicIcon } from "../../../resources/icons"; +import { getLlmModelIcons } from "../../ConnectorIcon"; export namespace NodeStyles { export type NodeStyleProp = { @@ -622,22 +620,3 @@ function isExpression(value: string, cursorPosition: number) { return prefixMatch && suffixMatch; } - -function getLlmModelIcons(modelType: string) { - switch (modelType) { - case "ai.openai": - return ; - case "ai.azure": - return ; - case "ai.anthropic": - return ; - case "ai.ollama": - return ; - case "ai.mistral": - return ; - case "ai.deepseek": - return ; - default: - return ; - } -} diff --git a/workspaces/ballerina/bi-diagram/src/visitors/BreakpointVisitor.ts b/workspaces/ballerina/bi-diagram/src/visitors/BreakpointVisitor.ts index 569d85077c1..d0d17b4d9cb 100644 --- a/workspaces/ballerina/bi-diagram/src/visitors/BreakpointVisitor.ts +++ b/workspaces/ballerina/bi-diagram/src/visitors/BreakpointVisitor.ts @@ -89,6 +89,10 @@ export class BreakpointVisitor implements BaseVisitor { this.setBreakpointData(node); } + beginVisitVectorKnowledgeBaseCall?(node: FlowNode, parent?: FlowNode): void { + this.setBreakpointData(node); + } + beginVisitReturn?(node: FlowNode, parent?: FlowNode): void { this.setBreakpointData(node); } diff --git a/workspaces/ballerina/bi-diagram/src/visitors/NodeFactoryVisitor.ts b/workspaces/ballerina/bi-diagram/src/visitors/NodeFactoryVisitor.ts index c8e0e7591e9..39a646a2e8a 100644 --- a/workspaces/ballerina/bi-diagram/src/visitors/NodeFactoryVisitor.ts +++ b/workspaces/ballerina/bi-diagram/src/visitors/NodeFactoryVisitor.ts @@ -608,6 +608,11 @@ export class NodeFactoryVisitor implements BaseVisitor { this.beginVisitRemoteActionCall(node, parent); } + beginVisitVectorKnowledgeBaseCall(node: FlowNode, parent?: FlowNode): void { + if (!this.validateNode(node)) return; + this.beginVisitRemoteActionCall(node, parent); + } + beginVisitAgentCall(node: FlowNode, parent?: FlowNode): void { if (!this.validateNode(node)) return; if (!node.id) { diff --git a/workspaces/ballerina/bi-diagram/src/visitors/SizingVisitor.ts b/workspaces/ballerina/bi-diagram/src/visitors/SizingVisitor.ts index 7d58631f355..8820204cd9a 100644 --- a/workspaces/ballerina/bi-diagram/src/visitors/SizingVisitor.ts +++ b/workspaces/ballerina/bi-diagram/src/visitors/SizingVisitor.ts @@ -240,6 +240,11 @@ export class SizingVisitor implements BaseVisitor { this.createApiCallNode(node); } + endVisitVectorKnowledgeBaseCall(node: FlowNode, parent?: FlowNode): void { + if (!this.validateNode(node)) return; + this.createApiCallNode(node); + } + endVisitAgentCall(node: FlowNode, parent?: FlowNode): void { if (!this.validateNode(node)) return; const nodeWidth = NODE_WIDTH; diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-db-kb.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-db-kb.svg new file mode 100644 index 00000000000..763d8e64c00 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-db-kb.svg @@ -0,0 +1,22 @@ + + + + From f477f078501313806dab17163a9c7976f62dd58f Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Sun, 27 Jul 2025 17:16:34 +0530 Subject: [PATCH 184/349] Add support for injected components in Form and FormGeneratorNew components --- .../src/components/Form/index.tsx | 91 ++++++++++++------- .../views/BI/AIChatAgent/AIAgentSidePanel.tsx | 56 ++++++------ .../src/views/BI/AIChatAgent/formUtils.ts | 2 +- .../views/BI/Forms/FormGeneratorNew/index.tsx | 10 +- 4 files changed, 97 insertions(+), 62 deletions(-) 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 04743c9a952..4191927a15c 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx @@ -346,6 +346,10 @@ export interface FormProps { onChange?: (fieldKey: string, value: any, allValues: FormValues) => void; mcpTools?: { name: string; description?: string }[]; onToolsChange?: (selectedTools: string[]) => void; + injectedComponents?: { + component: React.ReactNode; + index: number; + }[]; } export const Form = forwardRef((props: FormProps, ref) => { @@ -383,6 +387,7 @@ export const Form = forwardRef((props: FormProps, ref) => { newServerUrl, mcpTools, onToolsChange, + injectedComponents, } = props; const { @@ -738,20 +743,30 @@ export const Form = forwardRef((props: FormProps, ref) => { * 2. preserveOrder = false: Render name and type fields at the bottom, and rest at top */} - {formFields - .sort((a, b) => b.groupNo - a.groupNo) - .filter((field) => field.type !== "VIEW") - .map((field) => { + {(() => { + const fieldsToRender = formFields + .sort((a, b) => b.groupNo - a.groupNo) + .filter((field) => field.type !== "VIEW"); + + const renderedComponents = fieldsToRender.reduce((acc, field, index) => { + if (injectedComponents) { + injectedComponents.forEach((injected) => { + if (injected.index === index) { + acc.push(injected.component); + } + }); + } + if (field.advanced || field.hidden) { - return null; + return acc; } // When preserveOrder is false, skip prioritized fields (they'll be rendered at bottom) if (!preserveOrder && isPrioritizedField(field)) { - return null; + return acc; } const updatedField = updateFormFieldWithImports(field, formImports); - return ( + acc.push( { {updatedField.key === "scope" && scopeFieldAddon} ); - })} + return acc; + }, []); + + if (injectedComponents) { + injectedComponents.forEach((injected) => { + if (injected.index >= fieldsToRender.length) { + renderedComponents.push(injected.component); + } + }); + } + + return renderedComponents; + })()} {hasAdvanceFields && ( Optional Configurations - - {!showAdvancedOptions && ( - - - Expand - - )} - {showAdvancedOptions && ( - - Collapsed + + {!showAdvancedOptions && ( + + + Expand + + )} + {showAdvancedOptions && ( + + Collapsed )} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx index b4c964fa8ad..3fd1eb31c08 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx @@ -64,7 +64,6 @@ const ImplementationInfo = styled.div` background-color: var(--vscode-input-background); border: 1px solid var(--vscode-editorWidget-border); padding: 5px 10px; - margin-top: 5px; cursor: pointer; p { margin: 0; @@ -94,6 +93,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { const [categories, setCategories] = useState([]); const [selectedNodeCodeData, setSelectedNodeCodeData] = useState(undefined); const [toolNodeId, setToolNodeId] = useState(undefined); + const [injectedComponentIndex, setInjectedComponentIndex] = useState(3); const functionNode = useRef(null); const flowNode = useRef(null); @@ -301,6 +301,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { functionNodeResponse.functionDefinition.properties.parameters.metadata.description = ""; const toolInputFields = convertConfig(functionNodeResponse.functionDefinition.properties); + setInjectedComponentIndex(2 + toolInputFields.length); console.log(">>> Tool input fields", { toolInputFields }); const functionNodeTemplate = await rpcClient.getBIDiagramRpcClient().getNodeTemplate({ @@ -317,14 +318,8 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { }); console.log(">>> Function parameter fields", { functionParameterFields }); - // Optionally deduplicate fields by key - const allFields = [...toolInputFields, ...functionParameterFields]; - const dedupedFields = Array.from( - new Map(allFields.map(field => [field.key, field])).values() - ); - setFields((prevFields) => { - return [...prevFields, ...dedupedFields]; + return [...prevFields, ...toolInputFields, ...functionParameterFields]; }); } catch (error) { console.error(">>> Error fetching function node or template", error); @@ -359,6 +354,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { const filteredNodeParameterFields = nodeParameterFields.filter(field => includedKeys.includes(field.key)); const toolInputFields = createToolInputFields(filteredNodeParameterFields); + setInjectedComponentIndex(2 + toolInputFields.length); setFields((prevFields) => { return [...prevFields, ...toolInputFields, ...nodeParameterFields]; @@ -534,25 +530,31 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { /> )} {sidePanelView === SidePanelView.TOOL_FORM && ( - <> -
-

Implementation

- -

{getImplementationString(selectedNodeRef.current.codedata)}

-
-
- - + +

Implementation

+ +

{getImplementationString(selectedNodeRef.current.codedata)}

+
+ + ), + index: injectedComponentIndex, + }, + ]} + /> )} ); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/formUtils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/formUtils.ts index 19b9597f69d..c4b4d98b821 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/formUtils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/formUtils.ts @@ -112,7 +112,7 @@ export function createToolInputFields(filteredNodeParameterFields: FormField[]): paramValues: paramManagerValues, formFields: paramManagerFormFields, handleParameter: function (parameter: Parameter): Parameter { - throw new Error("Function not implemented."); + return parameter; } } } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGeneratorNew/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGeneratorNew/index.tsx index 28564575408..9751e11b995 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGeneratorNew/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGeneratorNew/index.tsx @@ -16,7 +16,7 @@ * under the License. */ -import { RefObject, useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { ReactNode, RefObject, useCallback, useEffect, useMemo, useRef, useState } from "react"; import { EVENT_TYPE, LineRange, @@ -96,6 +96,10 @@ interface FormProps { concertRequired?: boolean; description?: string; preserveFieldOrder?: boolean; + injectedComponents?: { + component: ReactNode; + index: number; + }[]; } export function FormGeneratorNew(props: FormProps) { @@ -123,7 +127,8 @@ export function FormGeneratorNew(props: FormProps) { concertMessage, concertRequired, description, - preserveFieldOrder + preserveFieldOrder, + injectedComponents } = props; const { rpcClient } = useRpcContext(); @@ -702,6 +707,7 @@ export function FormGeneratorNew(props: FormProps) { infoLabel={description} formImports={formImports} preserveOrder={preserveFieldOrder} + injectedComponents={injectedComponents} /> )} {typeEditorState.isOpen && ( From f7998d6d3c8e0559b85dc82d08733b95fe39d055 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Sun, 27 Jul 2025 17:25:21 +0530 Subject: [PATCH 185/349] Refactor state machine update logic and enhance artifact notification handling --- .../src/rpc-managers/ai-panel/rpc-manager.ts | 2 +- .../ballerina-extension/src/stateMachine.ts | 8 +++--- .../src/utils/modification.ts | 25 +++++++++++++++++++ .../src/utils/project-artifacts-handler.ts | 10 +++----- .../src/utils/project-artifacts.ts | 14 +++++------ .../src/views/visualizer/webview.ts | 3 ++- 6 files changed, 41 insertions(+), 21 deletions(-) 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 e300d2c9255..42c58843ede 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 @@ -197,7 +197,7 @@ export class AiPanelRpcManager implements AIPanelAPI { fs.mkdirSync(directory, { recursive: true }); } - writeBallerinaFileDidOpen(balFilePath, req.content); + await writeBallerinaFileDidOpen(balFilePath, req.content); updateView(); const datamapperMetadata = StateMachine.context().dataMapperMetadata; await refreshDataMapper(balFilePath, datamapperMetadata.codeData, datamapperMetadata.name); diff --git a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts index 3faa1fcae29..d6ec9d7381a 100644 --- a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts +++ b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts @@ -507,10 +507,9 @@ export function updateView(refreshTreeView?: boolean) { } let newLocation: VisualizerLocation; - - if (lastView) { - newLocation = { ...lastView.location }; - const currentIdentifier = lastView.location.identifier; + newLocation = { ...lastView.location }; + if (lastView && lastView.location?.artifactType && lastView.location?.identifier) { + const currentIdentifier = lastView.location?.identifier; let currentArtifact: ProjectStructureArtifactResponse; // These changes will be revisited in the revamp @@ -533,7 +532,6 @@ export function updateView(refreshTreeView?: boolean) { history.updateCurrentEntry({ ...lastView, location: newLocation - }); } diff --git a/workspaces/ballerina/ballerina-extension/src/utils/modification.ts b/workspaces/ballerina/ballerina-extension/src/utils/modification.ts index a102d8c1350..e82bc4ac952 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/modification.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/modification.ts @@ -21,6 +21,7 @@ import { Position, Range, Uri, WorkspaceEdit, workspace } from "vscode"; import { URI } from "vscode-uri"; import { writeFileSync } from "fs"; import { StateMachine, updateView } from "../stateMachine"; +import { ArtifactNotificationHandler, ArtifactsUpdated } from "./project-artifacts-handler"; interface UpdateFileContentRequest { filePath: string; @@ -81,4 +82,28 @@ export async function writeBallerinaFileDidOpen(filePath: string, content: strin text: content.trim() } }); + + return new Promise((resolve, reject) => { + // Get the artifact notification handler instance + const notificationHandler = ArtifactNotificationHandler.getInstance(); + // Subscribe to artifact updated notifications + let unsubscribe = notificationHandler.subscribe(ArtifactsUpdated.method, undefined, async (payload) => { + clearTimeout(timeoutId); + resolve(payload.data); + unsubscribe(); + }); + + // Set a timeout to reject if no notification is received within 10 seconds + const timeoutId = setTimeout(() => { + console.log("No artifact update notification received within 10 seconds"); + unsubscribe(); + }, 10000); + + // Clear the timeout when notification is received + const originalUnsubscribe = unsubscribe; + unsubscribe = () => { + clearTimeout(timeoutId); + originalUnsubscribe(); + }; + }); } diff --git a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts-handler.ts b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts-handler.ts index b48ba39f432..8263935620d 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts-handler.ts @@ -69,12 +69,10 @@ export class ArtifactNotificationHandler { filteredData = filteredData.filter(data => data.name === artifactData.identifier); } } - if (filteredData.length > 0) { - callback({ - ...payload, - data: filteredData - }); - } + callback({ + ...payload, + data: filteredData + }); }; subscribers.add(wrappedCallback); diff --git a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts index 10847a83b12..88e31b2b694 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts @@ -63,14 +63,12 @@ export async function updateProjectArtifacts(publishedArtifacts: ArtifactsNotifi const isWithinProject = URI.parse(publishedArtifacts.uri).path.toLowerCase().includes(projectUri.path.toLowerCase()); if (currentProjectStructure && isWithinProject) { const entryLocations = await traverseUpdatedComponents(publishedArtifacts.artifacts, currentProjectStructure); - if (entryLocations.length > 0) { - const notificationHandler = ArtifactNotificationHandler.getInstance(); - // Publish a notification to the artifact handler - notificationHandler.publish(ArtifactsUpdated.method, { - data: entryLocations, - timestamp: Date.now() - }); - } + const notificationHandler = ArtifactNotificationHandler.getInstance(); + // Publish a notification to the artifact handler + notificationHandler.publish(ArtifactsUpdated.method, { + data: entryLocations, + timestamp: Date.now() + }); StateMachine.updateProjectStructure({ ...currentProjectStructure }); // Update the project structure and refresh the tree } } diff --git a/workspaces/ballerina/ballerina-extension/src/views/visualizer/webview.ts b/workspaces/ballerina/ballerina-extension/src/views/visualizer/webview.ts index 4c5d18b3d07..197aae51331 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/visualizer/webview.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/visualizer/webview.ts @@ -27,6 +27,7 @@ import { StateMachine, updateView } from "../../stateMachine"; import { LANGUAGE } from "../../core"; import { CodeData, MACHINE_VIEW } from "@wso2/ballerina-core"; import { refreshDataMapper } from "../../rpc-managers/inline-data-mapper/utils"; +import { AiPanelWebview } from "../ai-panel/webview"; export class VisualizerWebview { public static currentPanel: VisualizerWebview | undefined; @@ -78,7 +79,7 @@ export class VisualizerWebview { if (dataMapperModified) { debouncedRefreshDataMapper(); - } else if (this._panel?.active && balFileModified) { + } else if ((this._panel?.active || AiPanelWebview.currentPanel?.getWebview()?.active) && balFileModified) { sendUpdateNotificationToWebview(); } else if (configTomlModified) { sendUpdateNotificationToWebview(true); From 0f1fe13366eeea6d76fcf86eebec8520878fabfe Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Sun, 27 Jul 2025 17:27:41 +0530 Subject: [PATCH 186/349] Add fix to show all editable fields in agent tool creation form --- .../src/views/BI/AIChatAgent/AIAgentSidePanel.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx index 3fd1eb31c08..3f2f59b7927 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx @@ -348,14 +348,17 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { } field.value = field.key; field.optional = false; + field.advanced = false; includedKeys.push(field.key); }); - console.log(">>> Tool input fields", { nodeParameterFields }); + console.log(">>> Node parameter fields", { nodeParameterFields }); const filteredNodeParameterFields = nodeParameterFields.filter(field => includedKeys.includes(field.key)); const toolInputFields = createToolInputFields(filteredNodeParameterFields); setInjectedComponentIndex(2 + toolInputFields.length); + console.log(">>> Tool input fields", { toolInputFields }); + setFields((prevFields) => { return [...prevFields, ...toolInputFields, ...nodeParameterFields]; }); From 00c86035c2fc65f94357aaee42d1326334f64411 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Sun, 27 Jul 2025 17:28:42 +0530 Subject: [PATCH 187/349] Fix missing newline at end of file in constants.ts --- workspaces/ballerina/ballerina-visualizer/src/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/constants.ts b/workspaces/ballerina/ballerina-visualizer/src/constants.ts index b49839d7c65..f6827f17e99 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/constants.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/constants.ts @@ -44,4 +44,4 @@ export const PROVIDER_NAME_MAP: Record = { export const RESOURCE_ACTION_CALL = "RESOURCE_ACTION_CALL"; export const REMOTE_ACTION_CALL = "REMOTE_ACTION_CALL"; export const FUNCTION_CALL = "FUNCTION_CALL"; -export const METHOD_CALL = "METHOD_CALL"; \ No newline at end of file +export const METHOD_CALL = "METHOD_CALL"; From b773aadf5639785b2585c7a851f269405873093a Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Sun, 27 Jul 2025 17:47:44 +0530 Subject: [PATCH 188/349] Fix location assignment in updateView function for improved clarity --- workspaces/ballerina/ballerina-extension/src/stateMachine.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts index d6ec9d7381a..e8f60f65f77 100644 --- a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts +++ b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts @@ -507,8 +507,8 @@ export function updateView(refreshTreeView?: boolean) { } let newLocation: VisualizerLocation; - newLocation = { ...lastView.location }; if (lastView && lastView.location?.artifactType && lastView.location?.identifier) { + newLocation = { ...lastView.location }; const currentIdentifier = lastView.location?.identifier; let currentArtifact: ProjectStructureArtifactResponse; From 3bade9b65de677d250e3302e24fdbe045812e48f Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Sun, 27 Jul 2025 17:53:37 +0530 Subject: [PATCH 189/349] Update parameter handling in AIAgentSidePanel to use formValues for variable, description, and type --- .../src/views/BI/AIChatAgent/AIAgentSidePanel.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx index 3f2f59b7927..a8adc9dbd9b 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx @@ -426,13 +426,13 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { paramKeys.forEach((key: string) => { const paramObj = toolParameters.value[key]; if (paramObj && paramObj.value && paramObj.value.variable) { - paramObj.value.variable.value = key; + paramObj.value.variable.value = data["parameters"].find((param: any) => param.key === key)?.formValues.variable || key; paramObj.value.parameterDescription.value = data["parameters"].find((param: any) => param.key === key)?.formValues.parameterDescription || ""; paramObj.value.type.value = data["parameters"].find((param: any) => param.key === key)?.formValues.type || ""; } if (!toolParameters.value[key]) { toolParameters.value[key] = createDefaultParameterValue({ - value: key, + value: data["parameters"].find((param: any) => param.key === key)?.formValues.variable || key, parameterDescription: data["parameters"].find((param: any) => param.key === key)?.formValues.parameterDescription, type: data["parameters"].find((param: any) => param.key === key)?.formValues.type }); @@ -460,6 +460,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { // Update toolParameters: remove keys not present, and set values from data toolParameters = createToolParameters(); const paramKeys = data["parameters"].map((param: any) => param.key); + console.log(">>> toolParameters before update", { toolParameters, paramKeys }); if (toolParameters && typeof toolParameters.value === "object" && !Array.isArray(toolParameters.value)) { Object.keys(toolParameters.value).forEach((key) => { if (!paramKeys.includes(key)) { @@ -469,13 +470,13 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { paramKeys.forEach((key: string) => { const paramObj = toolParameters.value[key]; if (paramObj && paramObj.value && paramObj.value.variable) { - paramObj.value.variable.value = key; + paramObj.value.variable.value = data["parameters"].find((param: any) => param.key === key)?.formValues.variable || key; paramObj.value.parameterDescription.value = data["parameters"].find((param: any) => param.key === key)?.formValues.parameterDescription || ""; paramObj.value.type.value = data["parameters"].find((param: any) => param.key === key)?.formValues.type || ""; } if (!toolParameters.value[key]) { toolParameters.value[key] = createDefaultParameterValue({ - value: key, + value: data["parameters"].find((param: any) => param.key === key)?.formValues.variable || key, parameterDescription: data["parameters"].find((param: any) => param.key === key)?.formValues.parameterDescription, type: data["parameters"].find((param: any) => param.key === key)?.formValues.type }); From 7ad410c69816677cc01e17bd5715bf8861e05c39 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Sun, 27 Jul 2025 18:11:42 +0530 Subject: [PATCH 190/349] Update agent creation tool to handle FUNCTION_CALL nodes with empty parameters --- .../views/BI/AIChatAgent/AIAgentSidePanel.tsx | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx index a8adc9dbd9b..856735728ac 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx @@ -277,6 +277,10 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { selectedNodeRef.current = node; setSelectedNodeCodeData(node.codedata); + let toolInputFields: FormField[] = []; + let functionParameterFields: FormField[] = []; + let nodeParameterFields: FormField[] = []; + if (nodeId === FUNCTION_CALL) { try { const functionNodeResponse = await rpcClient.getBIDiagramRpcClient().getFunctionNode({ @@ -300,7 +304,9 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { functionNodeResponse.functionDefinition.properties.parameters.metadata.label = "Tool Inputs"; functionNodeResponse.functionDefinition.properties.parameters.metadata.description = ""; - const toolInputFields = convertConfig(functionNodeResponse.functionDefinition.properties); + if (functionNodeResponse.functionDefinition.properties) { + toolInputFields = convertConfig(functionNodeResponse.functionDefinition.properties); + } setInjectedComponentIndex(2 + toolInputFields.length); console.log(">>> Tool input fields", { toolInputFields }); @@ -311,10 +317,13 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { }); console.log(">>> Function node template response", { functionNodeTemplate }); - const functionParameterFields = convertConfig(functionNodeTemplate.flowNode.properties); + if (functionNodeTemplate.flowNode.properties) { + functionParameterFields = convertConfig(functionNodeTemplate.flowNode.properties); + } functionParameterFields.forEach((field) => { field.value = field.key; field.optional = false; + field.advanced = false; }); console.log(">>> Function parameter fields", { functionParameterFields }); @@ -340,7 +349,9 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { } const includedKeys: string[] = []; - const nodeParameterFields = convertConfig(nodeTemplate.flowNode.properties); + if (nodeTemplate.flowNode.properties) { + nodeParameterFields = convertConfig(nodeTemplate.flowNode.properties); + } nodeParameterFields.forEach((field) => { if (["type", "targetType", "variable", "checkError", "connection", "resourcePath"].includes(field.key)) { field.hidden = true; @@ -354,7 +365,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { console.log(">>> Node parameter fields", { nodeParameterFields }); const filteredNodeParameterFields = nodeParameterFields.filter(field => includedKeys.includes(field.key)); - const toolInputFields = createToolInputFields(filteredNodeParameterFields); + toolInputFields = createToolInputFields(filteredNodeParameterFields); setInjectedComponentIndex(2 + toolInputFields.length); console.log(">>> Tool input fields", { toolInputFields }); From 1c35a48ab22c7e61f7c84200a56e26d10998397c Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Sun, 27 Jul 2025 18:38:44 +0530 Subject: [PATCH 191/349] Update ImplementationInfo styling --- .../src/views/BI/AIChatAgent/AIAgentSidePanel.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx index 856735728ac..4b588914e22 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx @@ -63,7 +63,8 @@ const ImplementationInfo = styled.div` align-items: center; background-color: var(--vscode-input-background); border: 1px solid var(--vscode-editorWidget-border); - padding: 5px 10px; + padding: 10px 10px; + border-radius: 4px; cursor: pointer; p { margin: 0; From 09606aa746e8827723cfe794d0f8882e51779b31 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Sun, 27 Jul 2025 19:15:06 +0530 Subject: [PATCH 192/349] Fix missing newline at end of file in formUtils.ts --- .../ballerina-visualizer/src/views/BI/AIChatAgent/formUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/formUtils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/formUtils.ts index c4b4d98b821..9ab772946da 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/formUtils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/formUtils.ts @@ -222,4 +222,4 @@ export function createToolParameters(): ToolParameters { advanced: false, hidden: false }; -} \ No newline at end of file +} From 9371c1aae971e2e5e82f610828b04edbf1c8e058 Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Sun, 27 Jul 2025 20:17:57 +0530 Subject: [PATCH 193/349] Fix natural programming template relatesd issues --- .../src/features/ai/service/code/code.ts | 6 ++++-- .../src/features/ai/service/event.ts | 6 +++--- .../features/ai/service/healthcare/healthcare.ts | 3 ++- .../src/features/ai/service/openapi/openapi.ts | 4 ++-- .../features/ai/service/test/function_tests.ts | 4 ++-- .../src/features/ai/service/test/test.ts | 3 ++- .../src/features/ai/service/test/test_plan.ts | 4 ++-- .../src/features/ai/service/utils.ts | 4 +++- .../src/features/natural-programming/utils.ts | 16 ++++++++++------ .../src/rpc-managers/bi-diagram/rpc-manager.ts | 4 ++-- .../views/AIPanel/components/AIChat/index.tsx | 3 ++- .../src/views/AIPanel/utils/networkUtils.ts | 4 ++-- 12 files changed, 36 insertions(+), 25 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 79808272d29..9b5cfa23d90 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -35,6 +35,7 @@ import { RepairParams, RepairResponse, SourceFiles, + Command } from "@wso2/ballerina-core"; import { getProjectSource, postProcess } from "../../../../rpc-managers/ai-panel/rpc-manager"; import { CopilotEventHandler, createWebviewEventHandler } from "../event"; @@ -146,7 +147,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler // Main public function that uses the default event handler export async function generateCode(params: GenerateCodeRequest): Promise { - const eventHandler = createWebviewEventHandler(); + const eventHandler = createWebviewEventHandler(Command.Code); try { await generateCodeCore(params, eventHandler); } catch (error) { @@ -293,7 +294,8 @@ ${fileInstructions} } export async function triggerGeneratedCodeRepair(params: RepairParams): Promise { - const eventHandler = createWebviewEventHandler(); + // add null as the command since this is a repair operation is not a command + const eventHandler = createWebviewEventHandler(undefined); try { return await repairCodeCore(params, eventHandler); } catch (error) { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts index 5ed7870ff0c..f8f57417b3e 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts @@ -14,13 +14,13 @@ // specific language governing permissions and limitations // under the License. -import { ChatNotify, ChatContent } from "@wso2/ballerina-core"; +import { ChatNotify, ChatContent, Command } from "@wso2/ballerina-core"; import { sendContentAppendNotification, sendContentReplaceNotification, sendDiagnosticMessageNotification, sendErrorNotification, sendMessagesNotification, sendMessageStartNotification, sendMessageStopNotification, sendTestGenIntermidateStateNotification } from "./utils"; export type CopilotEventHandler = (event: ChatNotify) => void; // Event listener that handles events and sends notifications -export function createWebviewEventHandler(): CopilotEventHandler { +export function createWebviewEventHandler(command: Command): CopilotEventHandler { return (event: ChatNotify) => { switch (event.type) { case 'start': @@ -36,7 +36,7 @@ export function createWebviewEventHandler(): CopilotEventHandler { sendErrorNotification(event.content); break; case 'stop': - sendMessageStopNotification(); + sendMessageStopNotification(command); break; case 'intermediary_state': sendTestGenIntermidateStateNotification(event.state); 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 index a2c9d75974f..56db60f5aca 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts @@ -35,6 +35,7 @@ import { ProjectSource, SourceFiles, OperationType, + Command } from "@wso2/ballerina-core"; import { getProjectSource } from "../../../../rpc-managers/ai-panel/rpc-manager"; import { CopilotEventHandler, createWebviewEventHandler } from "../event"; @@ -119,7 +120,7 @@ export async function generateHealthcareCodeCore( // Main public function that uses the default event handler export async function generateHealthcareCode(params: GenerateCodeRequest): Promise { - const eventHandler = createWebviewEventHandler(); + const eventHandler = createWebviewEventHandler(Command.Healthcare); try { await generateHealthcareCodeCore(params, eventHandler); } catch (error) { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts index f14f35266c8..71fc34927ce 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts @@ -14,7 +14,7 @@ // specific language governing permissions and limitations // under the License. -import { GenerateOpenAPIRequest } from "@wso2/ballerina-core"; +import { GenerateOpenAPIRequest, Command } from "@wso2/ballerina-core"; import { streamText } from "ai"; import { getAnthropicClient, ANTHROPIC_HAIKU } from "../connection"; import { getErrorMessage, populateHistory } from "../utils"; @@ -75,7 +75,7 @@ export async function generateOpenAPISpecCore( // Main public function that uses the default event handler export async function generateOpenAPISpec(params: GenerateOpenAPIRequest): Promise { - const eventHandler = createWebviewEventHandler(); + const eventHandler = createWebviewEventHandler(Command.OpenAPI); try { await generateOpenAPISpecCore(params, eventHandler); } catch (error) { 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 index c5d90b6f505..15f459518d3 100644 --- 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 @@ -14,7 +14,7 @@ // specific language governing permissions and limitations // under the License. -import { TestGenerationTarget, TestGeneratorIntermediaryState } from "@wso2/ballerina-core"; +import { TestGenerationTarget, TestGeneratorIntermediaryState, Command } from "@wso2/ballerina-core"; import { getErrorMessage } from "../utils"; import { generateTest, getDiagnostics } from "../../testGenerator"; import { getBallerinaProjectRoot } from "../../../../rpc-managers/ai-panel/rpc-manager"; @@ -108,7 +108,7 @@ export async function generateFunctionTestsCore( // Main public function that uses the default event handler export async function generateFunctionTests(params: TestGeneratorIntermediaryState): Promise { - const eventHandler = createWebviewEventHandler(); + const eventHandler = createWebviewEventHandler(Command.Tests); try { await generateFunctionTestsCore(params, eventHandler); } catch (error) { 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 index 823ca0e19ba..16eb1389328 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts @@ -14,6 +14,7 @@ // specific language governing permissions and limitations // under the License. +import { Command } from "@wso2/ballerina-core"; import { generateText, CoreMessage } from "ai"; import { getAnthropicClient } from "../connection"; import { @@ -51,7 +52,7 @@ export async function generateTestFromLLMCore(request: TestGenerationRequest1, e // Main public function that uses the default event handler export async function generateTestFromLLM(request: TestGenerationRequest1): Promise { - const eventHandler = createWebviewEventHandler(); + const eventHandler = createWebviewEventHandler(Command.Tests ); return await generateTestFromLLMCore(request, eventHandler); } 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 index 9c224e4f22c..31cdeb0663e 100644 --- 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 @@ -17,7 +17,7 @@ import { CoreMessage, streamText } from "ai"; import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; import { getErrorMessage } from "../utils"; -import { TestGenerationTarget, TestPlanGenerationRequest } from "@wso2/ballerina-core"; +import { TestGenerationTarget, TestPlanGenerationRequest, Command } from "@wso2/ballerina-core"; import { generateTest, getDiagnostics } from "../../testGenerator"; import { getBallerinaProjectRoot } from "../../../../rpc-managers/ai-panel/rpc-manager"; import { CopilotEventHandler, createWebviewEventHandler } from "../event"; @@ -232,7 +232,7 @@ export async function generateTestPlanCore( // Main public function that uses the default event handler export async function generateTestPlan(params: TestPlanGenerationRequest): Promise { - const eventHandler = createWebviewEventHandler(); + const eventHandler = createWebviewEventHandler(Command.Tests); try { await generateTestPlanCore(params, eventHandler); } catch (error) { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts index ad8f88e4fbf..7e88627d5b6 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts @@ -28,6 +28,7 @@ import { ProjectSource, SourceFiles, TestGeneratorIntermediaryState, + Command } from "@wso2/ballerina-core"; import { CoreMessage } from "ai"; import { MessageRole } from "./types"; @@ -159,9 +160,10 @@ export function sendContentAppendNotification(chunk: string): void { sendAIPanelNotification(msg); } -export function sendMessageStopNotification(): void { +export function sendMessageStopNotification(command: Command): void { const msg: ChatNotify = { type: "stop", + command }; sendAIPanelNotification(msg); } 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 208779e29e4..6739245acfb 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts @@ -118,12 +118,16 @@ async function getLLMResponses(sources: BallerinaSource[], token: string, backen const firstResponse = responses[0]; const filteredResponses: Response[] - = responses.filter(response => !isError(response) && response.ok) as Response[]; + = responses.filter(response => response != undefined && !isError(response) && response.ok) as Response[]; if (filteredResponses.length === 0) { if (isError(firstResponse)) { return HttpStatusCode.InternalServerError; } + + if (firstResponse == undefined) { + return null; + } return firstResponse.status; } @@ -268,14 +272,14 @@ export async function getLLMDiagnosticArrayAsString(projectUri: string): Promise const responses = await getLLMResponses(sources, token, backendurl); - if (isNumber(responses)) { - return responses; - } - if (responses == null) { return ""; } + if (isNumber(responses)) { + return responses; + } + let diagnosticArray = (await createDiagnosticArray(responses, projectUri)).map(diagnostic => { return `${diagnostic.message}`; }) @@ -508,7 +512,7 @@ export async function getAccessToken(): Promise { let token: string; const loginMethod = await getLoginMethod(); if (loginMethod === LoginMethod.BI_INTEL) { - token = await getAccesstokenFromUtils() + token = await getAccesstokenFromUtils(); } resolve(token as string); }); 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 6eafee80608..f33425140a9 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 @@ -493,7 +493,7 @@ export class BiDiagramRpcManager implements BIDiagramAPI { let token: string; const loginMethod = await getLoginMethod(); if (loginMethod === LoginMethod.BI_INTEL) { - token = await getAccessToken() + token = await getAccessToken(); } if (!token) { @@ -531,7 +531,7 @@ export class BiDiagramRpcManager implements BIDiagramAPI { let token: string; const loginMethod = await getLoginMethod(); if (loginMethod === LoginMethod.BI_INTEL) { - token = await getAccessToken() + token = await getAccessToken(); } if (!token) { //TODO: Do we need to prompt to login here? If so what? Copilot or Ballerina AI? diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx index aa7241e910d..82138c404c5 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx @@ -311,7 +311,8 @@ const AIChat: React.FC = () => { console.log("Received stop signal"); setIsCodeLoading(false); setIsLoading(false); - addChatEntry("user", messages[messages.length - 2].content,); // Handle this in input layer? + const command = response.command; + addChatEntry("user", messages[messages.length - 2].content, command != undefined && command == Command.Code ); // Handle this in input layer? addChatEntry("assistant", messages[messages.length - 1].content); } else if (type === "error") { console.log("Received error signal"); diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/utils/networkUtils.ts b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/utils/networkUtils.ts index 0fbb924e3d0..fa0980a1fea 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/utils/networkUtils.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/utils/networkUtils.ts @@ -16,7 +16,7 @@ * under the License. */ -import { AIMachineEventType } from "@wso2/ballerina-core"; +import { AIMachineEventType, LoginMethod } from "@wso2/ballerina-core"; interface FetchWithAuthParams { url: string; @@ -52,7 +52,7 @@ export const fetchWithAuth = async ({ let finalToken; try { const loginMethod = await rpcClient.getAiPanelRpcClient().getLoginMethod(); - if (loginMethod === "BI_INTEL") { + if (loginMethod === LoginMethod.BI_INTEL) { finalToken = await rpcClient.getAiPanelRpcClient().getAccessToken(); } } catch (error) { From 1fb51afdbcac2e7c1e499297b876999da2ef2b3d Mon Sep 17 00:00:00 2001 From: Sasindu Alahakoon Date: Sun, 27 Jul 2025 21:06:21 +0530 Subject: [PATCH 194/349] Add command parameter to the chat stop interface --- .../ballerina/ballerina-core/src/state-machine-types.ts | 2 ++ .../ballerina-extension/src/features/ai/service/code/code.ts | 4 ++-- .../src/features/ai/service/healthcare/healthcare.ts | 2 +- .../src/features/ai/service/openapi/openapi.ts | 2 +- .../src/features/ai/service/test/function_tests.ts | 2 +- .../src/features/ai/service/test/test_plan.ts | 2 +- 6 files changed, 8 insertions(+), 6 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index 65766a02734..4a329063405 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -18,6 +18,7 @@ import { NotificationType, RequestType } from "vscode-messenger-common"; import { NodePosition, STNode } from "@wso2/syntax-tree"; +import { Command } from "./interfaces/ai-panel"; import { LinePosition } from "./interfaces/common"; import { Type } from "./interfaces/extended-lang-client"; import { CodeData, DIRECTORY_MAP, ProjectStructureArtifactResponse, ProjectStructureResponse } from "./interfaces/bi"; @@ -207,6 +208,7 @@ export interface CodeMessages { export interface ChatStop { type: "stop"; + command: Command | undefined; } export interface ChatError { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts index 9b5cfa23d90..73d399641a0 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/code.ts @@ -138,7 +138,7 @@ export async function generateCodeCore(params: GenerateCodeRequest, eventHandler eventHandler({ type: "content_replace", content: diagnosticFixResp }); eventHandler({ type: "diagnostics", diagnostics: diagnostics }); eventHandler({ type: "messages", messages: allMessages }); - eventHandler({ type: "stop" }); + eventHandler({ type: "stop", command: Command.Code }); break; } } @@ -311,7 +311,7 @@ export async function repairCodeCore(params: RepairParams, eventHandler: Copilot eventHandler({ type: "content_replace", content: resp.repairResponse }); console.log("Manual Repair Diagnostics left: ", resp.diagnostics); eventHandler({ type: "diagnostics", diagnostics: resp.diagnostics }); - eventHandler({ type: "stop" }); + eventHandler({ type: "stop", command: undefined }); return resp; } 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 index 56db60f5aca..df736b7f877 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts @@ -111,7 +111,7 @@ export async function generateHealthcareCodeCore( // Already handled in error case. break; } - eventHandler({ type: "stop" }); + eventHandler({ type: "stop", command: Command.Healthcare }); break; } } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts index 71fc34927ce..6f6cf2cb37c 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts @@ -66,7 +66,7 @@ export async function generateOpenAPISpecCore( } case "finish": { const finishReason = part.finishReason; - eventHandler({ type: "stop" }); + eventHandler({ type: "stop", command: Command.OpenAPI }); break; } } 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 index 15f459518d3..f163a14c390 100644 --- 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 @@ -103,7 +103,7 @@ export async function generateFunctionTestsCore( }); } - eventHandler({ type: "stop" }); + eventHandler({ type: "stop", command: Command.Tests }); } // Main public function that uses the default event handler 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 index 31cdeb0663e..ff65265998a 100644 --- 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 @@ -210,7 +210,7 @@ export async function generateTestPlanCore( content: `\n\n\n\`\`\`ballerina\n${testConfig}\n\`\`\`\n`, }); } - eventHandler({ type: "stop" }); + eventHandler({ type: "stop", command: Command.Tests }); } else { eventHandler({ type: "content_block", From 8417559a5d281c155c0ee8548c3b5e1758612425 Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Sun, 27 Jul 2025 22:29:53 +0530 Subject: [PATCH 195/349] Add graphql e2e tests --- .../src/components/Panel/index.tsx | 2 +- .../src/components/editors/TypeEditor.tsx | 2 +- .../GraphQLDiagram/GraphqlServiceEditor.tsx | 7 +- .../GraphQLDiagram/OperationAccordian.tsx | 4 +- .../src/views/GraphQLDiagram/index.tsx | 1 + .../EntityNode/EntityWidget.tsx | 2 +- .../api-services/graphql-service.spec.ts | 85 +++++++++++- .../api-services/graphqlUtils.ts | 129 ++++++++++++++++++ 8 files changed, 224 insertions(+), 8 deletions(-) create mode 100644 workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/Panel/index.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/Panel/index.tsx index c4305c89af8..0246bb2b866 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Panel/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Panel/index.tsx @@ -71,7 +71,7 @@ export function PanelContainer(props: PanelContainerProps) { )} {title} - + diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/TypeEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/TypeEditor.tsx index b7fd609fe6b..2a8091460e4 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/TypeEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/TypeEditor.tsx @@ -79,7 +79,7 @@ const EditorRibbon = ({ onClick }: { onClick: () => void }) => { const getDefaultCompletion = (newType: string) => { return ( - + Add Type: {newType} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/GraphqlServiceEditor.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/GraphqlServiceEditor.tsx index bf66d5907f0..621a1a13f15 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/GraphqlServiceEditor.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/GraphqlServiceEditor.tsx @@ -448,13 +448,14 @@ export function GraphqlServiceEditor(props: GraphqlServiceEditorProps) { Query - {categories.query?.map((operation, index) => ( @@ -488,6 +490,7 @@ export function GraphqlServiceEditor(props: GraphqlServiceEditorProps) { {categories.mutation?.map((operation, index) => ( @@ -519,6 +523,7 @@ export function GraphqlServiceEditor(props: GraphqlServiceEditorProps) { {categories.subscription?.map((operation, index) => ( {onEditFunction! && ( - + )} {onDeleteFunction! && ( - + )} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/index.tsx index 4254e9428e1..5d62a093317 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/index.tsx @@ -265,6 +265,7 @@ export function GraphQLDiagram(props: GraphQLDiagramProps) { {isServiceEditorOpen && ( - + Create Operations diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts index 7a16af4f38d..3758d630701 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts @@ -19,6 +19,8 @@ import { test } from '@playwright/test'; import { addArtifact, initTest, page } from '../utils'; import { Form, switchToIFrame } from '@wso2/playwright-vscode-tester'; import { ProjectExplorer } from '../ProjectExplorer'; +import { addGraphQLOperation, clickButtonByTestId, TEST_DATA, addArgumentToGraphQLService, addOutputObject, createInputObjectFromScratch } from './graphqlUtils'; + export default function createTests() { test.describe('GraphQL Service Tests', { @@ -34,7 +36,7 @@ export default function createTests() { if (!artifactWebView) { throw new Error('WSO2 Integrator: BI webview not found'); } - const sampleName = `/sample${testAttempt}`; + const sampleName = TEST_DATA.service.basePath(testAttempt); const form = new Form(page.page, 'WSO2 Integrator: BI', artifactWebView); await form.switchToFormView(false, artifactWebView); await form.fill({ @@ -77,7 +79,7 @@ export default function createTests() { await editBtn.click({ force: true }); const form = new Form(page.page, 'WSO2 Integrator: BI', artifactWebView); await form.switchToFormView(false, artifactWebView); - const sampleName = `/editedSample${testAttempt}`; + const sampleName = TEST_DATA.service.editedBasePath(testAttempt); await form.fill({ values: { 'Service Base Path*': { @@ -96,5 +98,84 @@ export default function createTests() { const context = artifactWebView.locator(`text=${sampleName}`).first(); await context.waitFor(); }); + + test('Create Operations in GraphQL Service', async ({ }, testInfo) => { + const testAttempt = testInfo.retry + 1; + console.log('Creating operations in test attempt: ', testAttempt); + const artifactWebView = await switchToIFrame('WSO2 Integrator: BI', page.page); + if (!artifactWebView) { + throw new Error('WSO2 Integrator: BI webview not found'); + } + + + await clickButtonByTestId(artifactWebView, 'create-operation-button'); + await addGraphQLOperation(artifactWebView, 'query', TEST_DATA.operations.query.name, TEST_DATA.operations.query.fieldType); + await addGraphQLOperation(artifactWebView, 'mutation', TEST_DATA.operations.mutation.name, TEST_DATA.operations.mutation.fieldType); + await addGraphQLOperation(artifactWebView, 'subscription', TEST_DATA.operations.subscription.name, TEST_DATA.operations.subscription.fieldType); + await clickButtonByTestId(artifactWebView, 'close-panel-btn'); + + }); + + test('Add types and arguments to GraphQL Service', async ({ }, testInfo) => { + const testAttempt = testInfo.retry + 1; + console.log('Adding types and arguments in test attempt: ', testAttempt); + const artifactWebView = await switchToIFrame('WSO2 Integrator: BI', page.page); + if (!artifactWebView) { + throw new Error('WSO2 Integrator: BI webview not found'); + } + + await clickButtonByTestId(artifactWebView, 'graphql-add-mutation-btn'); + await addArgumentToGraphQLService(artifactWebView); + await createInputObjectFromScratch(artifactWebView); + await addOutputObject(artifactWebView); + + await artifactWebView.getByRole('textbox', { name: 'Field Name*The name of the' }).fill(TEST_DATA.field.name); + await artifactWebView.waitForTimeout(5000); // Wait for the field name to be set + const saveButton = artifactWebView.getByRole('button', { name: 'Save' }); + await saveButton.click(); + + // if the the button is not showing saving then again click on the save button + while (await saveButton.isVisible()) { + await saveButton.click(); + } + }); + + test('Edit and Delete Operations in GraphQL Service', async ({ }, testInfo) => { + const testAttempt = testInfo.retry + 1; + console.log('Adding types and arguments in test attempt: ', testAttempt); + const artifactWebView = await switchToIFrame('WSO2 Integrator: BI', page.page); + if (!artifactWebView) { + throw new Error('WSO2 Integrator: BI webview not found'); + } + + const saveButton = artifactWebView.getByRole('button', { name: 'Save' }); + const editButton = await artifactWebView.getByTestId('edit-icon').nth(1); + await editButton.click(); + + // Fill mutation name + const mutationNameInput = artifactWebView.getByRole('textbox', { name: 'Mutation Name*The name of the mutation' }); + await mutationNameInput.waitFor({ state: 'visible', timeout: 10000 }); + await mutationNameInput.fill(TEST_DATA.mutationEdit.name); + + // Click Save + await saveButton.waitFor({ state: 'visible', timeout: 10000 }); + await saveButton.click(); + }); + + test('Navigate to respective flow diagram', async ({ }, testInfo) => { + const artifactWebView = await switchToIFrame('WSO2 Integrator: BI', page.page); + if (!artifactWebView) { + throw new Error('WSO2 Integrator: BI webview not found'); + } + + const saveButton = artifactWebView.getByRole('button', { name: 'Save' }); + + await artifactWebView.getByTestId('side-panel').getByText(TEST_DATA.field.name).click(); + await artifactWebView.getByTestId('link-add-button-undefined').click(); + await artifactWebView.getByText('Return').click(); + await artifactWebView.getByRole('textbox', { name: 'Expression' }).fill(TEST_DATA.expression); + await saveButton.click(); + await artifactWebView.getByText('GraphQL Diagram').click(); }); +}); } diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts new file mode 100644 index 00000000000..fd7406a239a --- /dev/null +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts @@ -0,0 +1,129 @@ +/** + * GraphQL Webview UI helpers for Playwright E2E tests + * All helpers are designed to be reusable and composable for GraphQL service flows. + */ +import { page } from '../utils'; + + +// Centralized test data for all GraphQL service E2E tests +export const TEST_DATA = { + service: { + basePath: (attempt: number) => `/sample${attempt}`, + editedBasePath: (attempt: number) => `/editedSample${attempt}`, + }, + operations: { + query: { + name: 'query1', + fieldType: 'string', + }, + mutation: { + name: 'mutation1', + fieldType: 'boolean', + }, + subscription: { + name: 'subscription1', + fieldType: 'float', + }, + }, + arguments: [ + { name: 'arg1', type: 'string' }, + { name: 'arg2', type: 'mytype1' }, + ], + types: { + inputObject: 'mytype1', + outputObject: 'outputtype1', + }, + field: { + name: 'field1', + }, + mutationEdit: { + name: 'mutation2', + }, + expression: '"Hello World!"', +}; + +/** + * Utility to add a GraphQL operation (mutation, subscription, etc.) + * @param artifactWebView - The Playwright frame/locator for the webview + * @param operationType - 'mutation' | 'subscription' | 'query' + * @param name - The name to use for the operation + * @param fieldType - The type to use for the field (e.g., 'boolean', 'float', etc.) + */ +export async function addGraphQLOperation(artifactWebView, operationType, name, fieldType) { + const addBtnTestId = `graphql-add-${operationType}-btn`; + await artifactWebView.getByTestId(addBtnTestId).waitFor({ state: 'visible', timeout: 10000 }); + const addBtn = artifactWebView.getByTestId(addBtnTestId); + await addBtn.click(); + + const fieldNameBox = artifactWebView.getByRole('textbox', { name: /Field Name/i }); + await fieldNameBox.waitFor({ state: 'visible', timeout: 10000 }); + await fieldNameBox.fill(name); + + const fieldTypeBox = artifactWebView.getByRole('textbox', { name: /Field Type/i }); + await fieldTypeBox.waitFor({ state: 'visible', timeout: 10000 }); + // await fieldTypeBox.click(); + await fieldTypeBox.fill(fieldType); + + // Wait a short moment to allow UI to register the value + await page.page.waitForTimeout(5000); + const fieldDefaultCompletion = artifactWebView.getByTestId('add-type-completion'); + await fieldDefaultCompletion.waitFor({ state: 'visible', timeout: 10000 }); + + if (fieldDefaultCompletion.isVisible()) { + await fieldTypeBox.press('Escape'); + } + + const saveBtn = artifactWebView.getByRole('button', { name: /Save/i }); + await saveBtn.waitFor({ state: 'visible', timeout: 10000 }); + await saveBtn.click(); +} + +/** + * Click a button in the artifact webview by test id + * @param artifactWebView - The Playwright frame/locator for the webview + * @param testId - The test id of the button to click + */ +export async function clickButtonByTestId(artifactWebView, testId: string) { + const button = artifactWebView.getByTestId(testId); + await button.waitFor({ state: 'visible', timeout: 10000 }); + await button.click(); +} + + +export async function addOutputObject(artifactWebView) { + const createFromScratchTab = artifactWebView.getByTestId('create-from-scratch-tab'); + await artifactWebView.getByRole('textbox', { name: 'Field Type' }).click(); + await artifactWebView.getByText('Create New Type').click(); + await artifactWebView.getByTestId('type-kind-dropdown').locator('svg').click(); + await artifactWebView.getByRole('option', { name: 'Object' }).click(); + await createFromScratchTab.getByRole('textbox', { name: 'Name' }).fill(TEST_DATA.types.outputObject); + await artifactWebView.getByTestId('type-create-save').getByRole('button', { name: 'Save' }).click(); +} + +export async function createInputObjectFromScratch(artifactWebView) { + await artifactWebView.getByText('Add Argument').click(); + await artifactWebView.getByRole('textbox', { name: 'Argument Type' }).click(); + await artifactWebView.getByText('Create New Type').click(); + await artifactWebView.locator('slot', { hasText: /^Input Object$/ }).click(); + await artifactWebView.getByRole('option', { name: 'Input Object' }).click(); + + // Fill name for the new input object type + const createFromScratchTab = artifactWebView.getByTestId('create-from-scratch-tab'); + await createFromScratchTab.getByRole('textbox', { name: 'Name' }).fill(TEST_DATA.types.inputObject); + await artifactWebView.getByTestId('type-create-save').getByRole('button', { name: 'Save' }).click(); + await artifactWebView.getByRole('textbox', { name: 'Argument Name*The name of the' }).fill(TEST_DATA.arguments[1].name); + await artifactWebView.getByRole('button', { name: 'Add' }).click(); +} + +export async function addArgumentToGraphQLService(artifactWebView) { + await artifactWebView.getByText('Add Argument').click(); + await artifactWebView.getByRole('textbox', { name: 'Argument Type' }).click(); + await artifactWebView.getByTitle('string', { exact: true }).click(); + await artifactWebView.getByRole('textbox', { name: 'Argument Name*The name of the' }).fill(TEST_DATA.arguments[0].name); + await artifactWebView.getByRole('button', { name: 'Add' }).click(); +} + + + + + \ No newline at end of file From f45b844457ba82b62dc4d47c323ec3dae4a27344 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Sun, 27 Jul 2025 23:17:45 +0530 Subject: [PATCH 196/349] Refactor: move changes to custom dropdown component, keep original reusable component --- .../editors/CustomDropdownEditor.tsx | 171 ++++++++++++++++++ .../src/components/editors/DropdownEditor.tsx | 115 +----------- .../src/components/editors/EditorFactory.tsx | 13 +- 3 files changed, 188 insertions(+), 111 deletions(-) create mode 100644 workspaces/ballerina/ballerina-side-panel/src/components/editors/CustomDropdownEditor.tsx diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/CustomDropdownEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/CustomDropdownEditor.tsx new file mode 100644 index 00000000000..173442a7548 --- /dev/null +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/CustomDropdownEditor.tsx @@ -0,0 +1,171 @@ +/** + * 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. + */ + +// TODO: this component should be refactored to be more generic and reusable for other forms. +// so, created new custom dropdown editor for this purpose and keep previous one for other forms. +// update the editor factory to use this component for enum and single select fields. + +import React, { useEffect, useState } from "react"; +import styled from "@emotion/styled"; + +import { Dropdown } from "@wso2/ui-toolkit"; + +import { FormField } from "../Form/types"; +import { capitalize, getValueForDropdown } from "./utils"; +import { useFormContext } from "../../context"; +import { SubPanel, SubPanelView } from "@wso2/ballerina-core"; +import { McpToolsSelection } from "./McpToolsSelection"; + +interface CustomDropdownEditorProps { + field: FormField; + openSubPanel?: (subPanel: SubPanel) => void; + // Additional props for MCP tools functionality + serviceUrl?: string; + configs?: object; + rpcClient?: any; + onToolsChange?: (selectedTools: string[]) => void; + renderToolsSelection?: () => React.ReactNode; + newServerUrl?: string; + mcpTools?: { name: string; description?: string }[]; +} + +const DropdownStack = styled.div` + display: flex; + flex-direction: column; + width: 100%; +`; + +const DropdownSpacer = styled.div` + height: 5px; +`; + +export function CustomDropdownEditor(props: CustomDropdownEditorProps) { + const { field, openSubPanel, newServerUrl } = props; + const { form } = useFormContext(); + const { register, setValue, watch } = form; + const [mcpTools, setMcpTools] = useState<{ name: string; description?: string }[]>(props.mcpTools || []); + + // Sync mcpTools state with props.mcpTools + useEffect(() => { + if (props.mcpTools) { + setMcpTools(props.mcpTools); + } + }, [props.mcpTools]); + const [selectedMcpTools, setSelectedMcpTools] = useState>(new Set()); + const [loadingMcpTools, setLoadingMcpTools] = useState(false); + const [mcpToolsError, setMcpToolsError] = useState(""); + const toolSelection = watch(field.key); + const [localServiceUrl, setLocalServiceUrl] = useState(""); + + useEffect(() => { + if (newServerUrl && newServerUrl !== localServiceUrl) { + setLocalServiceUrl(newServerUrl); + console.log(">>> New server URL set:", newServerUrl); + } + }, [newServerUrl]); + + const handleToolSelectionChange = (toolName: string, isSelected: boolean) => { + const newSelectedTools = new Set(selectedMcpTools); + if (isSelected) { + newSelectedTools.add(toolName); + } else { + newSelectedTools.delete(toolName); + } + setSelectedMcpTools(newSelectedTools); + // Call the callback with the updated selection + props.onToolsChange?.(Array.from(newSelectedTools)); + }; + + const handleSelectAllTools = () => { + let newSelectedTools: Set; + if (selectedMcpTools.size === mcpTools.length) { + newSelectedTools = new Set(); + } else { + newSelectedTools = new Set(mcpTools.map(tool => tool.name)); + } + setSelectedMcpTools(newSelectedTools); + // Call the callback with the updated selection + props.onToolsChange?.(Array.from(newSelectedTools)); + }; + + // Call onToolsChange whenever selectedMcpTools changes + useEffect(() => { + props.onToolsChange?.(Array.from(selectedMcpTools)); + }, [selectedMcpTools]); + + const showScopeControls = field.key === "toolsToInclude"; + + // HACK: create values for Scope field + if (field.key === "scope") { + field.items = ["Global", "Local"]; + } + + if (showScopeControls) { + return ( + + ({ id: item, content: item, value: item }))} + required={!field.optional} + disabled={!field.editable} + onChange={(e) => { + setValue(field.key, e.target.value); + field.onValueChange?.(e.target.value); + }} + sx={{ width: "100%" }} + containerSx={{ width: "100%" }} + addNewBtnClick={field.addNewButton ? () => openSubPanel({ view: SubPanelView.ADD_NEW_FORM }) : undefined} + /> + + {toolSelection === "Selected" && ( + + )} + + ); + } + + return ( + ({ id: item, content: item, value: item }))} + required={!field.optional} + disabled={!field.editable} + onChange={(e) => { + setValue(field.key, e.target.value); + field.onValueChange?.(e.target.value); + }} + sx={{ width: "100%" }} + containerSx={{ width: "100%" }} + addNewBtnClick={field.addNewButton ? () => openSubPanel({ view: SubPanelView.ADD_NEW_FORM }) : undefined} + /> + ); +} diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx index e7db6f00d1d..53141e52b04 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/DropdownEditor.tsx @@ -16,136 +16,37 @@ * under the License. */ -import React, { useEffect, useState, useRef } from "react"; -import styled from "@emotion/styled"; +import React, { useEffect } from "react"; -import { Dropdown, Button, CheckBox, ThemeColors, TextField } from "@wso2/ui-toolkit"; +import { Dropdown } from "@wso2/ui-toolkit"; import { FormField } from "../Form/types"; import { capitalize, getValueForDropdown } from "./utils"; import { useFormContext } from "../../context"; import { SubPanel, SubPanelView } from "@wso2/ballerina-core"; -import { McpToolsSelection, McpTool } from "./McpToolsSelection"; interface DropdownEditorProps { field: FormField; openSubPanel?: (subPanel: SubPanel) => void; - // Additional props for MCP tools functionality - serviceUrl?: string; - configs?: object; - rpcClient?: any; - onToolsChange?: (selectedTools: string[]) => void; - renderToolsSelection?: () => React.ReactNode; - newServerUrl?: string; - mcpTools?: { name: string; description?: string }[]; // <-- add this line } -const DropdownStack = styled.div` - display: flex; - flex-direction: column; - width: 100%; -`; - -const DropdownSpacer = styled.div` - height: 5px; -`; - export function DropdownEditor(props: DropdownEditorProps) { - const { field, openSubPanel, serviceUrl, configs, rpcClient, onToolsChange, newServerUrl } = props; + const { field, openSubPanel } = props; const { form } = useFormContext(); - const { register, setValue, watch } = form; - const [mcpTools, setMcpTools] = useState<{ name: string; description?: string }[]>(props.mcpTools || []); + const { register, setValue } = form; - // Sync mcpTools state with props.mcpTools useEffect(() => { - if (props.mcpTools) { - setMcpTools(props.mcpTools); - } - }, [props.mcpTools]); - const [selectedMcpTools, setSelectedMcpTools] = useState>(new Set()); - const [loadingMcpTools, setLoadingMcpTools] = useState(false); - const [mcpToolsError, setMcpToolsError] = useState(""); - const toolSelection = watch(field.key); - const [localServiceUrl, setLocalServiceUrl] = useState(""); - - useEffect(() => { - if (newServerUrl && newServerUrl !== localServiceUrl) { - setLocalServiceUrl(newServerUrl); - console.log(">>> New server URL set:", newServerUrl); - } - }, [newServerUrl]); - - const handleToolSelectionChange = (toolName: string, isSelected: boolean) => { - const newSelectedTools = new Set(selectedMcpTools); - if (isSelected) { - newSelectedTools.add(toolName); - } else { - newSelectedTools.delete(toolName); + // if field.key is "modelType" and value is not set and default value set. then setValue to default value initially + if (field.key === "modelType" && field.value === undefined && (field.defaultValue || field.placeholder)) { + setValue(field.key, field.defaultValue || field.placeholder); } - setSelectedMcpTools(newSelectedTools); - // Call the callback with the updated selection - props.onToolsChange?.(Array.from(newSelectedTools)); - }; - - const handleSelectAllTools = () => { - let newSelectedTools: Set; - if (selectedMcpTools.size === mcpTools.length) { - newSelectedTools = new Set(); - } else { - newSelectedTools = new Set(mcpTools.map(tool => tool.name)); - } - setSelectedMcpTools(newSelectedTools); - // Call the callback with the updated selection - props.onToolsChange?.(Array.from(newSelectedTools)); - }; - - // Call onToolsChange whenever selectedMcpTools changes - useEffect(() => { - props.onToolsChange?.(Array.from(selectedMcpTools)); - }, [selectedMcpTools]); - - const showScopeControls = field.key === "toolsToInclude"; + }, [field.defaultValue, field.placeholder]); // HACK: create values for Scope field if (field.key === "scope") { field.items = ["Global", "Local"]; } - if (showScopeControls) { - return ( - - ({ id: item, content: item, value: item }))} - required={!field.optional} - disabled={!field.editable} - onChange={(e) => { - setValue(field.key, e.target.value); - field.onValueChange?.(e.target.value); - }} - sx={{ width: "100%" }} - containerSx={{ width: "100%" }} - addNewBtnClick={field.addNewButton ? () => openSubPanel({ view: SubPanelView.ADD_NEW_FORM }) : undefined} - /> - - {toolSelection === "Selected" && ( - - )} - - ); - } - 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" && props.mcpTools) { + // TODO: this is a temporary solution to handle the enum field with MCP tools. + return ; } else if (field.type.toUpperCase() === "ENUM") { // Enum is a dropdown field - return ; + return ; } else if (field.type === "FILE_SELECT" && field.editable) { return ; + } else if (field.type === "SINGLE_SELECT" && field.editable && props.mcpTools) { + // TODO: this is a temporary solution to handle the single select field with MCP tools. + return ; } else if (field.type === "SINGLE_SELECT" && field.editable) { - // HACK:Single select field is treat as type editor for now - console.log(">>> Single select field is treated as type editor", field); - return ; + return ; } else if (!field.items && (field.key === "type" || field.type === "TYPE") && field.editable) { // Type field is a type editor return ( From ba34ebfc829b9a52d04839d7ce8d3948316cc271 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Sun, 27 Jul 2025 23:51:50 +0530 Subject: [PATCH 197/349] Enhance error handling in writeBallerinaFileDidOpen function and improve location assignment in updateView function --- workspaces/ballerina/ballerina-extension/src/stateMachine.ts | 2 +- .../ballerina/ballerina-extension/src/utils/modification.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts index e8f60f65f77..37fe9b3494d 100644 --- a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts +++ b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts @@ -506,7 +506,7 @@ export function updateView(refreshTreeView?: boolean) { lastView = getLastHistory(); // Get the new last entry } - let newLocation: VisualizerLocation; + let newLocation: VisualizerLocation = lastView?.location; if (lastView && lastView.location?.artifactType && lastView.location?.identifier) { newLocation = { ...lastView.location }; const currentIdentifier = lastView.location?.identifier; diff --git a/workspaces/ballerina/ballerina-extension/src/utils/modification.ts b/workspaces/ballerina/ballerina-extension/src/utils/modification.ts index e82bc4ac952..8b44c9a135e 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/modification.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/modification.ts @@ -96,6 +96,7 @@ export async function writeBallerinaFileDidOpen(filePath: string, content: strin // Set a timeout to reject if no notification is received within 10 seconds const timeoutId = setTimeout(() => { console.log("No artifact update notification received within 10 seconds"); + reject(new Error("Operation timed out. Please try again.")); unsubscribe(); }, 10000); From 958f5500f1c55787ce50c33b34ec3dee8ad04f7f Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Mon, 28 Jul 2025 01:41:51 +0530 Subject: [PATCH 198/349] Add Vector Knowledge Base Form and integrate with existing forms --- .../ballerina-core/src/interfaces/bi.ts | 2 + .../src/components/Form/index.tsx | 22 +- .../views/BI/Forms/FormGenerator/index.tsx | 21 + .../Forms/VectorKnowledgeBaseForm/index.tsx | 695 ++++++++++++++++++ 4 files changed, 735 insertions(+), 5 deletions(-) create mode 100644 workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/VectorKnowledgeBaseForm/index.tsx diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts index 015204bcdc1..9c1c2db2be4 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts @@ -339,6 +339,8 @@ export type NodePropertyKey = | "typeDescription" | "variable" | "verbose" + | "vectorStore" + | "embeddingModel" | "view"; export type BranchKind = "block" | "worker"; 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 4191927a15c..a2518f3fa69 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx @@ -42,7 +42,6 @@ import { SubPanelView, FormDiagnostics, FlowNode, - LinePosition, ExpressionProperty, RecordTypeField, VisualizableField, @@ -344,12 +343,14 @@ export interface FormProps { scopeFieldAddon?: React.ReactNode; newServerUrl?: string; onChange?: (fieldKey: string, value: any, allValues: FormValues) => void; - mcpTools?: { name: string; description?: string }[]; + mcpTools?: { name: string; description?: string }[]; onToolsChange?: (selectedTools: string[]) => void; injectedComponents?: { component: React.ReactNode; index: number; }[]; + hideSaveButton?: boolean; // Option to hide the save button + onValidityChange?: (isValid: boolean) => void; // Callback for form validity status } export const Form = forwardRef((props: FormProps, ref) => { @@ -388,6 +389,8 @@ export const Form = forwardRef((props: FormProps, ref) => { mcpTools, onToolsChange, injectedComponents, + hideSaveButton = false, + onValidityChange, } = props; const { @@ -656,6 +659,15 @@ export const Form = forwardRef((props: FormProps, ref) => { return hasDiagnostics; }, [diagnosticsInfo]); + // Call onValidityChange when form validity changes + useEffect(() => { + if (onValidityChange) { + const formIsValid = isValid && !isValidating && Object.keys(errors).length === 0 && + (!concertMessage || !concertRequired || isUserConcert) && !isIdentifierEditing && !isSubComponentEnabled; + onValidityChange(formIsValid); + } + }, [isValid, isValidating, errors, concertMessage, concertRequired, isUserConcert, isIdentifierEditing, isSubComponentEnabled, onValidityChange]); + const handleIdentifierEditingStateChange = (isEditing: boolean) => { setIsIdentifierEditing(isEditing); }; @@ -710,7 +722,7 @@ export const Form = forwardRef((props: FormProps, ref) => { {actionButton && {actionButton}} - {infoLabel && ( + {infoLabel && !compact && ( {stripHtmlTags(infoLabel)} @@ -732,7 +744,7 @@ export const Form = forwardRef((props: FormProps, ref) => { )} )} - {!preserveOrder && ( + {!preserveOrder && !compact && ( )} @@ -911,7 +923,7 @@ export const Form = forwardRef((props: FormProps, ref) => { )} - {onSubmit && ( + {onSubmit && !hideSaveButton && ( {onCancelForm && ( + + + ); +} + +export default VectorKnowledgeBaseForm; From 9b24c8b241ba7079ff03461394bef857501a126b Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Mon, 28 Jul 2025 03:15:05 +0530 Subject: [PATCH 199/349] Enhance VectorKnowledgeBase form with edit mode functionality --- .../Forms/VectorKnowledgeBaseForm/index.tsx | 370 +++++++++++++++--- 1 file changed, 317 insertions(+), 53 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/VectorKnowledgeBaseForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/VectorKnowledgeBaseForm/index.tsx index 2fb98a688b0..efd3dd9ed4d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/VectorKnowledgeBaseForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/VectorKnowledgeBaseForm/index.tsx @@ -16,21 +16,18 @@ * under the License. */ -import React, { useCallback, useEffect, useMemo, useRef, useState } from "react"; -import { useForm } from "react-hook-form"; +import { useEffect, useMemo, useRef, useState } from "react"; import { Button, Dropdown, - FormExpressionEditorRef, OptionProps, - ProgressIndicator, ProgressRing, ThemeColors, Typography, } from "@wso2/ui-toolkit"; import styled from "@emotion/styled"; -import { FlowNode, LineRange, SubPanel, SubPanelView, NodePosition } from "@wso2/ballerina-core"; +import { FlowNode, LineRange, SubPanel, SubPanelView } from "@wso2/ballerina-core"; import { FormValues, ExpressionFormField, @@ -39,7 +36,6 @@ import { FormField, FormImports, } from "@wso2/ballerina-side-panel"; -import { FormStyles } from "../styles"; import { convertNodePropertiesToFormFields, getFormProperties, getImportsForFormFields } from "../../../../utils/bi"; import { cloneDeep } from "lodash"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; @@ -140,11 +136,6 @@ interface VectorKnowledgeBaseFormProps { submitText?: string; } -interface SelectedComponents { - vectorStore?: FlowNode; - embeddingProvider?: FlowNode; -} - interface ComponentData { [key: string]: FlowNode; } @@ -168,7 +159,7 @@ export function VectorKnowledgeBaseForm(props: VectorKnowledgeBaseFormProps) { const { rpcClient } = useRpcContext(); const [vectorStoreOptions, setVectorStoreOptions] = useState([]); const [embeddingProviderOptions, setEmbeddingProviderOptions] = useState([]); - const [selectedComponents, setSelectedComponents] = useState({}); + const [vectorStoreFields, setVectorStoreFields] = useState([]); const [embeddingProviderFields, setEmbeddingProviderFields] = useState([]); const [knowledgeBaseFields, setKnowledgeBaseFields] = useState([]); @@ -183,14 +174,38 @@ export function VectorKnowledgeBaseForm(props: VectorKnowledgeBaseFormProps) { const [vectorStoreFormValues, setVectorStoreFormValues] = useState({}); const [embeddingProviderFormValues, setEmbeddingProviderFormValues] = useState({}); const [knowledgeBaseFormValues, setKnowledgeBaseFormValues] = useState({}); + const [isEditForm, setIsEditForm] = useState(false); + const [selectedVectorStoreOption, setSelectedVectorStoreOption] = useState(""); + const [selectedEmbeddingProviderOption, setSelectedEmbeddingProviderOption] = useState(""); + const [saving, setSaving] = useState(false); - const formRef = useRef(null); const vectorStoreTemplateRef = useRef(null); const embeddingProviderTemplateRef = useRef(null); + const vectorStoreLineRange = useRef(null); + const embeddingProviderLineRange = useRef(null); useEffect(() => { - initializeForm(); - fetchAvailableComponents(); + // Check if this is an edit form + const formProperties = getFormProperties(node); + const vectorStoreValue = formProperties.vectorStore?.value as string; + const embeddingModelValue = formProperties.embeddingModel?.value as string; + + const isEdit = !!(vectorStoreValue && embeddingModelValue); + setIsEditForm(isEdit); + + console.log(">>> Form mode detected", { + isEdit, + vectorStoreValue, + embeddingModelValue, + formProperties, + }); + + if (isEdit) { + editFormInit(); + } else { + initializeForm(); + fetchAvailableComponents(); + } handleFormOpen(); return () => { @@ -233,6 +248,141 @@ export function VectorKnowledgeBaseForm(props: VectorKnowledgeBaseFormProps) { setFormImports(getImportsForFormFields(fields)); }; + const editFormInit = async () => { + try { + // Get the current vector store and embedding model values + const formProperties = getFormProperties(node); + const vectorStoreValue = formProperties.vectorStore?.value; + const embeddingModelValue = formProperties.embeddingModel?.value; + + console.log(">>> Edit form init", { vectorStoreValue, embeddingModelValue }); + + // Fetch module nodes to find existing components + const moduleNodesResponse = await rpcClient.getBIDiagramRpcClient().getModuleNodes(); + + console.log(">>> Module nodes fetched", { moduleNodesResponse }); + + // Find the vector store and embedding provider nodes + let vectorStoreNode: FlowNode | null = null; + let embeddingProviderNode: FlowNode | null = null; + + // Search through module nodes to find matching variable names + moduleNodesResponse.flowModel.connections.forEach((moduleNode) => { + const moduleNodeVariableValue = moduleNode.properties?.variable?.value; + const isStringValue = typeof moduleNodeVariableValue === "string"; + + if (isStringValue && moduleNodeVariableValue === vectorStoreValue) { + if ( + moduleNode.codedata.node === "VECTOR_STORE" || + moduleNode.codedata.object?.includes("VectorStore") + ) { + vectorStoreNode = moduleNode; + vectorStoreTemplateRef.current = moduleNode; + vectorStoreLineRange.current = moduleNode.codedata.lineRange; + setVectorStoreVariableName(vectorStoreValue as string); + console.log(">>> Found vector store node", { vectorStoreNode }); + } + } + + if (isStringValue && moduleNodeVariableValue === embeddingModelValue) { + if ( + moduleNode.codedata.node === "EMBEDDING_PROVIDER" || + moduleNode.codedata.object?.includes("EmbeddingProvider") || + moduleNode.codedata.symbol?.includes("EmbeddingProvider") + ) { + embeddingProviderNode = moduleNode; + embeddingProviderTemplateRef.current = moduleNode; + embeddingProviderLineRange.current = moduleNode.codedata.lineRange; + setEmbeddingProviderVariableName(embeddingModelValue as string); + console.log(">>> Found embedding provider node", { embeddingProviderNode }); + } + } + }); + + if (vectorStoreNode && embeddingProviderNode) { + // Process vector store fields + const vectorStoreFormProperties = getFormProperties(vectorStoreNode); + const vectorStoreProps = vectorStoreFormProperties as any; + if (vectorStoreProps.variable) { + vectorStoreProps.variable.hidden = true; + } + if (vectorStoreProps.type) { + vectorStoreProps.type.hidden = true; + } + const vectorStoreFields = convertNodePropertiesToFormFields(vectorStoreFormProperties); + setVectorStoreFields(vectorStoreFields); + + // Set existing vector store form values + const vectorStoreExistingValues: FormValues = {}; + Object.keys(vectorStoreNode.properties || {}).forEach((key) => { + if (key !== "variable" && key !== "type") { + vectorStoreExistingValues[key] = (vectorStoreNode.properties as any)[key].value; + } + }); + setVectorStoreFormValues(vectorStoreExistingValues); + + // Process embedding provider fields + const embeddingProviderFormProperties = getFormProperties(embeddingProviderNode); + const embeddingProviderProps = embeddingProviderFormProperties as any; + if (embeddingProviderProps.variable) { + embeddingProviderProps.variable.hidden = true; + } + if (embeddingProviderProps.type) { + embeddingProviderProps.type.hidden = true; + } + const embeddingProviderFields = convertNodePropertiesToFormFields(embeddingProviderFormProperties); + setEmbeddingProviderFields(embeddingProviderFields); + + // Set existing embedding provider form values + const embeddingProviderExistingValues: FormValues = {}; + Object.keys(embeddingProviderNode.properties || {}).forEach((key) => { + if (key !== "variable" && key !== "type") { + embeddingProviderExistingValues[key] = (embeddingProviderNode.properties as any)[key].value; + } + }); + setEmbeddingProviderFormValues(embeddingProviderExistingValues); + + console.log(">>> Edit form initialized", { + vectorStoreNode, + vectorStoreExistingValues, + vectorStoreFields, + embeddingProviderNode, + embeddingProviderFields, + embeddingProviderExistingValues, + }); + } + + // Initialize knowledge base fields (same as create mode) + const knowledgeBaseProps = formProperties as any; + if (knowledgeBaseProps.vectorStore) { + knowledgeBaseProps.vectorStore.hidden = true; + } + if (knowledgeBaseProps.embeddingModel) { + knowledgeBaseProps.embeddingModel.hidden = true; + } + const knowledgeBaseFields = convertNodePropertiesToFormFields(formProperties); + setKnowledgeBaseFields(knowledgeBaseFields); + setFormImports(getImportsForFormFields(knowledgeBaseFields)); + + // Set existing knowledge base form values + const knowledgeBaseExistingValues: FormValues = {}; + Object.keys(node.properties || {}).forEach((key) => { + if (key !== "vectorStore" && key !== "embeddingModel") { + knowledgeBaseExistingValues[key] = (node.properties as any)[key].value; + } + }); + setKnowledgeBaseFormValues(knowledgeBaseExistingValues); + + // load dropdown options and default selections + fetchAvailableComponentsInEditMode(vectorStoreNode, embeddingProviderNode); + + setIsInitialized(true); + } catch (error) { + console.error("Error initializing edit form:", error); + setIsInitialized(true); // Still set to prevent infinite loading + } + }; + const fetchAvailableComponents = async () => { try { // Fetch available vector stores @@ -339,17 +489,97 @@ export function VectorKnowledgeBaseForm(props: VectorKnowledgeBaseFormProps) { } }; + const fetchAvailableComponentsInEditMode = async (vectorStoreNode: FlowNode, embeddingProviderNode: FlowNode) => { + try { + // Fetch available vector stores + const vectorStoreResponse = await rpcClient.getBIDiagramRpcClient().search({ + position: { startLine: targetLineRange.startLine, endLine: targetLineRange.endLine }, + filePath: fileName, + queryMap: undefined, + searchKind: "VECTOR_STORE", + }); + + const vectorStoreOptions: OptionProps[] = []; + const vectorStoreDataMap: ComponentData = {}; + + vectorStoreResponse.categories?.forEach((category) => { + category.items?.forEach((item) => { + // Check if it's an AvailableNode (not a nested Category) + if ("codedata" in item && "enabled" in item) { + const flowNode = item as any; // AvailableNode extends FlowNode + vectorStoreOptions.push({ + id: item.metadata.label, + content: item.metadata.label, + value: item.metadata.label, + }); + vectorStoreDataMap[item.metadata.label] = flowNode; + if ( + flowNode.codedata.module === vectorStoreNode.codedata.module && + flowNode.codedata.org === vectorStoreNode.codedata.org + ) { + console.log(">>> Setting vector store dropdown selection:", item.metadata.label); + setSelectedVectorStoreOption(item.metadata.label); + } + } + }); + }); + + setVectorStoreOptions(vectorStoreOptions); + + // Fetch available embedding providers + const embeddingProviderResponse = await rpcClient.getBIDiagramRpcClient().search({ + position: { startLine: targetLineRange.startLine, endLine: targetLineRange.endLine }, + filePath: fileName, + queryMap: undefined, + searchKind: "EMBEDDING_PROVIDER", + }); + + const embeddingProviderOptions: OptionProps[] = []; + const embeddingProviderDataMap: ComponentData = {}; + + embeddingProviderResponse.categories?.forEach((category) => { + category.items?.forEach((item) => { + // Check if it's an AvailableNode (not a nested Category) + if ("codedata" in item && "enabled" in item) { + const flowNode = item as any; // AvailableNode extends FlowNode + embeddingProviderOptions.push({ + id: item.metadata.label, + content: item.metadata.label, + value: item.metadata.label, + }); + embeddingProviderDataMap[item.metadata.label] = flowNode; + if ( + flowNode.codedata.module === embeddingProviderNode.codedata.module && + flowNode.codedata.org === embeddingProviderNode.codedata.org + ) { + console.log(">>> Setting embedding provider dropdown selection:", item.metadata.label); + setSelectedEmbeddingProviderOption(item.metadata.label); + } + } + }); + }); + + setEmbeddingProviderOptions(embeddingProviderOptions); + const fullComponentDataMap = { ...vectorStoreDataMap, ...embeddingProviderDataMap }; + setComponentDataMap(fullComponentDataMap); + + console.log(">>> Available components loaded", { + vectorStoreOptions, + embeddingProviderOptions, + componentDataMap: fullComponentDataMap, + }); + } catch (error) { + console.error("Error fetching available components:", error); + } + }; + const handleVectorStoreSelect = async (value: string, dataMap?: ComponentData) => { const currentDataMap = dataMap || componentDataMap; const vectorStoreNode = currentDataMap[value]; console.log(">>> selected vector store", { value, vectorStoreNode, currentDataMap }); if (vectorStoreNode) { - setSelectedComponents((prev) => ({ ...prev, vectorStore: vectorStoreNode })); - - // Generate variable name for the vector store - const variableName = `${vectorStoreNode.codedata.object?.toLowerCase() || "vectorStore"}`; - setVectorStoreVariableName(variableName); - console.log(">>> vector store variable name:", variableName); + vectorStoreTemplateRef.current = vectorStoreNode; + setSelectedVectorStoreOption(value); // Get node template for the selected vector store to show its form try { @@ -360,6 +590,10 @@ export function VectorKnowledgeBaseForm(props: VectorKnowledgeBaseFormProps) { }); console.log(">>> vector store template", { template }); + const variableName = `${template.flowNode.properties.variable.value || "vectorStore"}`; + setVectorStoreVariableName(variableName); + console.log(">>> vector store variable name:", variableName); + // Store template for later use in submission vectorStoreTemplateRef.current = template.flowNode; @@ -387,12 +621,8 @@ export function VectorKnowledgeBaseForm(props: VectorKnowledgeBaseFormProps) { const embeddingProviderNode = currentDataMap[value]; console.log(">>> selected embedding provider", { value, embeddingProviderNode, currentDataMap }); if (embeddingProviderNode) { - setSelectedComponents((prev) => ({ ...prev, embeddingProvider: embeddingProviderNode })); - - // Generate variable name for the embedding provider - const variableName = `${embeddingProviderNode.codedata.object?.toLowerCase() || "embeddingProvider"}`; - setEmbeddingProviderVariableName(variableName); - console.log(">>> embedding provider variable name:", variableName); + embeddingProviderTemplateRef.current = embeddingProviderNode; + setSelectedEmbeddingProviderOption(value); // Get node template for the selected embedding provider to show its form try { @@ -403,6 +633,9 @@ export function VectorKnowledgeBaseForm(props: VectorKnowledgeBaseFormProps) { }); console.log(">>> embedding provider template", { template }); + const variableName = `${template.flowNode.properties.variable.value || "embeddingProvider"}`; + setEmbeddingProviderVariableName(variableName); + // Store template for later use in submission embeddingProviderTemplateRef.current = template.flowNode; @@ -461,7 +694,7 @@ export function VectorKnowledgeBaseForm(props: VectorKnowledgeBaseFormProps) { }; const handleSubmit = async () => { - if (!selectedComponents.vectorStore || !selectedComponents.embeddingProvider) { + if (!vectorStoreTemplateRef.current || !embeddingProviderTemplateRef.current) { console.error("Vector store and embedding provider must be selected"); return; } @@ -472,6 +705,7 @@ export function VectorKnowledgeBaseForm(props: VectorKnowledgeBaseFormProps) { } try { + setSaving(true); // Use stored templates instead of fetching again const vectorStoreTemplate = vectorStoreTemplateRef.current; const embeddingProviderTemplate = embeddingProviderTemplateRef.current; @@ -510,18 +744,51 @@ export function VectorKnowledgeBaseForm(props: VectorKnowledgeBaseFormProps) { embeddingProviderNode: embeddingProviderUpdatedNode, }); - // save the vector store and embedding provider nodes - const vectorStoreSourceCode = await rpcClient.getBIDiagramRpcClient().getSourceCode({ - filePath: fileName, - flowNode: vectorStoreUpdatedNode, - }); - console.log(">>> vector store source code", { vectorStoreSourceCode }); - const embeddingProviderSourceCode = await rpcClient.getBIDiagramRpcClient().getSourceCode({ - filePath: fileName, - flowNode: embeddingProviderUpdatedNode, - }); - console.log(">>> embedding provider source code", { embeddingProviderSourceCode }); - + if (isEditForm) { + if (!vectorStoreLineRange.current || !embeddingProviderLineRange.current) { + console.error("Vector store and embedding provider line range not found"); + return; + } + // new vector store node + const newVectorStoreNode = cloneDeep(vectorStoreUpdatedNode); + newVectorStoreNode.codedata.lineRange = { + fileName: vectorStoreLineRange.current.fileName, + startLine: vectorStoreLineRange.current.startLine, + endLine: vectorStoreLineRange.current.endLine, + }; + newVectorStoreNode.codedata.isNew = false; + const newEmbeddingProviderNode = cloneDeep(embeddingProviderUpdatedNode); + newEmbeddingProviderNode.codedata.lineRange = { + fileName: embeddingProviderLineRange.current.fileName, + startLine: embeddingProviderLineRange.current.startLine, + endLine: embeddingProviderLineRange.current.endLine, + }; + newEmbeddingProviderNode.codedata.isNew = false; + + // save the vector store and embedding provider nodes + const vectorStoreSourceCode = await rpcClient.getBIDiagramRpcClient().getSourceCode({ + filePath: fileName, + flowNode: newVectorStoreNode, + }); + console.log(">>> vector store source code updated", { newVectorStoreNode, vectorStoreSourceCode }); + const embeddingProviderSourceCode = await rpcClient.getBIDiagramRpcClient().getSourceCode({ + filePath: fileName, + flowNode: newEmbeddingProviderNode, + }); + console.log(">>> embedding provider source code updated", { newEmbeddingProviderNode, embeddingProviderSourceCode }); + } else { + // save the vector store and embedding provider nodes + const vectorStoreSourceCode = await rpcClient.getBIDiagramRpcClient().getSourceCode({ + filePath: fileName, + flowNode: vectorStoreUpdatedNode, + }); + console.log(">>> vector store source code", { vectorStoreSourceCode }); + const embeddingProviderSourceCode = await rpcClient.getBIDiagramRpcClient().getSourceCode({ + filePath: fileName, + flowNode: embeddingProviderUpdatedNode, + }); + console.log(">>> embedding provider source code", { embeddingProviderSourceCode }); + } // Create knowledge base node with form values and references const combinedKnowledgeBaseData = { ...knowledgeBaseFormValues, @@ -534,13 +801,15 @@ export function VectorKnowledgeBaseForm(props: VectorKnowledgeBaseFormProps) { onSubmit(knowledgeBaseNode, false, formImports); } catch (error) { console.error("Error creating vector knowledge base:", error); + } finally { + setSaving(false); } }; const isFormValid = useMemo(() => { return ( - selectedComponents.vectorStore && - selectedComponents.embeddingProvider && + vectorStoreTemplateRef.current && + embeddingProviderTemplateRef.current && isVectorStoreFormValid && isEmbeddingProviderFormValid && isKnowledgeBaseFormValid && @@ -548,7 +817,6 @@ export function VectorKnowledgeBaseForm(props: VectorKnowledgeBaseFormProps) { embeddingProviderVariableName ); }, [ - selectedComponents, isVectorStoreFormValid, isEmbeddingProviderFormValid, isKnowledgeBaseFormValid, @@ -579,7 +847,7 @@ export function VectorKnowledgeBaseForm(props: VectorKnowledgeBaseFormProps) { items={vectorStoreOptions} onChange={(e) => handleVectorStoreSelect(e.target.value)} placeholder="Choose a vector store..." - value={selectedComponents.vectorStore ? selectedComponents.vectorStore.metadata?.label : ""} + value={selectedVectorStoreOption} /> @@ -588,7 +856,7 @@ export function VectorKnowledgeBaseForm(props: VectorKnowledgeBaseFormProps) { formFields={vectorStoreFields} fileName={fileName} targetLineRange={targetLineRange} - selectedNode={selectedComponents.vectorStore?.codedata.node} + selectedNode={vectorStoreTemplateRef.current?.codedata.node} expressionEditor={expressionEditor} openSubPanel={openSubPanel} subPanelView={subPanelView} @@ -615,11 +883,7 @@ export function VectorKnowledgeBaseForm(props: VectorKnowledgeBaseFormProps) { items={embeddingProviderOptions} onChange={(e) => handleEmbeddingProviderSelect(e.target.value)} placeholder="Choose an embedding provider..." - value={ - selectedComponents.embeddingProvider - ? selectedComponents.embeddingProvider.metadata?.label - : "" - } + value={selectedEmbeddingProviderOption} /> @@ -629,7 +893,7 @@ export function VectorKnowledgeBaseForm(props: VectorKnowledgeBaseFormProps) { formFields={embeddingProviderFields} fileName={fileName} targetLineRange={targetLineRange} - selectedNode={selectedComponents.embeddingProvider?.codedata.node} + selectedNode={embeddingProviderTemplateRef.current?.codedata.node} expressionEditor={expressionEditor} openSubPanel={openSubPanel} subPanelView={subPanelView} @@ -679,9 +943,9 @@ export function VectorKnowledgeBaseForm(props: VectorKnowledgeBaseFormProps) { From a1b8effd6f24506d961fdd21b6f5a53837da5d91 Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Mon, 28 Jul 2025 07:49:36 +0530 Subject: [PATCH 201/349] Add delete button test to graphql e2e test --- .../GraphQLDiagram/OperationAccordian.tsx | 8 ++++---- .../api-services/graphql-service.spec.ts | 16 +++++++++------- .../api-services/graphqlUtils.ts | 18 +++++++++++++++--- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/OperationAccordian.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/OperationAccordian.tsx index e0d287b60b9..48b6477c801 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/OperationAccordian.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/OperationAccordian.tsx @@ -140,13 +140,13 @@ export function OperationAccordion(params: OperationAccordionProps) { <> {onEditFunction! && ( - - + + )} {onDeleteFunction! && ( - - + + )} diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts index 3758d630701..2628328b644 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts @@ -105,8 +105,7 @@ export default function createTests() { const artifactWebView = await switchToIFrame('WSO2 Integrator: BI', page.page); if (!artifactWebView) { throw new Error('WSO2 Integrator: BI webview not found'); - } - + } await clickButtonByTestId(artifactWebView, 'create-operation-button'); await addGraphQLOperation(artifactWebView, 'query', TEST_DATA.operations.query.name, TEST_DATA.operations.query.fieldType); @@ -149,17 +148,20 @@ export default function createTests() { } const saveButton = artifactWebView.getByRole('button', { name: 'Save' }); - const editButton = await artifactWebView.getByTestId('edit-icon').nth(1); + const editButton = await artifactWebView.getByTestId('edit-button-mutation1'); await editButton.click(); - + // Fill mutation name const mutationNameInput = artifactWebView.getByRole('textbox', { name: 'Mutation Name*The name of the mutation' }); await mutationNameInput.waitFor({ state: 'visible', timeout: 10000 }); await mutationNameInput.fill(TEST_DATA.mutationEdit.name); - - // Click Save - await saveButton.waitFor({ state: 'visible', timeout: 10000 }); await saveButton.click(); + + // Delete the mutation + await artifactWebView.getByTestId('delete-button-mutation2').click(); + await artifactWebView.waitForTimeout(5000); // Wait for the delete confirmation dialog to appear + await artifactWebView.getByRole('button', { name: 'Okay' }).click(); + await artifactWebView.waitForTimeout(5000); // Wait for the delete confirmation dialog to close }); test('Navigate to respective flow diagram', async ({ }, testInfo) => { diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts index fd7406a239a..39ff9865b16 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts @@ -1,10 +1,22 @@ /** - * GraphQL Webview UI helpers for Playwright E2E tests - * All helpers are designed to be reusable and composable for GraphQL service flows. + * 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 { page } from '../utils'; - // Centralized test data for all GraphQL service E2E tests export const TEST_DATA = { service: { From fadf871357c4dbe993520a43cd40e951720d2c95 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Mon, 28 Jul 2025 07:50:56 +0530 Subject: [PATCH 202/349] Fix tool input handling by setting default values for headers and additionalValues --- .../src/views/BI/AIChatAgent/AIAgentSidePanel.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx index 4b588914e22..61b4c0c9b0d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx @@ -361,6 +361,11 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { field.value = field.key; field.optional = false; field.advanced = false; + // hack: remove headers and additionalValues from the tool inputs and set default value to () + if (["headers", "additionalValues"].includes(field.key)) { + field.value = "()"; + return; + } includedKeys.push(field.key); }); console.log(">>> Node parameter fields", { nodeParameterFields }); From 48314370f8f45d9b5a99f56859f217b69d127129 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Mon, 28 Jul 2025 08:59:07 +0530 Subject: [PATCH 203/349] Enhance ArrayMappingOptionsWidget with loading state and progress indication --- .../Label/ArrayMappingOptionsWidget.tsx | 125 ++++++++++++++---- .../components/Diagram/utils/common-utils.ts | 9 +- 2 files changed, 104 insertions(+), 30 deletions(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx index 4c82921c588..024b4675cbf 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx @@ -20,7 +20,7 @@ import React from 'react'; import { TypeKind } from '@wso2/ballerina-core'; -import { Codicon, Item, Menu, MenuItem } from '@wso2/ui-toolkit'; +import { Codicon, Item, Menu, MenuItem, ProgressRing } from '@wso2/ui-toolkit'; import { css } from '@emotion/css'; import { InputOutputPortModel, ValueType } from '../Port'; @@ -28,6 +28,7 @@ import { genArrayElementAccessSuffix, getValueType } from '../utils/common-utils import { MappingType } from '../Link'; import { ExpressionLabelModel } from './ExpressionLabelModel'; import { mapWithCustomFn } from '../utils/modification-utils'; +import classNames from 'classnames'; export const useStyles = () => ({ arrayMappingMenu: css({ @@ -38,6 +39,34 @@ export const useStyles = () => ({ width: '100%', alignItems: 'center' }), + container: css({ + width: '100%', + backgroundColor: "var(--vscode-editor-background)", + padding: "2px", + borderRadius: "6px", + border: "1px solid var(--vscode-debugIcon-breakpointDisabledForeground)", + display: "flex", + alignItems: "center", + "& > vscode-button > *": { + margin: "0 2px" + } + }), + element: css({ + padding: '10px', + cursor: 'pointer', + transitionDuration: '0.2s', + userSelect: 'none', + pointerEvents: 'auto', + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + '&:hover': { + filter: 'brightness(0.95)', + }, + }), + loadingContainer: css({ + padding: '10px', + }) }); const a2aMenuStyles = { @@ -67,11 +96,19 @@ export function ArrayMappingOptionsWidget(props: ArrayMappingOptionsWidgetProps) const isValueModifiable = valueType === ValueType.Default || valueType === ValueType.NonEmpty; - - const onClickMapArrays = async () => { - if (isValueModifiable) { - } else { + + const [inProgress, setInProgress] = React.useState(false); + const wrapWithProgress = (onClick: () => Promise) => { + return async () => { + link.pendingMappingType = MappingType.Default; + setInProgress(true); + await onClick(); + setInProgress(false); } + }; + + const onClickMapDirectly = async () => { + } const onClickMapIndividualElements = async () => { @@ -110,12 +147,12 @@ export function ArrayMappingOptionsWidget(props: ArrayMappingOptionsWidgetProps) { id: "a2a-direct", label: getItemElement("a2a-direct", "Map Input Array to Output Array"), - onClick: onClickMapArrays + onClick: wrapWithProgress(onClickMapDirectly) }, { id: "a2a-inner", label: getItemElement("a2a-inner", "Map Array Elements Individually"), - onClick: onClickMapIndividualElements + onClick: wrapWithProgress(onClickMapIndividualElements) } ]; @@ -123,12 +160,12 @@ export function ArrayMappingOptionsWidget(props: ArrayMappingOptionsWidgetProps) { id: "a2s-direct", label: getItemElement("a2s-direct", "Extract Single Element from Array"), - onClick: onClickMapArraysAccessSingleton + onClick: wrapWithProgress(onClickMapArraysAccessSingleton) }, { id: "a2s-aggregate", label: getItemElement("a2s-aggregate", "Aggregate using Query"), - onClick: onClickAggregateArray + onClick: wrapWithProgress(onClickAggregateArray) } ]; @@ -137,29 +174,67 @@ export function ArrayMappingOptionsWidget(props: ArrayMappingOptionsWidgetProps) const a2sCollectClauseItems: Item[] = collectClauseFns.map((func) => ({ id: `a2s-collect-${func}`, label: getItemElement(`a2s-collect-${func}`, `Aggregate using ${func}`), - onClick: () => onClickMapUsingCollectClause(func) + onClick: wrapWithProgress(async () => await onClickMapUsingCollectClause(func)) })); + const defaultMenuItems: Item[] = [ + { + id: "a2a-direct", + label: getItemElement("direct", "Map directly"), + onClick: wrapWithProgress(onClickMapDirectly) + } + ]; - const menuItems = pendingMappingType === MappingType.ArrayToArray ? a2aMenuItems : - pendingMappingType === MappingType.ArrayToSingleton ? a2sMenuItems : - a2sCollectClauseItems; + const menuItems = pendingMappingType === MappingType.ArrayToArray ? a2aMenuItems : + pendingMappingType === MappingType.ArrayToSingleton ? a2sMenuItems : + pendingMappingType === MappingType.ArrayToSingletonWithCollect ? a2sCollectClauseItems : + defaultMenuItems; menuItems.push({ id: "a2a-a2s-func", label: getItemElement("a2a-a2s-func", "Map Using Custom Function"), - onClick: onClickMapWithCustomFunction + onClick: wrapWithProgress(onClickMapWithCustomFunction) }); - return ( -
- - {menuItems.map((item: Item) => - - )} - -
+ // return ( + // inProgress ? ( + //
+ //
+ // + //
+ //
+ // ) : ( + //
+ //
+ //
+ // + //
+ //
+ // + // {menuItems.map((item: Item) => + // + // )} + // + //
) + // ); + return !inProgress && ( +
+ + {menuItems.map((item: Item) => + + )} + +
); } diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/common-utils.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/common-utils.ts index 14837f76bb3..bf3ab4a2131 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/common-utils.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/common-utils.ts @@ -41,6 +41,10 @@ export function findMappingByOutput(mappings: Mapping[], outputId: string): Mapp return mappings.find(mapping => (mapping.output === outputId || mapping.output.replaceAll("\"", "") === outputId)); } +export function isPendingMappingRequired(mappingType: MappingType): boolean { + return mappingType === MappingType.Incompatible; +} + export function getMappingType(sourcePort: PortModel, targetPort: PortModel): MappingType { if (sourcePort instanceof InputOutputPortModel @@ -82,11 +86,6 @@ export function getValueType(lm: DataMapperLinkModel): ValueType { return ValueType.Empty; } - -export function isPendingMappingRequired(mappingType: MappingType): boolean { - return false; // TODO: Implement logic when LS supports on the fly mappings -} - export function genArrayElementAccessSuffix(sourcePort: PortModel, targetPort: PortModel) { if (sourcePort instanceof InputOutputPortModel && targetPort instanceof InputOutputPortModel) { let suffix = ''; From 4910088859656531180decc29b3d242c489632cf Mon Sep 17 00:00:00 2001 From: ChamodA Date: Mon, 28 Jul 2025 09:19:25 +0530 Subject: [PATCH 204/349] Refactor ArrayMappingOptionsWidget to improve loading state handling and layout --- .../Label/ArrayMappingOptionsWidget.tsx | 70 +++++++------------ 1 file changed, 27 insertions(+), 43 deletions(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx index 024b4675cbf..0019f1e1bff 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx @@ -32,7 +32,8 @@ import classNames from 'classnames'; export const useStyles = () => ({ arrayMappingMenu: css({ - pointerEvents: 'auto' + pointerEvents: 'auto', + position: 'relative' }), itemContainer: css({ display: 'flex', @@ -40,13 +41,17 @@ export const useStyles = () => ({ alignItems: 'center' }), container: css({ - width: '100%', + position: 'absolute', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', backgroundColor: "var(--vscode-editor-background)", padding: "2px", borderRadius: "6px", border: "1px solid var(--vscode-debugIcon-breakpointDisabledForeground)", display: "flex", alignItems: "center", + justifyContent: "center", "& > vscode-button > *": { margin: "0 2px" } @@ -100,7 +105,6 @@ export function ArrayMappingOptionsWidget(props: ArrayMappingOptionsWidgetProps) const [inProgress, setInProgress] = React.useState(false); const wrapWithProgress = (onClick: () => Promise) => { return async () => { - link.pendingMappingType = MappingType.Default; setInProgress(true); await onClick(); setInProgress(false); @@ -195,46 +199,26 @@ export function ArrayMappingOptionsWidget(props: ArrayMappingOptionsWidgetProps) label: getItemElement("a2a-a2s-func", "Map Using Custom Function"), onClick: wrapWithProgress(onClickMapWithCustomFunction) }); - // return ( - // inProgress ? ( - //
- //
- // - //
- //
- // ) : ( - //
- //
- //
- // - //
- //
- // - // {menuItems.map((item: Item) => - // - // )} - // - //
) - // ); - return !inProgress && ( -
- - {menuItems.map((item: Item) => - + + {menuItems.map((item: Item) => + + )} + + {inProgress && ( +
+
+ - )} -
-
+ + + )} + ); } From c2f1a7c8acbceb9bcf45ad69dd62958fd85c9a3b Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Mon, 28 Jul 2025 09:48:34 +0530 Subject: [PATCH 205/349] Improve code quality of graphql tests --- .../GraphQLDiagram/GraphqlServiceEditor.tsx | 3 - .../GraphQLDiagram/OperationAccordian.tsx | 4 +- .../src/views/GraphQLDiagram/index.tsx | 2 +- .../api-services/graphql-service.spec.ts | 18 ++--- .../api-services/graphqlUtils.ts | 77 ++++++++++--------- 5 files changed, 53 insertions(+), 51 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/GraphqlServiceEditor.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/GraphqlServiceEditor.tsx index 621a1a13f15..8b0b0e84715 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/GraphqlServiceEditor.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/GraphqlServiceEditor.tsx @@ -455,7 +455,6 @@ export function GraphqlServiceEditor(props: GraphqlServiceEditorProps) { {categories.query?.map((operation, index) => ( ( {categories.subscription?.map((operation, index) => ( {onEditFunction! && ( - + )} {onDeleteFunction! && ( - + )} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/index.tsx index 5d62a093317..5b14ae0156e 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/index.tsx @@ -265,7 +265,7 @@ export function GraphQLDiagram(props: GraphQLDiagramProps) { {isServiceEditorOpen && ( `/sample${attempt}`, editedBasePath: (attempt: number) => `/editedSample${attempt}`, }, - operations: { - query: { - name: 'query1', - fieldType: 'string', - }, - mutation: { - name: 'mutation1', - fieldType: 'boolean', - }, - subscription: { - name: 'subscription1', - fieldType: 'float', - }, + query: { + name: 'query1', + fieldType: 'string', }, - arguments: [ - { name: 'arg1', type: 'string' }, - { name: 'arg2', type: 'mytype1' }, - ], - types: { - inputObject: 'mytype1', - outputObject: 'outputtype1', - }, - field: { - name: 'field1', - }, - mutationEdit: { + mutation: [{ + name: 'mutation1', + editedName: 'editedMutation1', + fieldType: 'boolean', + arguments: [ + { name: 'arg1', type: 'string' }, + { name: 'arg2', type: 'mytype1' }, + ], + outputType: 'outputtype1', + },{ name: 'mutation2', + fieldType: 'float', + expression: '"Hello World!"', + }], + subscription: { + name: 'subscription1', + fieldType: 'float', }, - expression: '"Hello World!"', }; /** @@ -61,7 +55,7 @@ export const TEST_DATA = { * @param name - The name to use for the operation * @param fieldType - The type to use for the field (e.g., 'boolean', 'float', etc.) */ -export async function addGraphQLOperation(artifactWebView, operationType, name, fieldType) { +export async function addGraphQLOperation(artifactWebView: Frame, operationType: string, name: string, fieldType: string) { const addBtnTestId = `graphql-add-${operationType}-btn`; await artifactWebView.getByTestId(addBtnTestId).waitFor({ state: 'visible', timeout: 10000 }); const addBtn = artifactWebView.getByTestId(addBtnTestId); @@ -95,24 +89,31 @@ export async function addGraphQLOperation(artifactWebView, operationType, name, * @param artifactWebView - The Playwright frame/locator for the webview * @param testId - The test id of the button to click */ -export async function clickButtonByTestId(artifactWebView, testId: string) { +export async function clickButtonByTestId(artifactWebView: Frame, testId: string) { const button = artifactWebView.getByTestId(testId); await button.waitFor({ state: 'visible', timeout: 10000 }); await button.click(); } - -export async function addOutputObject(artifactWebView) { +/** + * Create an output object type in the GraphQL service + * @param artifactWebView - The Playwright frame/locator for the webview + */ +export async function addOutputObject(artifactWebView: Frame) { const createFromScratchTab = artifactWebView.getByTestId('create-from-scratch-tab'); await artifactWebView.getByRole('textbox', { name: 'Field Type' }).click(); await artifactWebView.getByText('Create New Type').click(); await artifactWebView.getByTestId('type-kind-dropdown').locator('svg').click(); await artifactWebView.getByRole('option', { name: 'Object' }).click(); - await createFromScratchTab.getByRole('textbox', { name: 'Name' }).fill(TEST_DATA.types.outputObject); + await createFromScratchTab.getByRole('textbox', { name: 'Name' }).fill(TEST_DATA.mutation[0].outputType); await artifactWebView.getByTestId('type-create-save').getByRole('button', { name: 'Save' }).click(); } -export async function createInputObjectFromScratch(artifactWebView) { +/** + * Create an input object type from scratch in the GraphQL service + * @param artifactWebView - The Playwright frame/locator for the webview + */ +export async function createInputObjectFromScratch(artifactWebView: Frame) { await artifactWebView.getByText('Add Argument').click(); await artifactWebView.getByRole('textbox', { name: 'Argument Type' }).click(); await artifactWebView.getByText('Create New Type').click(); @@ -121,17 +122,21 @@ export async function createInputObjectFromScratch(artifactWebView) { // Fill name for the new input object type const createFromScratchTab = artifactWebView.getByTestId('create-from-scratch-tab'); - await createFromScratchTab.getByRole('textbox', { name: 'Name' }).fill(TEST_DATA.types.inputObject); + await createFromScratchTab.getByRole('textbox', { name: 'Name' }).fill(TEST_DATA.mutation[0].arguments[1].type); await artifactWebView.getByTestId('type-create-save').getByRole('button', { name: 'Save' }).click(); - await artifactWebView.getByRole('textbox', { name: 'Argument Name*The name of the' }).fill(TEST_DATA.arguments[1].name); + await artifactWebView.getByRole('textbox', { name: 'Argument Name*The name of the' }).fill(TEST_DATA.mutation[0].arguments[1].name); await artifactWebView.getByRole('button', { name: 'Add' }).click(); } -export async function addArgumentToGraphQLService(artifactWebView) { +/** + * Add an argument to a GraphQL service + * @param artifactWebView - The Playwright frame/locator for the webview + */ +export async function addArgumentToGraphQLService(artifactWebView: Frame) { await artifactWebView.getByText('Add Argument').click(); await artifactWebView.getByRole('textbox', { name: 'Argument Type' }).click(); await artifactWebView.getByTitle('string', { exact: true }).click(); - await artifactWebView.getByRole('textbox', { name: 'Argument Name*The name of the' }).fill(TEST_DATA.arguments[0].name); + await artifactWebView.getByRole('textbox', { name: 'Argument Name*The name of the' }).fill(TEST_DATA.mutation[0].arguments[0].name); await artifactWebView.getByRole('button', { name: 'Add' }).click(); } From ebeaf287fdeb8c3f6627f9cc1c57d2145130f033 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Mon, 28 Jul 2025 09:55:37 +0530 Subject: [PATCH 206/349] Refactor AddMcpServer component by removing unused styled components and imports --- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 107 +----------------- 1 file changed, 5 insertions(+), 102 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index 324387edd6c..981d226e837 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -11,18 +11,13 @@ import { useEffect, useRef, useState } from "react"; import styled from "@emotion/styled"; import { FlowNode } from "@wso2/ballerina-core"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; -import { ActionButtons, Button, Codicon, ThemeColors, Dropdown } from "@wso2/ui-toolkit"; +import { Button, ThemeColors } from "@wso2/ui-toolkit"; import { RelativeLoader } from "../../../components/RelativeLoader"; import FormGenerator from "../Forms/FormGenerator"; -import { addMcpServerToAgentNode, updateMcpServerToAgentNode, findAgentNodeFromAgentCallNode, getAgentFilePath } from "./utils"; -import { TextField, CheckBox } from '@wso2/ui-toolkit'; -import { FormField, FormValues } from "@wso2/ballerina-side-panel"; -import { set } from "lodash"; +import { findAgentNodeFromAgentCallNode, getAgentFilePath } from "./utils"; +import { CheckBox } from '@wso2/ui-toolkit'; +import { FormValues } from "@wso2/ballerina-side-panel"; -const NameContainer = styled.div` - display: flex; - flex-direction: row; -`; export const ContentWrapper = styled.div` display: flex; @@ -31,7 +26,6 @@ export const ContentWrapper = styled.div` `; const Container = styled.div` - padding: 16px; display: flex; flex-direction: column; height: 100%; @@ -46,88 +40,6 @@ const LoaderContainer = styled.div` height: 100%; `; -const Description = styled.div` - font-size: var(--vscode-font-size); - color: ${ThemeColors.ON_SURFACE_VARIANT}; - margin-bottom: 8px; -`; - -const Column = styled.div` - display: flex; - flex-direction: column; - gap: 8px; - flex: 1; - overflow-y: auto; -`; - -const Row = styled.div` - display: flex; - flex-direction: row; - align-items: center; - justify-content: space-between; - margin-bottom: 8px; -`; - -const Title = styled.div` - font-size: 14px; - font-family: GilmerBold; -`; - -const ToolItem = styled.div<{ isSelected?: boolean }>` - display: flex; - flex-direction: row; - align-items: center; - gap: 5px; - padding: 5px; - border: 1px solid - ${(props: { isSelected: boolean }) => (props.isSelected ? ThemeColors.PRIMARY : ThemeColors.OUTLINE_VARIANT)}; - border-radius: 5px; - height: 36px; - cursor: "pointer"; - font-size: 14px; - &:hover { - background-color: ${ThemeColors.PRIMARY_CONTAINER}; - border: 1px solid ${ThemeColors.PRIMARY}; - } -`; - -const PrimaryButton = styled(Button)` - appearance: "primary"; -`; - -const HighlightedButton = styled.div` - margin-top: 10px; - width: 100%; - display: flex; - flex-direction: row; - justify-content: center; - align-items: flex-start; - gap: 8px; - padding: 6px 2px; - color: ${ThemeColors.PRIMARY}; - border: 1px dashed ${ThemeColors.PRIMARY}; - border-radius: 5px; - cursor: pointer; - &:hover { - border: 1px solid ${ThemeColors.PRIMARY}; - background-color: ${ThemeColors.PRIMARY_CONTAINER}; - } -`; - -const Footer = styled.div` - position: fixed; - bottom: 0; - left: 0; - - width: 100%; - display: flex; - justify-content: flex-end; - gap: 12px; - padding: 16px; - background-color: ${ThemeColors.SURFACE_DIM}; - margin-top: auto; -`; - const ToolsContainer = styled.div` display: flex; flex-direction: column; @@ -231,14 +143,6 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { const hasUpdatedToolsField = useRef(false); const formRef = useRef(null); - const handleAddNewMcpServer = () => { - onAddMcpServer(); - } - - const handleBack = () => { - props.onBack?.(); - }; - useEffect(() => { initPanel(); }, [agentCallNode]); @@ -578,7 +482,6 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { return candidateValue; }; - const computedValue = generateUniqueValue(); const hasExistingTools = existingTools.length > 0; const isToolSelected = selectedTool !== null; @@ -770,7 +673,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { onSubmit={handleOnSave} scopeFieldAddon={renderToolsSelection(mcpTools)} newServerUrl={serviceUrl} - onChange={(fieldKey, value, allValues) => { + onChange={(fieldKey, value) => { if (fieldKey === "serverUrl") { setPendingServiceUrl(value); setServiceUrl(value); From fa2995fed7dbf0cb3292453991502aa30685e22a Mon Sep 17 00:00:00 2001 From: ChamodA Date: Mon, 28 Jul 2025 10:04:08 +0530 Subject: [PATCH 207/349] Implement map directly option --- .../components/Diagram/Label/ArrayMappingOptionsWidget.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx index 0019f1e1bff..19cf45179ae 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx @@ -27,7 +27,7 @@ import { InputOutputPortModel, ValueType } from '../Port'; import { genArrayElementAccessSuffix, getValueType } from '../utils/common-utils'; import { MappingType } from '../Link'; import { ExpressionLabelModel } from './ExpressionLabelModel'; -import { mapWithCustomFn } from '../utils/modification-utils'; +import { createNewMapping, mapWithCustomFn } from '../utils/modification-utils'; import classNames from 'classnames'; export const useStyles = () => ({ @@ -107,12 +107,11 @@ export function ArrayMappingOptionsWidget(props: ArrayMappingOptionsWidgetProps) return async () => { setInProgress(true); await onClick(); - setInProgress(false); } }; const onClickMapDirectly = async () => { - + await createNewMapping(link); } const onClickMapIndividualElements = async () => { From 3aa8b4bb6be48be3693ff6090d4efd8e8d10380e Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Mon, 28 Jul 2025 10:26:29 +0530 Subject: [PATCH 208/349] Add codedata to InitialIDMSourceResponse and update frontend to handle navigation in responses --- .../src/interfaces/extended-lang-client.ts | 1 + .../inline-data-mapper/rpc-manager.ts | 16 +------------- .../src/views/BI/FlowDiagram/index.tsx | 22 +++++++++++++++++++ 3 files changed, 24 insertions(+), 15 deletions(-) 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 59b2649d1be..37e690ad944 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -289,6 +289,7 @@ export interface InitialIDMSourceResponse { textEdits: { [key: string]: TextEdit[]; }; + codedata?: CodeData; } export interface InlineDataMapperModelRequest { diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/inline-data-mapper/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/inline-data-mapper/rpc-manager.ts index 2dae98e8157..3c0087940cd 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/inline-data-mapper/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/inline-data-mapper/rpc-manager.ts @@ -66,21 +66,7 @@ export class InlineDataMapperRpcManager implements InlineDataMapperAPI { const varName = params.flowNode.properties?.variable?.value as string ?? null; updateSource(model.textEdits, params.filePath, params.flowNode.codedata, varName) .then(codeData => { - openView(EVENT_TYPE.OPEN_VIEW, { - view: MACHINE_VIEW.InlineDataMapper, - documentUri: params.filePath, - position: { - startLine: codeData.lineRange.startLine.line, - startColumn: codeData.lineRange.startLine.offset, - endLine: codeData.lineRange.endLine.line, - endColumn: codeData.lineRange.endLine.offset - }, - dataMapperMetadata: { - name: varName, - codeData: codeData - } - }); - resolve({ textEdits: model.textEdits }); + resolve({ textEdits: model.textEdits, codedata: codeData }); }); }) .catch((error) => { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index 69fe02a75cf..6a3de0b18a7 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -572,6 +572,28 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { filePath: model.fileName, flowNode: updatedNode, }) + .then((response) => { + console.log(">>> Updated source code", response); + if (response.codedata) { + rpcClient.getVisualizerRpcClient().openView({ + type: EVENT_TYPE.OPEN_VIEW, + location: { + view: MACHINE_VIEW.InlineDataMapper, + documentUri: model.fileName, + position: { + startLine: response.codedata.lineRange.startLine.line, + startColumn: response.codedata.lineRange.startLine.offset, + endLine: response.codedata.lineRange.endLine.line, + endColumn: response.codedata.lineRange.endLine.offset, + }, + dataMapperMetadata: { + name: updatedNode.properties?.variable?.value as string, + codeData: response.codedata, + } + } + }); + } + }) .finally(() => { setShowSidePanel(false); setShowProgressIndicator(false); From 894bf3b8fc8ccdf35250fa90d812938b381f2c66 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Mon, 28 Jul 2025 10:59:20 +0530 Subject: [PATCH 209/349] Update Form component to handle empty parameters --- .../src/components/Form/index.tsx | 52 ++++++++++--------- 1 file changed, 28 insertions(+), 24 deletions(-) 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 5376829d877..a5d880d08c1 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx @@ -420,6 +420,10 @@ export const Form = forwardRef((props: FormProps, ref) => { defaultValues[field.key] = field.value ?? ""; } + if (field.key === "parameters" && field.value.length === 0) { + defaultValues[field.key] = formValues[field.key] ?? []; + } + if (field.key === "type") { // Handle the case where the type is changed via 'Add Type' const existingType = formValues[field.key]; @@ -751,30 +755,30 @@ export const Form = forwardRef((props: FormProps, ref) => { {hasAdvanceFields && ( Optional Configurations - - {!showAdvancedOptions && ( - - - Expand - - )} - {showAdvancedOptions && ( - - Collapsed + + {!showAdvancedOptions && ( + + + Expand + + )} + {showAdvancedOptions && ( + + Collapsed )} From 922bf385619d5efa9de8dbbcbb638c445072054c Mon Sep 17 00:00:00 2001 From: ChamodA Date: Mon, 28 Jul 2025 11:02:26 +0530 Subject: [PATCH 210/349] Set pending mapping type to Default in wrapWithProgress --- .../src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx index 19cf45179ae..b0bc32a1c1e 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Label/ArrayMappingOptionsWidget.tsx @@ -105,8 +105,10 @@ export function ArrayMappingOptionsWidget(props: ArrayMappingOptionsWidgetProps) const [inProgress, setInProgress] = React.useState(false); const wrapWithProgress = (onClick: () => Promise) => { return async () => { + link.pendingMappingType = MappingType.Default; setInProgress(true); await onClick(); + setInProgress(false); } }; From 54bf91ba3597cdfca88b7edd1e333b79deee777a Mon Sep 17 00:00:00 2001 From: sachiniSam Date: Mon, 28 Jul 2025 11:16:36 +0530 Subject: [PATCH 211/349] Fix form not rerendering after rename model update --- .../ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index 97129ad9a16..941fd40de66 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -115,6 +115,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { const [updatedExpressionField, setUpdatedExpressionField] = useState(undefined); const [breakpointInfo, setBreakpointInfo] = useState(); const [selectedMcpToolkitName, setSelectedMcpToolkitName] = useState(undefined); + const [forceUpdate, setForceUpdate] = useState(0); // Navigation stack for back navigation const [navigationStack, setNavigationStack] = useState([]); @@ -444,6 +445,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { if (matchingNode && matchingNode.id !== selectedNodeRef.current.id) { selectedNodeRef.current = matchingNode; targetRef.current = matchingNode.codedata.lineRange; + setForceUpdate(prev => prev + 1); } } }, [model]); From 26a8307bdfbdce2c391599ccfe8acf042735bb50 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Mon, 28 Jul 2025 11:18:04 +0530 Subject: [PATCH 212/349] Add mcp server icon file to the font-wso2-vscode library --- .../font-wso2-vscode/src/icons/bi-mcp.svg | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-mcp.svg diff --git a/workspaces/common-libs/font-wso2-vscode/src/icons/bi-mcp.svg b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-mcp.svg new file mode 100644 index 00000000000..30d986f0493 --- /dev/null +++ b/workspaces/common-libs/font-wso2-vscode/src/icons/bi-mcp.svg @@ -0,0 +1,22 @@ + + + + From 131e0ce1c96935fbb8efc10c369db095e776777d Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Mon, 28 Jul 2025 11:19:25 +0530 Subject: [PATCH 213/349] Use custom icon for ai module in connectionIcons --- .../src/components/ConnectorIcon/index.tsx | 29 +++---------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/workspaces/ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx b/workspaces/ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx index 9b5c2e3652b..29e79686001 100644 --- a/workspaces/ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx @@ -38,12 +38,6 @@ interface ConnectorIconProps { export function ConnectorIcon(props: ConnectorIconProps): React.ReactElement { const { url, fallbackIcon, className, style } = props; const [imageError, setImageError] = React.useState(false); - const [themeAwareColor, setThemeAwareColor] = useState(getAIColor()); - - // Update color when theme changes - const handleThemeChange = () => { - setThemeAwareColor(getAIColor()); - }; // use custom icon for http if (url?.includes("ballerina_http_")) { @@ -52,29 +46,14 @@ export function ConnectorIcon(props: ConnectorIconProps): React.ReactElement { // use custom icon for ai model providers const aiModules = ["ai.openai", "ai.azure", "ai.anthropic", "ai.ollama", "ai.mistral", "ai.deepseek"]; - if (aiModules.some(module => url?.includes(module))) { - const selectedModule = aiModules.find(module => url?.includes(module)); + if (aiModules.some((module) => url?.includes(module))) { + const selectedModule = aiModules.find((module) => url?.includes(module)); return getLlmModelIcons(selectedModule); } // use custom icon for ai module - if (url?.includes("ballerinax_ai_")) { - return ( - <> - - - - ); - } - - if (url?.includes("ballerina_ai")) { - return ( - - ); + if (url?.includes("ballerinax_ai_") || url?.includes("ballerina_ai")) { + return ; } if (url && isValidUrl(url) && !imageError) { From f1ba94ee4e32d8438b5bde69ecd13912140225f5 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Mon, 28 Jul 2025 11:19:50 +0530 Subject: [PATCH 214/349] Update ApiCallNodeWidget to display dashed lines for class calls --- .../src/components/nodes/ApiCallNode/ApiCallNodeWidget.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/bi-diagram/src/components/nodes/ApiCallNode/ApiCallNodeWidget.tsx b/workspaces/ballerina/bi-diagram/src/components/nodes/ApiCallNode/ApiCallNodeWidget.tsx index f67a0285fb3..e8197700321 100644 --- a/workspaces/ballerina/bi-diagram/src/components/nodes/ApiCallNode/ApiCallNodeWidget.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/nodes/ApiCallNode/ApiCallNodeWidget.tsx @@ -210,6 +210,8 @@ export function ApiCallNodeWidget(props: ApiCallNodeWidgetProps) { const isMenuOpen = Boolean(anchorEl); const hasBreakpoint = model.hasBreakpoint(); const isActiveBreakpoint = model.isActiveBreakpoint(); + // show dash line if the node is a class call + const isClassCall = model.node.codedata.node === "VECTOR_KNOWLEDGE_BASE_CALL"; useEffect(() => { if (model.node.suggested) { @@ -363,7 +365,7 @@ export function ApiCallNodeWidget(props: ApiCallNodeWidgetProps) { fill={ThemeColors.SURFACE_DIM} stroke={isCircleHovered && !disabled ? ThemeColors.HIGHLIGHT : ThemeColors.OUTLINE_VARIANT} strokeWidth={1.5} - strokeDasharray={disabled ? "5 5" : "none"} + strokeDasharray={disabled ? "5 5" : "none"} opacity={disabled ? 0.7 : 1} /> From 5459937d1a46f151b4c98e7ac54a609b0ef1c824 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Mon, 28 Jul 2025 11:20:23 +0530 Subject: [PATCH 215/349] Update tool add flow with new wizard --- .../ballerina-visualizer/src/utils/bi.tsx | 8 +- .../views/BI/AIChatAgent/AIAgentSidePanel.tsx | 44 ++- .../src/views/BI/AIChatAgent/AddTool.tsx | 324 +++++------------- .../src/views/BI/AIChatAgent/NewTool.tsx | 15 +- .../src/views/BI/FlowDiagram/PanelManager.tsx | 88 ++++- 5 files changed, 217 insertions(+), 262 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx index 5e9bf6c32cd..5c312fa94f4 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx @@ -328,13 +328,17 @@ export function getContainerTitle(view: SidePanelView, activeNode: FlowNode, cli case SidePanelView.AGENT_TOOL: return "Configure Tool"; case SidePanelView.ADD_TOOL: - return "Add Tool / MCP Server"; + return "Add Tool"; case SidePanelView.ADD_MCP_SERVER: return "Add MCP Server"; case SidePanelView.EDIT_MCP_SERVER: return "Edit MCP Server"; case SidePanelView.NEW_TOOL: - return "Create New Tool"; + return "Add New Tool"; + case SidePanelView.NEW_TOOL_FROM_CONNECTION: + return "Create Tool from Connection"; + case SidePanelView.NEW_TOOL_FROM_FUNCTION: + return "Create Tool from Function"; case SidePanelView.AGENT_CONFIG: return "Configure Agent"; case SidePanelView.FORM: diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx index 4b588914e22..7af1eee8ea7 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx @@ -36,6 +36,7 @@ import { FlowNode, ToolParameters, ToolParametersValue, + DIRECTORY_MAP, } from "@wso2/ballerina-core"; import { @@ -50,6 +51,7 @@ import { URI, Utils } from "vscode-uri"; import { cloneDeep } from "lodash"; import { createDefaultParameterValue, createToolInputFields, createToolParameters } from "./formUtils"; import { FUNCTION_CALL, METHOD_CALL, REMOTE_ACTION_CALL, RESOURCE_ACTION_CALL } from "../../../constants"; +import { NewToolSelectionMode } from "./NewTool"; const LoaderContainer = styled.div` display: flex; @@ -79,6 +81,7 @@ export enum SidePanelView { export interface BIFlowDiagramProps { projectPath: string; onSubmit: (data: ExtendedAgentToolRequest) => void; + mode?: NewToolSelectionMode; } export interface ExtendedAgentToolRequest extends AgentToolRequest { @@ -87,7 +90,7 @@ export interface ExtendedAgentToolRequest extends AgentToolRequest { } export function AIAgentSidePanel(props: BIFlowDiagramProps) { - const { projectPath, onSubmit } = props; + const { projectPath, onSubmit, mode = NewToolSelectionMode.ALL } = props; const { rpcClient } = useRpcContext(); const [sidePanelView, setSidePanelView] = useState(SidePanelView.NODE_LIST); @@ -206,12 +209,20 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { const convertedCategories = convertBICategoriesToSidePanelCategories(connectionsCategory); console.log("convertedCategories", convertedCategories); - const filteredFunctions = await handleSearchFunction("", FUNCTION_TYPE.REGULAR, false); - console.log("filteredFunctions", filteredFunctions); - - const filteredCategories = convertedCategories.concat(filteredFunctions); + let filteredCategories = []; + + // Filter categories based on mode + if (mode === NewToolSelectionMode.CONNECTION) { + filteredCategories = convertedCategories; + } else if (mode === NewToolSelectionMode.FUNCTION) { + const filteredFunctions = await handleSearchFunction("", FUNCTION_TYPE.REGULAR, false); + filteredCategories = filteredFunctions; + } else { + const filteredFunctions = await handleSearchFunction("", FUNCTION_TYPE.REGULAR, false); + filteredCategories = convertedCategories.concat(filteredFunctions); + } + setCategories(filteredCategories); - console.log("filteredCategories", filteredCategories); initialCategoriesRef.current = filteredCategories; // Store initial categories setLoading(false); }) @@ -393,6 +404,17 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { }); }; + const handleOnAddFunction = () => { + rpcClient.getVisualizerRpcClient().openView({ + type: EVENT_TYPE.OPEN_VIEW, + location: { + view: MACHINE_VIEW.BIFunctionForm, + artifactType: DIRECTORY_MAP.FUNCTION, + }, + isPopup: true, + }); + }; + const handleToolSubmit = (data: FormValues) => { // Safely convert name to camelCase, handling any input const name = data["name"] || ""; @@ -528,6 +550,13 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { "Only isolated functions can be used as tools. Isolated functions ensure predictable behavior by avoiding shared state."; } + let searchPlaceholder = "Search"; + if (mode === NewToolSelectionMode.CONNECTION) { + searchPlaceholder = "Search connections"; + } else if (mode === NewToolSelectionMode.FUNCTION) { + searchPlaceholder = "Search functions"; + } + return ( <> {loading && ( @@ -540,9 +569,10 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { categories={categories} onSelect={handleOnSelectNode} onAddConnection={handleOnAddConnection} + onAddFunction={handleOnAddFunction} onSearchTextChange={(searchText) => handleSearchFunction(searchText, FUNCTION_TYPE.REGULAR, true)} title={"Functions"} - searchPlaceholder={"Search library functions"} + searchPlaceholder={searchPlaceholder} /> )} {sidePanelView === SidePanelView.TOOL_FORM && ( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx index 59a70ff1bb2..f0e39b6ffa5 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddTool.tsx @@ -16,17 +16,12 @@ * under the License. */ -import { useEffect, useRef, useState } from "react"; import styled from "@emotion/styled"; import { FlowNode } from "@wso2/ballerina-core"; -import { useRpcContext } from "@wso2/ballerina-rpc-client"; -import { Button, Codicon, ThemeColors } from "@wso2/ui-toolkit"; -import { RelativeLoader } from "../../../components/RelativeLoader"; -import { addToolToAgentNode, findAgentNodeFromAgentCallNode, getAgentFilePath } from "./utils"; -import { AddMcpServer } from "./AddMcpServer"; +import { Icon, ThemeColors } from "@wso2/ui-toolkit"; const Container = styled.div` - padding: 16px; + padding: 20px; display: flex; flex-direction: column; height: 100%; @@ -34,276 +29,133 @@ const Container = styled.div` box-sizing: border-box; `; -const LoaderContainer = styled.div` - display: flex; - justify-content: center; - align-items: center; - height: 100%; -`; - const Description = styled.div` font-size: var(--vscode-font-size); color: ${ThemeColors.ON_SURFACE_VARIANT}; - margin-bottom: 8px; + margin-bottom: 24px; + line-height: 1.5; `; const Column = styled.div` display: flex; flex-direction: column; - gap: 8px; + gap: 12px; flex: 1; - overflow-y: auto; `; -const Row = styled.div` +const OptionCard = styled.div` display: flex; - flex-direction: row; - align-items: center; - justify-content: space-between; - margin-bottom: 8px; -`; - -const Title = styled.div` - font-size: 14px; - font-family: GilmerBold; -`; - -const ToolItem = styled.div<{ isSelected?: boolean }>` - display: flex; - flex-direction: row; - align-items: center; - gap: 5px; - padding: 5px; - border: 1px solid - ${(props: { isSelected: boolean }) => (props.isSelected ? ThemeColors.PRIMARY : ThemeColors.OUTLINE_VARIANT)}; - border-radius: 5px; - height: 36px; - cursor: "pointer"; - font-size: 14px; + flex-direction: column; + gap: 8px; + padding: 14px 12px; + border: 1px solid ${ThemeColors.OUTLINE_VARIANT}; + border-radius: 4px; + cursor: pointer; + transition: all 0.2s ease; + &:hover { background-color: ${ThemeColors.PRIMARY_CONTAINER}; border: 1px solid ${ThemeColors.PRIMARY}; } `; -const PrimaryButton = styled(Button)` - appearance: "primary"; -`; - -const HighlightedButton = styled.div` - margin-top: 10px; - width: 100%; +const OptionHeader = styled.div` display: flex; flex-direction: row; - justify-content: center; - align-items: flex-start; - gap: 8px; - padding: 6px 2px; - color: ${ThemeColors.PRIMARY}; - border: 1px dashed ${ThemeColors.PRIMARY}; - border-radius: 5px; - cursor: pointer; - &:hover { - border: 1px solid ${ThemeColors.PRIMARY}; - background-color: ${ThemeColors.PRIMARY_CONTAINER}; - } + align-items: center; + gap: 12px; `; -const Footer = styled.div` - position: fixed; - bottom: 0; - left: 0; - width: 100%; +const OptionIcon = styled.div` + color: ${ThemeColors.PRIMARY}; + font-size: 18px; display: flex; - justify-content: flex-end; - gap: 12px; - padding: 16px; - background-color: ${ThemeColors.SURFACE_DIM}; - margin-top: auto; + align-items: center; +`; + +const OptionTitle = styled.div` + font-size: 14px; + font-family: GilmerBold; + color: ${ThemeColors.ON_SURFACE}; +`; + +const OptionDescription = styled.div` + font-size: var(--vscode-font-size); + color: ${ThemeColors.ON_SURFACE_VARIANT}; + margin-left: 24px; + line-height: 1.4; `; interface AddToolProps { agentCallNode: FlowNode; - onAddNewTool: () => void; + onUseConnection?: () => void; + onUseFunction?: () => void; + onUseMcpServer?: () => void; onSave?: () => void; onBack?: () => void; } export function AddTool(props: AddToolProps): JSX.Element { - const { agentCallNode, onAddNewTool, onSave } = props; - const { rpcClient } = useRpcContext(); - - const [agentNode, setAgentNode] = useState(null); - const [existingTools, setExistingTools] = useState([]); - const [existingMcpToolkits, setExistingMcpToolkits] = useState([]); - const [selectedTool, setSelectedTool] = useState(null); - - const [loading, setLoading] = useState(false); - const [savingForm, setSavingForm] = useState(false); - - const [showAddMcpServer, setShowAddMcpServer] = useState(false); - const agentFilePath = useRef(""); - - useEffect(() => { - initPanel(); - }, [agentCallNode]); - - const initPanel = async () => { - setLoading(true); - agentFilePath.current = await getAgentFilePath(rpcClient); - await fetchExistingTools(); - await fetchAgentNode(); - setLoading(false); - }; + const { onUseConnection, onUseFunction, onUseMcpServer } = props; - const fetchAgentNode = async () => { - const agentNode = await findAgentNodeFromAgentCallNode(agentCallNode, rpcClient); - setAgentNode(agentNode); - - if (agentNode?.properties?.tools?.value) { - const toolsString = agentNode.properties.tools.value.toString(); - const mcpToolkits = await extractMcpToolkits(toolsString); - setExistingMcpToolkits(mcpToolkits); - console.log("existingMcpToolkits", existingMcpToolkits); - } + const handleUseConnection = () => { + onUseConnection?.(); }; - const handleBack = () => { - if (showAddMcpServer) { - setShowAddMcpServer(false); - } else { - props.onBack?.(); - } + const handleUseFunction = () => { + onUseFunction?.(); }; - - const extractMcpToolkits = async (toolsString: string): Promise => { - const variableNodes = await rpcClient.getBIDiagramRpcClient().getModuleNodes(); - // Defensive: check for array - const variables = variableNodes.flowModel?.variables || []; - return variables - .filter((v: any) => v?.properties?.type?.value === "ai:McpToolKit") - .map((v: any) => v?.properties?.variable?.value) - .filter(Boolean); - }; - - const fetchExistingTools = async () => { - const existingTools = await rpcClient.getAIAgentRpcClient().getTools({ filePath: agentFilePath.current }); - setExistingTools(existingTools.tools); - }; - - const handleToolSelection = (tool: string) => { - setSelectedTool(tool); - }; - - const handleAddNewTool = () => { - onAddNewTool(); - }; - - const handleAddMcpServer = () => { - setShowAddMcpServer(true); + const handleUseMcpServer = () => { + onUseMcpServer?.(); }; - const handleOnSave = async () => { - setSavingForm(true); - const updatedAgentNode = await addToolToAgentNode(agentNode, selectedTool); - await rpcClient - .getBIDiagramRpcClient() - .getSourceCode({ filePath: agentFilePath.current, flowNode: updatedAgentNode }); - onSave?.(); - setSavingForm(false); - }; - - const handleMcpServerSave = () => { - setShowAddMcpServer(false); - onSave?.(); - }; - - const hasExistingTools = existingTools.length > 0; - const hasExistingMcpToolkits = existingMcpToolkits.length > 0; - const isToolSelected = selectedTool !== null; - - if (showAddMcpServer) { - return ( - - ); - } - return ( - {loading && ( - - - - )} - {!loading && (hasExistingTools || hasExistingMcpToolkits) && ( - <> - - Choose a tool / MCP server to add to the Agent or create a new one. - - {( - <> - - Tools - - - {existingTools.map((tool) => ( - handleToolSelection(tool)} - key={tool} - isSelected={selectedTool === tool} - > - {tool} - - ))} - - )} - - - MCP Servers - - - {existingMcpToolkits.map((mcpToolkit, index) => ( - - {mcpToolkit} - - ))} - -
- - {"Add to Agent"} - -
- - )} - {!loading && !hasExistingTools && !hasExistingMcpToolkits && !selectedTool && ( - - - No tools / MCP servers are currently available in your integration. Add a new tool / MCP server to improve your agent's - capabilities. - - - - Create New Tool - - - - Add New MCP Server - - - )} + + Create and add tools to extend your agent's capabilities. Choose the method you'd like to use: + + + + + + + + + Use Connection + + + Turn an existing connection (HTTP client, database, message broker) into an agent tool. + Your agent will be able to make requests and interact with these services. + + + + + + + + + Use Function + + + Create a tool from an existing function in your integration or build a new custom function. + This gives your agent the ability to execute specific business logic. + + + + + + + + + Use MCP Server + + + Connect to a Model Context Protocol (MCP) server to access pre-built tools and resources. + MCP servers provide standardized access to external systems and data sources. + + +
); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewTool.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewTool.tsx index 2c69f92a583..4e34ed4c025 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewTool.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewTool.tsx @@ -19,7 +19,6 @@ import { useEffect, useRef, useState } from "react"; import styled from "@emotion/styled"; import { FlowNode } from "@wso2/ballerina-core"; -import { URI, Utils } from "vscode-uri"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { AIAgentSidePanel, ExtendedAgentToolRequest } from "./AIAgentSidePanel"; import { RelativeLoader } from "../../../components/RelativeLoader"; @@ -33,15 +32,21 @@ const LoaderContainer = styled.div` height: 100%; `; +export enum NewToolSelectionMode { + CONNECTION = "connection", + FUNCTION = "function", + ALL = "all", +} + interface NewToolProps { agentCallNode: FlowNode; + mode?: NewToolSelectionMode; onBack?: () => void; onSave?: () => void; } export function NewTool(props: NewToolProps): JSX.Element { - const { agentCallNode, onSave, onBack } = props; - console.log(">>> NewTool props", props); + const { agentCallNode, mode = NewToolSelectionMode.ALL, onSave, onBack } = props; const { rpcClient } = useRpcContext(); const [agentNode, setAgentNode] = useState(null); @@ -66,7 +71,6 @@ export function NewTool(props: NewToolProps): JSX.Element { const fetchAgentNode = async () => { const agentNode = await findAgentNodeFromAgentCallNode(agentCallNode, rpcClient); setAgentNode(agentNode); - console.log(">>> agent node", { agentNode }); }; const handleOnSubmit = async (data: ExtendedAgentToolRequest) => { @@ -92,7 +96,6 @@ export function NewTool(props: NewToolProps): JSX.Element { // create tool from existing function // get function definition const functionDefinition = data.functionNode; - console.log(">>> response get function definition", { functionDefinition }); if (!functionDefinition) { console.error("Function definition not found"); return; @@ -149,7 +152,7 @@ export function NewTool(props: NewToolProps): JSX.Element { return ( <> {agentFilePath.current && !savingForm && ( - + )} {(!agentFilePath.current || savingForm) && ( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx index 409c26aa2a8..80fb85a018c 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/PanelManager.tsx @@ -17,7 +17,15 @@ */ import { PanelContainer, NodeList, CardList, ExpressionFormField } from "@wso2/ballerina-side-panel"; -import { FlowNode, LineRange, SubPanel, SubPanelView, FUNCTION_TYPE, ToolData, NodeMetadata } from "@wso2/ballerina-core"; +import { + FlowNode, + LineRange, + SubPanel, + SubPanelView, + FUNCTION_TYPE, + ToolData, + NodeMetadata, +} from "@wso2/ballerina-core"; import { HelperView } from "../HelperView"; import FormGenerator from "../Forms/FormGenerator"; import { getContainerTitle, getSubPanelWidth } from "../../../utils/bi"; @@ -28,7 +36,7 @@ import { NewAgent } from "../AIChatAgent/NewAgent"; import { AddTool } from "../AIChatAgent/AddTool"; import { AddMcpServer } from "../AIChatAgent/AddMcpServer"; import { useEffect, useState } from "react"; -import { NewTool } from "../AIChatAgent/NewTool"; +import { NewTool, NewToolSelectionMode } from "../AIChatAgent/NewTool"; import styled from "@emotion/styled"; import { MemoryManagerConfig } from "../AIChatAgent/MemoryManagerConfig"; @@ -54,6 +62,8 @@ export enum SidePanelView { NEW_AGENT = "NEW_AGENT", ADD_TOOL = "ADD_TOOL", NEW_TOOL = "NEW_TOOL", + NEW_TOOL_FROM_CONNECTION = "NEW_TOOL_FROM_CONNECTION", + NEW_TOOL_FROM_FUNCTION = "NEW_TOOL_FROM_FUNCTION", ADD_MCP_SERVER = "ADD_MCP_SERVER", EDIT_MCP_SERVER = "EDIT_MCP_SERVER", AGENT_TOOL = "AGENT_TOOL", @@ -157,6 +167,7 @@ export function PanelManager(props: PanelManagerProps) { } = props; const [panelView, setPanelView] = useState(sidePanelView); + useEffect(() => { setPanelView(sidePanelView); }, [sidePanelView]); @@ -177,6 +188,18 @@ export function PanelManager(props: PanelManagerProps) { setPanelView(SidePanelView.ADD_TOOL); }; + const handleOnUseConnection = () => { + setPanelView(SidePanelView.NEW_TOOL_FROM_CONNECTION); + }; + + const handleOnUseFunction = () => { + setPanelView(SidePanelView.NEW_TOOL_FROM_FUNCTION); + }; + + const handleOnUseMcpServer = () => { + setPanelView(SidePanelView.ADD_MCP_SERVER); + }; + const handleSubmitAndClose = () => { onSubmitForm(); onClose(); @@ -223,25 +246,67 @@ export function PanelManager(props: PanelManagerProps) { ); case SidePanelView.ADD_TOOL: - return ; + return ( + + ); case SidePanelView.ADD_MCP_SERVER: return ( ); case SidePanelView.EDIT_MCP_SERVER: - return ; + return ( + + ); case SidePanelView.NEW_TOOL: - return ; + return ( + + ); + + case SidePanelView.NEW_TOOL_FROM_CONNECTION: + return ( + + ); + + case SidePanelView.NEW_TOOL_FROM_FUNCTION: + return ( + + ); case SidePanelView.AGENT_TOOL: const selectedTool = (selectedNode?.metadata.data as NodeMetadata).tools?.find( @@ -336,9 +401,7 @@ export function PanelManager(props: PanelManagerProps) { onClose={onClose} title={"Vector Stores"} searchPlaceholder={"Search vector stores"} - onSearchTextChange={(searchText) => - onSearchVectorStore?.(searchText, FUNCTION_TYPE.REGULAR) - } + onSearchTextChange={(searchText) => onSearchVectorStore?.(searchText, FUNCTION_TYPE.REGULAR)} onBack={canGoBack ? onBack : undefined} /> ); @@ -427,7 +490,10 @@ export function PanelManager(props: PanelManagerProps) { }; const onBackCallback = - panelView === SidePanelView.NEW_TOOL + panelView === SidePanelView.NEW_TOOL || + panelView === SidePanelView.NEW_TOOL_FROM_CONNECTION || + panelView === SidePanelView.NEW_TOOL_FROM_FUNCTION || + panelView === SidePanelView.ADD_MCP_SERVER ? handleOnBackToAddTool : panelView === SidePanelView.NEW_AGENT ? onBack From 8e7a1ac88f751d8540ade07998498d51a13ddbe3 Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Sun, 27 Jul 2025 20:49:08 +0530 Subject: [PATCH 216/349] Add extension setting to include current org --- .../ballerina-core/src/interfaces/extended-lang-client.ts | 1 + workspaces/ballerina/ballerina-extension/package.json | 8 ++++++++ .../ballerina/ballerina-extension/src/core/extension.ts | 8 ++++++-- .../ballerina/ballerina-extension/src/core/preferences.ts | 1 + .../src/rpc-managers/bi-diagram/rpc-manager.ts | 4 ++++ 5 files changed, 20 insertions(+), 2 deletions(-) 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 1ec2ebc2625..08a6fd1b16e 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -836,6 +836,7 @@ export type SearchQueryParams = { limit?: number; offset?: number; includeAvailableFunctions?: string; + includeCurrentOrganizationInSearch?: boolean; } export type SearchKind = 'FUNCTION' | 'CONNECTOR' | 'TYPE' | "NP_FUNCTION" | "MODEL_PROVIDER" | "VECTOR_STORE" | "EMBEDDING_PROVIDER" | "VECTOR_KNOWLEDGE_BASE"; diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 594ced0b4b0..a891a5183bb 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -212,6 +212,14 @@ "type": "boolean", "default": true, "description": "Enable AI suggestions in the Flow Diagram View." + }, + "ballerina.includeCurrentOrganizationInSearch": { + "type": "boolean", + "default": false, + "description": "Include components from the current organization in the search. This queries the Ballerina Central using the organization specified in the `Ballerina.toml`.", + "tags": [ + "experimental" + ] } } }, diff --git a/workspaces/ballerina/ballerina-extension/src/core/extension.ts b/workspaces/ballerina/ballerina-extension/src/core/extension.ts index 91925e8ad37..1cd54047dcb 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extension.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extension.ts @@ -47,7 +47,8 @@ import { DEFINE_BALLERINA_INTEGRATOR_SCOPE, SHOW_LIBRARY_CONFIG_VARIABLES, LANG_SERVER_PATH, - USE_BALLERINA_CLI_LANG_SERVER + USE_BALLERINA_CLI_LANG_SERVER, + INCLUDE_CURRENT_ORGANIZATION_IN_SEARCH } from "./preferences"; import TelemetryReporter from "vscode-extension-telemetry"; @@ -84,7 +85,6 @@ export enum WEBVIEW_TYPE { BBE, CONFIGURABLE } - export interface ConstructIdentifier { filePath: string; kind: string; @@ -1722,6 +1722,10 @@ export class BallerinaExtension { return workspace.getConfiguration().get(SHOW_LIBRARY_CONFIG_VARIABLES); } + public getIncludeCurrentOrgComponents(): boolean { + return workspace.getConfiguration().get(INCLUDE_CURRENT_ORGANIZATION_IN_SEARCH); + } + public getDocumentContext(): DocumentContext { return this.documentContext; } diff --git a/workspaces/ballerina/ballerina-extension/src/core/preferences.ts b/workspaces/ballerina/ballerina-extension/src/core/preferences.ts index 3121b3afab9..b8e62863575 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/preferences.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/preferences.ts @@ -38,3 +38,4 @@ export const DEFINE_BALLERINA_INTEGRATOR_SCOPE = "ballerina.scope"; export const SHOW_LIBRARY_CONFIG_VARIABLES = "ballerina.showLibraryConfigVariables"; // this setting is not visible to the extension user export const LANG_SERVER_PATH = "ballerina.langServerPath"; // this setting is not visible to the extension user export const USE_BALLERINA_CLI_LANG_SERVER = "ballerina.useDistributionLanguageServer"; +export const INCLUDE_CURRENT_ORGANIZATION_IN_SEARCH = "ballerina.includeCurrentOrganizationInSearch"; 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 f33425140a9..4ea685866f6 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 @@ -1536,6 +1536,10 @@ export class BiDiagramRpcManager implements BIDiagramAPI { async search(params: BISearchRequest): Promise { return new Promise((resolve, reject) => { + params.queryMap = { + ...params.queryMap, + includeCurrentOrganizationInSearch: extension.ballerinaExtInstance.getIncludeCurrentOrgComponents(), + }; StateMachine.langClient().search(params).then((res) => { resolve(res); }).catch((error) => { From c7243771d8ef05b20abb255d6fbddf1e568c1549 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Mon, 28 Jul 2025 11:32:52 +0530 Subject: [PATCH 217/349] Add updateSourceCodeIteratively function to handle multiple file text edits --- .../rpc-managers/inline-data-mapper/utils.ts | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/inline-data-mapper/utils.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/inline-data-mapper/utils.ts index b77551183f4..5f8692f8236 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/inline-data-mapper/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/inline-data-mapper/utils.ts @@ -27,7 +27,7 @@ import { TextEdit, traverseFlow } from "@wso2/ballerina-core"; -import { updateSourceCode } from "../../utils"; +import { updateSourceCode, UpdateSourceCodeRequest } from "../../utils"; import { StateMachine, updateInlineDataMapperView } from "../../stateMachine"; import { VariableFindingVisitor } from "./VariableFindingVisitor"; @@ -87,6 +87,41 @@ export async function fetchSubMappingCodeData( return response.codedata; } +/** + * Updates the source code iteratively by applying text edits. + * If only one file is edited, it directly updates that file. + * @param updateSourceCodeRequest - The request containing text edits to apply. + * @returns Updated artifacts after applying the last text edits. + */ + +export async function updateSourceCodeIteratively(updateSourceCodeRequest: UpdateSourceCodeRequest){ + const textEdits = updateSourceCodeRequest.textEdits; + const filePaths = Object.keys(textEdits); + + if (filePaths.length <= 1) { + return await updateSourceCode(updateSourceCodeRequest); + } + + // need to prioritize if file path ends with functions.bal + filePaths.sort((a, b) => { + // Prioritize files ending with functions.bal + const aEndsWithFunctions = a.endsWith('functions.bal') ? 1 : 0; + const bEndsWithFunctions = b.endsWith('functions.bal') ? 1 : 0; + return bEndsWithFunctions - aEndsWithFunctions; // Sort descending + }); + + const requests: UpdateSourceCodeRequest[] = filePaths.map(filePath => ({ + textEdits: { [filePath]: textEdits[filePath] } + })); + + let updatedArtifacts: ProjectStructureArtifactResponse[]; + for (const request of requests) { + updatedArtifacts = await updateSourceCode(request); + } + + return updatedArtifacts; +} + /** * Updates the source code with text edits and retrieves the updated code data for the variable being edited. * @throws {Error} When source update fails or required data cannot be found @@ -104,7 +139,7 @@ export async function updateSource( try { // Update source code and get artifacts - const updatedArtifacts = await updateSourceCode({ textEdits }); + const updatedArtifacts = await updateSourceCodeIteratively({ textEdits }); // Find the artifact that contains our code changes const relevantArtifact = findRelevantArtifact(updatedArtifacts, filePath, codedata.lineRange); From 5a2534e60acfe7b71b80352879c9677cabc08f9d Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Mon, 28 Jul 2025 11:44:35 +0530 Subject: [PATCH 218/349] Update server options to exclude diagram-util jar in from local distribution --- .../ballerina/ballerina-extension/src/utils/server/server.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/src/utils/server/server.ts b/workspaces/ballerina/ballerina-extension/src/utils/server/server.ts index 74ffd6ac4ac..7a83aa4a6ef 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/server/server.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/server/server.ts @@ -240,7 +240,8 @@ function getServerOptionsUsingJava(extension: BallerinaExtension): ServerOptions 'test-manager-service*', 'language-server*', "bal-shell-service*", - "org.eclipse.lsp4j*" + "org.eclipse.lsp4j*", + "diagram-util*" ]; // Generate paths for ballerina home jars using dynamic discovery (excluding specified patterns) From bbc0ffae6a73acd1083217dd8262c76dabfe6818 Mon Sep 17 00:00:00 2001 From: Chamod Abeywickrama <81417619+KCSAbeywickrama@users.noreply.github.com> Date: Mon, 28 Jul 2025 11:50:15 +0530 Subject: [PATCH 219/349] Update workspaces/ballerina/ballerina-extension/src/rpc-managers/inline-data-mapper/utils.ts Co-authored-by: Madusha Gunasekera --- .../src/rpc-managers/inline-data-mapper/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/inline-data-mapper/utils.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/inline-data-mapper/utils.ts index 5f8692f8236..5ea6638b966 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/inline-data-mapper/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/inline-data-mapper/utils.ts @@ -98,7 +98,7 @@ export async function updateSourceCodeIteratively(updateSourceCodeRequest: Updat const textEdits = updateSourceCodeRequest.textEdits; const filePaths = Object.keys(textEdits); - if (filePaths.length <= 1) { + if (filePaths.length == 1) { return await updateSourceCode(updateSourceCodeRequest); } From 0c107692d9bca78f9bde805bde97047b8c15ed22 Mon Sep 17 00:00:00 2001 From: Chinthaka Jayatilake <37581983+ChinthakaJ98@users.noreply.github.com> Date: Mon, 28 Jul 2025 13:15:13 +0530 Subject: [PATCH 220/349] Fix synapse config formatting issue --- workspaces/mi/mi-extension/src/lang-client/activator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/mi/mi-extension/src/lang-client/activator.ts b/workspaces/mi/mi-extension/src/lang-client/activator.ts index e9acd5f9070..2e29a458212 100644 --- a/workspaces/mi/mi-extension/src/lang-client/activator.ts +++ b/workspaces/mi/mi-extension/src/lang-client/activator.ts @@ -216,7 +216,7 @@ export class MILanguageClient { fileEvents: workspace.createFileSystemWatcher(new RelativePattern(workspaceFolder, '**/*.zip')) }, // Register the server for synapse xml documents - documentSelector: [{ scheme: 'file', language: 'SynapseXml', pattern: `${workspaceFolder.uri.fsPath}/**/*` }], + documentSelector: [{ scheme: 'file', language: 'SynapseXml' }], middleware: { workspace: { didChangeConfiguration: async () => { From 5add6868d1a38f58e9449654b1bbd0aa461eb9bd Mon Sep 17 00:00:00 2001 From: kaumini Date: Mon, 28 Jul 2025 14:10:58 +0530 Subject: [PATCH 221/349] Make configurations entry unexandable in tree view --- .../src/project-explorer/project-explorer-provider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/bi/bi-extension/src/project-explorer/project-explorer-provider.ts b/workspaces/bi/bi-extension/src/project-explorer/project-explorer-provider.ts index 4eb396051c6..759c6ac10e4 100644 --- a/workspaces/bi/bi-extension/src/project-explorer/project-explorer-provider.ts +++ b/workspaces/bi/bi-extension/src/project-explorer/project-explorer-provider.ts @@ -277,7 +277,7 @@ function getEntriesBI(components: ProjectStructureResponse): ProjectExplorerEntr // ---------- Configurations ---------- const configs = new ProjectExplorerEntry( "Configurations", - vscode.TreeItemCollapsibleState.Expanded, + vscode.TreeItemCollapsibleState.None, null, 'config', false From 0a311c1672c78d8f2bdba724b94735b09b4b0f49 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Mon, 28 Jul 2025 14:18:40 +0530 Subject: [PATCH 222/349] Refactor updateCurrentArtifactLocation function to remove unnecessary identifier parameter --- .../src/views/BI/FlowDiagram/index.tsx | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index 97129ad9a16..ee584c2ddc1 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -633,11 +633,11 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { filePath: model.fileName, queryMap: searchText.trim() ? { - q: searchText, - limit: 12, - offset: 0, - includeAvailableFunctions: "true", - } + q: searchText, + limit: 12, + offset: 0, + includeAvailableFunctions: "true", + } : undefined, searchKind, }; @@ -712,10 +712,10 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { // await handleSearch(searchText, functionType, "VECTOR_KNOWLEDGE_BASE"); }; - const updateCurrentArtifactLocation = async (artifacts: UpdatedArtifactsResponse, identifier?: string) => { - console.log(">>> Updating current artifact location", { artifacts, identifier }); + const updateCurrentArtifactLocation = async (artifacts: UpdatedArtifactsResponse) => { + console.log(">>> Updating current artifact location", { artifacts }); // Get the updated component and update the location - const currentIdentifier = identifier || (await rpcClient.getVisualizerLocation()).identifier; + const currentIdentifier = (await rpcClient.getVisualizerLocation()).identifier; // Find the correct artifact by currentIdentifier (id) let currentArtifact = artifacts.artifacts.at(0); artifacts.artifacts.forEach((artifact) => { @@ -734,22 +734,22 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }); if (currentArtifact) { console.log(">>> currentArtifact", currentArtifact); - if (identifier && isCreatingNewModelProvider.current) { + if (isCreatingNewModelProvider.current) { isCreatingNewModelProvider.current = false; await handleModelProviderAdded(); return; } - if (identifier && isCreatingNewVectorStore.current) { + if (isCreatingNewVectorStore.current) { isCreatingNewVectorStore.current = false; await handleVectorStoreAdded(); return; } - if (identifier && isCreatingNewEmbeddingProvider.current) { + if (isCreatingNewEmbeddingProvider.current) { isCreatingNewEmbeddingProvider.current = false; await handleEmbeddingProviderAdded(); return; } - if (identifier && isCreatingNewVectorKnowledgeBase.current) { + if (isCreatingNewVectorKnowledgeBase.current) { isCreatingNewVectorKnowledgeBase.current = false; await handleVectorKnowledgeBaseAdded(); return; @@ -1035,8 +1035,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { console.log(">>> Updated source code", response); if (response.artifacts.length > 0) { selectedNodeRef.current = undefined; - const identifier = (updatedNode.properties?.variable?.value || "") as string; - await updateCurrentArtifactLocation(response, identifier); + await updateCurrentArtifactLocation(response); } else { console.error(">>> Error updating source code", response); } From e6102771e1562ffe6068a8d985c285ea55403aed Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Mon, 28 Jul 2025 14:25:28 +0530 Subject: [PATCH 223/349] Update ResponseItem component to prioritize response name in display logic --- .../Forms/ResourceForm/ResourceResponse/ResponseItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourceResponse/ResponseItem.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourceResponse/ResponseItem.tsx index 4245ae0c636..f23eeb96776 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourceResponse/ResponseItem.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceDesigner/Forms/ResourceForm/ResourceResponse/ResponseItem.tsx @@ -70,7 +70,7 @@ export function ResponseItem(props: ParamItemProps) { className={readonly ? disabledHeaderLabel : headerLabelStyles} onClick={handleEdit} > - {response.type.value || response.body.value || "anydata"} + {response.name.value || response.body.value || response.type.value || "anydata"} {!readonly && ( From 7504d813eda8da336157e09d24421f848fcb8a7c Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Mon, 28 Jul 2025 14:39:36 +0530 Subject: [PATCH 224/349] Remove unused forceUpdate state from BIFlowDiagram component --- .../ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index 5c153563075..ee584c2ddc1 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -115,7 +115,6 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { const [updatedExpressionField, setUpdatedExpressionField] = useState(undefined); const [breakpointInfo, setBreakpointInfo] = useState(); const [selectedMcpToolkitName, setSelectedMcpToolkitName] = useState(undefined); - const [forceUpdate, setForceUpdate] = useState(0); // Navigation stack for back navigation const [navigationStack, setNavigationStack] = useState([]); @@ -445,7 +444,6 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { if (matchingNode && matchingNode.id !== selectedNodeRef.current.id) { selectedNodeRef.current = matchingNode; targetRef.current = matchingNode.codedata.lineRange; - setForceUpdate(prev => prev + 1); } } }, [model]); From 9388175624d08561639a9a5001946782be55a55e Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Mon, 28 Jul 2025 14:40:56 +0530 Subject: [PATCH 225/349] Refactor updateCurrentArtifactLocation function to remove unused identifier parameter --- .../src/views/BI/FocusFlowDiagram/index.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx index 2c61f3e5dfd..a1d3d6fa42d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FocusFlowDiagram/index.tsx @@ -327,10 +327,10 @@ export function BIFocusFlowDiagram(props: BIFocusFlowDiagramProps) { }); }; - const updateCurrentArtifactLocation = async (artifacts: UpdatedArtifactsResponse, identifier?: string) => { - console.log(">>> Updating current artifact location", { artifacts, identifier }); + const updateCurrentArtifactLocation = async (artifacts: UpdatedArtifactsResponse) => { + console.log(">>> Updating current artifact location", { artifacts }); // Get the updated component and update the location - const currentIdentifier = identifier || (await rpcClient.getVisualizerLocation()).identifier; + const currentIdentifier = (await rpcClient.getVisualizerLocation()).identifier; // Find the correct artifact by currentIdentifier (id) let currentArtifact = artifacts.artifacts.at(0); artifacts.artifacts.forEach((artifact: any) => { From 515142726214cbae201b08a9a4ea9f453215fb42 Mon Sep 17 00:00:00 2001 From: tharindulak Date: Mon, 28 Jul 2025 14:55:17 +0530 Subject: [PATCH 226/349] Remove test vulnerable package --- .github/workflows/build.yml | 8 -------- workspaces/common-libs/ui-toolkit/package.json | 1 - 2 files changed, 9 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0760d099366..37a52a9b0b9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -335,14 +335,6 @@ jobs: exit 1 fi - - name: Security scan diagnostics - if: failure() - run: | - echo "🔍 Security Scan Diagnostics:" - echo "Trivy version: $(trivy version --format json | jq -r '.Version' 2>/dev/null || trivy version)" - echo "Scan completed with vulnerabilities found" - echo "Review the vulnerability table above for details and remediation steps" - ExtTest_Ballerina: name: Run Ballerina extension tests needs: Build_Stage diff --git a/workspaces/common-libs/ui-toolkit/package.json b/workspaces/common-libs/ui-toolkit/package.json index 0151a5fb2bd..d221f13b2d3 100644 --- a/workspaces/common-libs/ui-toolkit/package.json +++ b/workspaces/common-libs/ui-toolkit/package.json @@ -33,7 +33,6 @@ "@vscode/codicons": "0.0.36", "@vscode/webview-ui-toolkit": "~1.4.0", "@wso2/font-wso2-vscode": "workspace:*", - "axios": "0.21.0", "classnames": "^2.5.1", "lodash": "~4.17.21", "monaco-editor": "~0.52.2", From 943c91fa9fde922235e13206196c0696d0285f0c Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Mon, 28 Jul 2025 14:57:00 +0530 Subject: [PATCH 227/349] Add forceUpdate state to BIFlowDiagram component for triggering re-renders --- .../ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index ee584c2ddc1..5c153563075 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -115,6 +115,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { const [updatedExpressionField, setUpdatedExpressionField] = useState(undefined); const [breakpointInfo, setBreakpointInfo] = useState(); const [selectedMcpToolkitName, setSelectedMcpToolkitName] = useState(undefined); + const [forceUpdate, setForceUpdate] = useState(0); // Navigation stack for back navigation const [navigationStack, setNavigationStack] = useState([]); @@ -444,6 +445,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { if (matchingNode && matchingNode.id !== selectedNodeRef.current.id) { selectedNodeRef.current = matchingNode; targetRef.current = matchingNode.codedata.lineRange; + setForceUpdate(prev => prev + 1); } } }, [model]); From 3ac7eb12af9b26b48c7f88a480c390b9719516d4 Mon Sep 17 00:00:00 2001 From: Vellummyilum Vinoth Date: Mon, 28 Jul 2025 15:10:30 +0530 Subject: [PATCH 228/349] Migrate inline datamapper backend to extension side --- .../ai/service/datamapper/constant.ts | 78 +++ .../ai/service/datamapper/datamapper.ts | 54 +- .../service/datamapper/inline_datamapper.ts | 556 ++++++++++++++++++ .../ai/service/datamapper/inline_prompt.ts | 146 +++++ .../features/ai/service/datamapper/types.ts | 16 + .../src/rpc-managers/ai-panel/inline-utils.ts | 43 +- .../views/AIPanel/components/AIChat/index.tsx | 9 +- 7 files changed, 812 insertions(+), 90 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/constant.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/inline_datamapper.ts create mode 100644 workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/inline_prompt.ts diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/constant.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/constant.ts new file mode 100644 index 00000000000..2de7e713fb2 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/constant.ts @@ -0,0 +1,78 @@ +// 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. + +// ============================================================================= +// OPERATION TYPE CONSTANTS +// ============================================================================= +const DIRECT = "DIRECT"; +const LENGTH = "LENGTH"; +const SPLIT = "SPLIT"; +const ADDITION = "ADDITION"; +const SUBTRACTION = "SUBTRACTION"; +const MULTIPLICATION = "MULTIPLICATION"; +const DIVISION = "DIVISION"; +const MODULAR = "MODULAR"; +const EQUAL = "EQUAL"; +const NOTEQUAL = "NOTEQUAL"; +const LESS_THAN = "LESS_THAN"; +const LESS_THAN_OR_EQUAL = "LESS_THAN_OR_EQUAL"; +const AND = "AND"; +const OR = "OR"; +const REPLACE_ALL = "REPLACE_ALL"; +const AVERAGE = "AVERAGE"; +const MAXIMUM = "MAXIMUM"; +const MINIMUM = "MINIMUM"; +const SUMMATION = "SUMMATION"; +const ABSOLUTE = "ABSOLUTE"; + +// Parameter constants +const PARAMETER_1 = "PARAMETER_1"; +const PARAMETER_2 = "PARAMETER_2"; +const PARAMETER_3 = "PARAMETER_3"; +const NAME = "NAME"; + + +// ============================================================================= +// EXPORTS +// ============================================================================= + +// Export operation constants for external use +export { + DIRECT, + LENGTH, + SPLIT, + ADDITION, + SUBTRACTION, + MULTIPLICATION, + DIVISION, + MODULAR, + EQUAL, + NOTEQUAL, + LESS_THAN, + LESS_THAN_OR_EQUAL, + AND, + OR, + REPLACE_ALL, + AVERAGE, + MAXIMUM, + MINIMUM, + SUMMATION, + ABSOLUTE, + PARAMETER_1, + PARAMETER_2, + PARAMETER_3, + NAME +}; 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 index 2a434b60ae9..bb303dafc63 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts @@ -37,36 +37,7 @@ import { } from "./types"; import { MappingSchema } from "./schema"; import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; - -// ============================================================================= -// OPERATION TYPE CONSTANTS -// ============================================================================= -const DIRECT = "DIRECT"; -const LENGTH = "LENGTH"; -const SPLIT = "SPLIT"; -const ADDITION = "ADDITION"; -const SUBTRACTION = "SUBTRACTION"; -const MULTIPLICATION = "MULTIPLICATION"; -const DIVISION = "DIVISION"; -const MODULAR = "MODULAR"; -const EQUAL = "EQUAL"; -const NOTEQUAL = "NOTEQUAL"; -const LESS_THAN = "LESS_THAN"; -const LESS_THAN_OR_EQUAL = "LESS_THAN_OR_EQUAL"; -const AND = "AND"; -const OR = "OR"; -const REPLACE_ALL = "REPLACE_ALL"; -const AVERAGE = "AVERAGE"; -const MAXIMUM = "MAXIMUM"; -const MINIMUM = "MINIMUM"; -const SUMMATION = "SUMMATION"; -const ABSOLUTE = "ABSOLUTE"; - -// Parameter constants -const PARAMETER_1 = "PARAMETER_1"; -const PARAMETER_2 = "PARAMETER_2"; -const PARAMETER_3 = "PARAMETER_3"; -const NAME = "NAME"; +import { ADDITION, DIRECT, DIVISION, LENGTH, MODULAR, MULTIPLICATION, NAME, PARAMETER_1, PARAMETER_2, SPLIT, SUBTRACTION } from "./constant"; // Operations table - In a real implementation, this would be loaded from JSON files const operationsTable: Map = new Map([ @@ -849,30 +820,9 @@ function isValidMapping(mapping: MappingJson): boolean { // EXPORTS // ============================================================================= -// Export operation constants for external use export { - DIRECT, - LENGTH, - SPLIT, - ADDITION, - SUBTRACTION, - MULTIPLICATION, - DIVISION, - MODULAR, - EQUAL, - NOTEQUAL, - LESS_THAN, - LESS_THAN_OR_EQUAL, - AND, - OR, - REPLACE_ALL, - AVERAGE, - MAXIMUM, - MINIMUM, - SUMMATION, - ABSOLUTE, + operationsTable }; - // Default export for the main function export default generateAutoMappings; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/inline_datamapper.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/inline_datamapper.ts new file mode 100644 index 00000000000..1a953f5678f --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/inline_datamapper.ts @@ -0,0 +1,556 @@ +// 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, generateObject } from "ai"; +import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; +import { + DatamapperResponse, + AIDataMappings, + MappingJson, + MappingRecord, + MappingOperation, + FieldMetadata, + ParameterMetadata, + MappingFields, + Mapping, + InlineInputs, + InlineDataMapping +} from "./types"; +import { MappingSchema } from "./schema"; +import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; +import { ADDITION, DIRECT, DIVISION, LENGTH, MODULAR, MULTIPLICATION, NAME, PARAMETER_1, PARAMETER_2, SPLIT, SUBTRACTION } from "./constant"; +import { operationsTable } from "./datamapper"; +import { getInlineDataMappingPrompt } from "./inline_prompt"; +import { ExpandedDMModel, InlineDataMapperModelResponse, IOType } from "@wso2/ballerina-core"; + +// ============================================================================= +// UTILITY FUNCTIONS FOR SCHEMA PROCESSING +// ============================================================================= + +/** + * Finds a schema type by path in the input schemas array + */ +function findSchemaTypeByPath(inputs: IOType[], path: string): IOType | null { + for (const inputSchema of inputs) { + if (inputSchema.id === path) { + return inputSchema; + } + + // Recursively search in fields + const fields = inputSchema.fields; + if (fields && Array.isArray(fields)) { + const found = findSchemaTypeByPath(fields, path); + if (found) { + return found; + } + } + + // Recursively search in member + const member = inputSchema.member; + if (member) { + const found = findSchemaTypeByPath([member], path); + if (found) { + return found; + } + } + } + return null; +} + +/** + * Removes array indices from path to normalize field paths + */ +function removeArrayIndicesFromPath(path: string): string { + const pathParts = path.split('.'); + const cleanParts: string[] = []; + + for (const part of pathParts) { + // Skip numeric indices + if (!isNaN(parseInt(part))) { + continue; + } + cleanParts.push(part); + } + + return cleanParts.join('.'); +} + +/** + * Removes output record prefix from field name + */ +function removeOutputRecordPrefix(fieldName: string, output: IOType): string { + const outputRecordName = output.variableName; + if (outputRecordName) { + const prefix = outputRecordName + "."; + if (fieldName.startsWith(prefix)) { + return fieldName.substring(prefix.length); + } + } + return fieldName; +} + +// ============================================================================= +// INLINE MAPPING EVALUATION FUNCTIONS +// ============================================================================= + +/** + * Main function to evaluate inline mappings with enhanced schema support + */ +async function evaluateInlineMappings( + path: string[], + llmGeneratedMappings: AIDataMappings, + initialRecords: InlineInputs +): Promise { + if (isMapping(llmGeneratedMappings)) { + return await processMappingOperation(path, llmGeneratedMappings, initialRecords); + } else { + return await processNestedMappings(path, llmGeneratedMappings as { [key: string]: AIDataMappings }, initialRecords); + } +} + +/** + * Processes individual mapping operations with inline schema validation + */ +async function processMappingOperation( + path: string[], + llmGeneratedMappings: Mapping, + initialRecords: InlineInputs +): Promise { + try { + const operationRecord = llmGeneratedMappings.OPERATION; + const parametersTypes: { [key: string]: ParameterMetadata } = {}; + let validParameters = false; + + for (const subKey of Object.keys(operationRecord)) { + if (subKey === NAME) { + continue; + } + + const subPathString = operationRecord[subKey as keyof MappingOperation] as string; + if (!subPathString) { + continue; + } + + const operationName = operationRecord.NAME; + const inputType = findSchemaTypeByPath(initialRecords.input, subPathString); + if (!inputType) { + continue; + } + + const fieldMetadata = getFieldMetadataFromSchemaType(inputType, subKey, operationName); + if (!fieldMetadata) { + continue; + } + + parametersTypes[subKey] = { + type: fieldMetadata.type, + input: subPathString, + optional: fieldMetadata.optional, + nullable: fieldMetadata.nullable + }; + validParameters = true; + } + + if (validParameters) { + const outputType = getOutputFieldMetadata(initialRecords.output, path); + if (!outputType) { + return null; + } + + const mapping = validateInlineMappingOperation( + operationRecord, + parametersTypes, + outputType, + path[path.length - 1], + initialRecords.input + ); + return mapping; + } + return null; + } catch (error) { + console.error('Error processing mapping operation:', error); + return null; + } +} + +/** + * Processes nested mapping structures + */ +async function processNestedMappings( + path: string[], + llmGeneratedMappings: { [key: string]: AIDataMappings }, + initialRecords: InlineInputs +): Promise { + const returnRec: { [key: string]: MappingJson } = {}; + + for (const [key, value] of Object.entries(llmGeneratedMappings)) { + if (value === null || value === undefined) { + continue; + } + + const newPath = [...path]; + const cleanKey = removeOutputRecordPrefix(key, initialRecords.output); + newPath.push(key); + + const temporaryRecord = await evaluateInlineMappings(newPath, value, initialRecords); + if (temporaryRecord) { + if (isMappingRecord(temporaryRecord) || + (typeof temporaryRecord === 'object' && Object.keys(temporaryRecord).length > 0)) { + returnRec[cleanKey] = temporaryRecord; + } + } + } + + return convertFlatToNestedMap(returnRec); +} + +// ============================================================================= +// INLINE MAPPING OPERATION VALIDATION +// ============================================================================= + +/** + * Validates inline mapping operations with enhanced error handling + */ +function validateInlineMappingOperation( + mapping: MappingOperation, + inputType: { [key: string]: ParameterMetadata }, + outputType: FieldMetadata, + name: string, + inputs: IOType[] +): MappingJson | null { + const operation = mapping.NAME; + const op = operationsTable.get(operation); + + if (!op) { + return null; + } + + switch (op.name) { + case DIRECT: { + const param = inputType[PARAMETER_1]; + if (!param) { + return null; + } + + if (!findSchemaTypeByPath(inputs, param.input)) { + throw new Error(`Input path not found for DIRECT operation: ${param.input}`); + } + + return { + operation: DIRECT, + targetType: outputType.type, + parameters: [removeArrayIndicesFromPath(param.input)] + }; + } + + case LENGTH: { + const param = inputType[PARAMETER_1]; + if (!param) { + throw new Error("Parameter 1 not found in input type for LENGTH operation"); + } + + if (!(outputType.type === "int" || outputType.type === "int|()")) { + throw new Error("Invalid output type for LENGTH operation"); + } + + if (!findSchemaTypeByPath(inputs, param.input)) { + throw new Error(`Input path not found for LENGTH operation: ${param.input}`); + } + + return { + operation: LENGTH, + targetType: outputType.type, + parameters: [removeArrayIndicesFromPath(param.input)] + }; + } + + case SPLIT: { + const paramOne = inputType[PARAMETER_1]; + const paramTwo = mapping.PARAMETER_2; + + if (!paramOne || !paramTwo) { + throw new Error("Required parameters not found in input type for SPLIT operation"); + } + + if (paramOne.type !== "regex" || + !(outputType.type === "string[]" || outputType.type === "string[]|()" || + outputType.type === "(string|())[]" || outputType.type === "(string|())[]|()")) { + throw new Error("Invalid input or output type for SPLIT operation"); + } + + if (!findSchemaTypeByPath(inputs, paramOne.input)) { + throw new Error(`Input path not found for SPLIT operation: ${paramOne.input}`); + } + + return { + operation: SPLIT, + targetType: outputType.type, + parameters: [removeArrayIndicesFromPath(paramOne.input), paramTwo] + }; + } + + default: + return null; + } +} + +// ============================================================================= +// FIELD METADATA EXTRACTION FUNCTIONS +// ============================================================================= + +/** + * Extracts field metadata from schema type with enhanced type checking + */ +function getFieldMetadataFromSchemaType( + inputType: IOType, + paramName?: string, + operationName?: string +): FieldMetadata | null { + if (paramName && operationName) { + if (operationName === SPLIT && paramName === PARAMETER_2) { + return { type: "regex", optional: false, nullable: false }; + } + } + + const kind = inputType.kind; + const typeName = inputType.typeName; + + if (!kind || !typeName) { + throw new Error("Missing kind or typeName in SchemaType"); + } + + const typeString = typeName; + const isOptional = false; // TODO: Handle optional types + let isNullable = false; // TODO: Handle nullable types + + // Check if type is nullable (contains ? or ()) + if (typeName.includes("?") || typeName.includes("()")) { + isNullable = true; + } + + return { + type: typeString, + optional: isOptional, + nullable: isNullable + }; +} + +/** + * Gets output field metadata from schema type + */ +function getOutputFieldMetadata(output: IOType, path: string[]): FieldMetadata | null { + let current = output; + + for (const pathSegment of path) { + const found = findFieldInSchemaType(current, pathSegment); + if (!found) { + return null; + } + current = found; + } + + return getFieldMetadataFromSchemaType(current); +} + +/** + * Finds a field within a schema type structure + */ +function findFieldInSchemaType(schemaType: IOType, fieldId: string): IOType | null { + const fields = schemaType.fields; + if (fields && Array.isArray(fields)) { + for (const field of fields) { + if (field.id === fieldId || field.variableName === fieldId) { + return field; + } + + const found = findFieldInSchemaType(field, fieldId); + if (found) { + return found; + } + } + } + + const member = schemaType.member; + if (member) { + if (member.id === fieldId || member.variableName === fieldId) { + return member; + } + return findFieldInSchemaType(member, fieldId); + } + + return null; +} + +/** + * Converts flat mapping structure to nested format + */ +function convertFlatToNestedMap(flatMap: { [key: string]: MappingJson }): { [key: string]: MappingJson } { + const nested: { [key: string]: MappingJson } = {}; + + for (const [flatKey, value] of Object.entries(flatMap)) { + const parts = flatKey.split('.'); + let current = nested; + + for (let i = 0; i < parts.length - 1; i++) { + const part = parts[i]; + if (!(part in current)) { + current[part] = {}; + } else if (typeof current[part] !== 'object' || current[part] === null) { + current[part] = {}; + } + current = current[part] as { [key: string]: MappingJson }; + } + + const lastPart = parts[parts.length - 1]; + current[lastPart] = value; + } + + return nested; +} + +// ============================================================================= +// ENHANCED MAIN ORCHESTRATOR FUNCTION +// ============================================================================= + +/** + * Enhanced main function for AI-powered data mapping generation with inline schema support + */ +async function mapInlineData(payload: InlineDataMapperModelResponse): Promise { + const maxRetries = 6; + let retries = 0; + + while (retries < maxRetries) { + if (retries > 1) { + console.debug("Retrying to generate mappings for the payload."); + } + + try { + // Extract existing mapping field hints + const mappingFields: { [key: string]: MappingFields } = payload.mappingsModel.mapping_fields || {}; + + // STEP 1: Generate AI-powered mappings using Claude + const generatedMappings = await getInlineMappings((payload.mappingsModel as ExpandedDMModel)?.inputs, (payload.mappingsModel as ExpandedDMModel)?.output, payload.mappingsModel.mappings, mappingFields); + + // STEP 2: Prepare inline inputs for validation + const inlineInputs: InlineInputs = { + input: (payload.mappingsModel as ExpandedDMModel)?.inputs, + output: (payload.mappingsModel as ExpandedDMModel)?.output + }; + + // STEP 3: Validate and process AI-generated mappings with inline schema + const evaluateMappingsResult = await evaluateInlineMappings([], generatedMappings, inlineInputs); + + if (evaluateMappingsResult) { + // STEP 4: Extract and structure the validated mappings + const mappings = extractMappings(evaluateMappingsResult); + return mappings; + } else { + throw new Error("Failed to generate mappings for the payload."); + } + } catch (error) { + console.error(`Error occurred while generating mappings: ${error}`); + retries += 1; + continue; + } + } + + throw new Error("Failed to generate mappings for the payload after all retries."); +} + +// Import all existing functions from the original implementation +async function getInlineMappings( + inputJsonRecord: IOType[], + outputJsonRecord: IOType, + userMappings: InlineDataMapping[], + mappingTips: { [key: string]: MappingFields } +): Promise { + const prompt = getInlineDataMappingPrompt( + JSON.stringify(inputJsonRecord), + JSON.stringify(outputJsonRecord), + JSON.stringify(userMappings), + JSON.stringify(mappingTips) + ); + + const messages: CoreMessage[] = [ + { role: "user", content: prompt } + ]; + + try { + const { object } = await generateObject({ + model: await getAnthropicClient(ANTHROPIC_SONNET_4), + maxTokens: 4096, + temperature: 0, + messages: messages, + schema: MappingSchema, + abortSignal: AIPanelAbortController.getInstance().signal, + }); + + const generatedMappings = object.generatedMappings as AIDataMappings; + return generatedMappings; + } catch (error) { + console.error("Failed to parse response:", error); + throw new Error(`Failed to parse mapping response: ${error}`); + } +} + +function extractMappings(evaluateMappingsResult: MappingJson): DatamapperResponse { + const mappings: { [key: string]: MappingJson } = {}; + + if (isMappingRecord(evaluateMappingsResult)) { + throw new Error("EvaluateMappingsResult is a MappingRecord, expected map structure."); + } + + if (typeof evaluateMappingsResult === "object" && evaluateMappingsResult !== null) { + for (const [key, value] of Object.entries(evaluateMappingsResult)) { + if (isMappingRecord(value)) { + mappings[key] = value; + } else if (typeof value === "object" && value !== null) { + const nestedMappingsResult = extractMappings(value as MappingJson); + mappings[key] = nestedMappingsResult.mappings; + } + } + } + + return { mappings }; +} + +// ============================================================================= +// UTILITY FUNCTIONS +// ============================================================================= + +function isMappingRecord(value: any): value is MappingRecord { + return value && typeof value === "object" && "operation" in value && "targetType" in value && "parameters" in value; +} + +function isMapping(value: any): value is { OPERATION: MappingOperation } { + return value && typeof value === "object" && "OPERATION" in value; +} + +// ============================================================================= +// MAIN EXPORT FUNCTION +// ============================================================================= + +export async function generateInlineAutoMappings(payload?: InlineDataMapperModelResponse): Promise { + if (!payload) { + throw new Error("Payload is required for generating auto mappings"); + } + try { + return await mapInlineData(payload); + } catch (error) { + console.error(`Error generating auto mappings: ${error}`); + throw new Error(`Failed to generate auto mappings: ${error}`); + } +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/inline_prompt.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/inline_prompt.ts new file mode 100644 index 00000000000..0918903a181 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/inline_prompt.ts @@ -0,0 +1,146 @@ +// 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. + +/** + * Generates the inline data mapping prompt for AI + */ +export function getInlineDataMappingPrompt(inputJson: string, outputJson: string, userMappings: string, mappingTips: string): string { + return `You are an assistant that can help to map attributes between multiple JSON objects (data-mapping). + +## Instructions + +Before starting the mapping process, consider the mappings provided by the user mappings and mapping tips below. Use the user's and mapping tips as a guide/tip to do the mapping process, ensuring that they are relevant to input and output JSON. Only use the tips in user's mappings and mapping tips that have input and output records and their fields and subfields are in input and output JSON. Otherwise omit the irrelevant mapping guides. + +## Input JSON + +${inputJson} + +## Output JSON + +${outputJson} + +## User's Mappings + +${userMappings} + +## Mapping Tips + +${mappingTips} + +## Mapping Rules + +Follow these rules during data mapping: + +1. One or more input JSON can be given +2. Only a single output JSON can be given +3. Mapping the fields requires performing operations on the data. Most common operation is to do a one-to-one mapping with no transformations +4. One or more fields in the input JSON may be required to construct the output field value in-case we have complex operations that require multiple input fields +5. Some input fields may not participate in any mappings if they are irrelevant to the output field +6. Some output fields may not participate in any mappings if they are irrelevant to the input field +7. Field access uses dot notation for JSON format. To access subfield "abc" from object "xyz", use "xyz.abc". For accessing fields with IDs like "input.contactInfo.email", use the exact ID path as provided in the schema. +8. Strictly follow data types accepted and returned by the operations when mapping input fields +9. When mapping, you must use operators which return the expected data type +10. When Mapping, consider the information mentioned in the comments +11. DO NOT use the value in the field "optional" when mapping the fields +12. DO NOT map anything if you aren't sure +13. If both input and output are records type, DO mapping for all its fields and subfields but DO NOT map in the root level +14. Consider constants, configurables, variables, enum values, and module variables when mapping fields +15. Constants, variables, module variables and configurables can be mapped directly using their defined values +16. Enum values should be mapped using their exact enum identifiers +17. Consider both user's mappings and mapping tips when determining field relationships and transformations +18. Mapping tips provide additional mapping context from previous operations or related mappings that can be used as reference + +## Available Operations + +### 0) Direct Mapping +- ${"DIRECT(x)"} - used to substitute with x without any transformations +- **For input fields, variables, and module variables: use field path (e.g., "input.fieldName")** +- **For constants and configurables: use their defined values** +- **For enums: use their exact enum identifiers** + +### 1) Arithmetic Expressions +- ${"ADDITION(x, y, z, ...)"} - add variables x, y and z and so on +- ${"SUBTRACTION(x, y)"} - subtract y from x +- ${"MULTIPLICATION(x, y, z, ...)"} - multiply x, y and z and so on +- ${"DIVISION(x, y)"} - divide x by y +- ${"MODULAR(x, y)"} - get the modular division between x and y i.e. x%y + +### 2) Equality Expressions +- ${"EQUAL(x, y)"} - return true if x and y are equal +- ${"NOTEQUAL(x, y)"} - return true if x and y are not equal + +### 3) Relational Expressions +- ${"LESS_THAN(x, y)"} - return true if x is less than y +- ${"LESS_THAN_OR_EQUAL(x, y)"} - return true if x is less than or equals to y + +### 4) Logical Expressions +- ${"AND(x, y)"} - return x AND y value +- ${"OR(x, y)"} - return x OR y value + +### 5) Member Access Expressions +- ${"x[y]"} - access y th element of x array object in the json + +### 6) Regex Operations +- ${"SPLIT(regex, text)"} - Split the string text based on the regex and returns an array of strings (string[]) + - Example: ${"SPLIT(\",\", \"word1, word2, word3\")"} will return a string array ["word1", "word2", "word3"] + - Example: ${"SPLIT(\" \", \"word1 word2 word3\")"} will return a string array ["word1", "word2", "word3"] +- ${"REPLACE_ALL(regex, text, replacement)"} - Replace all the instances of regex in the text using string replacement + - Example: ${"REPLACE_ALL(\" \", \"word1 word2 word3\", \"\")"} will return a string "word1word2word3" + +For above two operations, regex value must be one or combination of the following: [" ", "_", "-", "\\n", ",", "\\."], here "\\" is used to escape special characters. + +### 7) Numerical Operations +- ${"AVERAGE(x, TYPE)"} - get the average over x. x is a single array of variables of TYPE (ex - [12, 13, 14]) when TYPE is INTEGER. TYPE can be either INT, DECIMAL, or FLOAT +- ${"MAXIMUM(x, TYPE)"} - get the maximum over x. x is an array of variables of TYPE(ex - [12, 13, 14]) when TYPE is INTEGER. TYPE can be either INT, DECIMAL, or FLOAT +- ${"MINIMUM(x, TYPE)"} - get the minimum over x. x is a single array of variables of TYPE (ex - [12, 13, 14]) when TYPE is INTEGER. TYPE can be either INT, DECIMAL, or FLOAT +- ${"SUMMATION(x, TYPE)"} - get the summation over x. x is a single array of variables of TYPE(ex - [12, 13, 14]) when TYPE is INTEGER. TYPE can be either INT, DECIMAL, or FLOAT +- ${"ABSOLUTE(x, TYPE)"} - get the absolute value of the given variable of TYPE, x. TYPE can be either INT, DECIMAL, or FLOAT + +### 8) Array Operations +- ${"LENGTH(x)"} - Get the length of an array named x + +## Response Format + +Always use the following json format to respond without any markdown formatting: + +{ + "": { + "OPERATION": { + "NAME": "", + "PARAMETER_1": "", + "PARAMETER_2": "" + // ...additional parameters as needed + } + } + // ...additional fields as needed +} + +## IMPORTANT NOTES: + +- **DO NOT RETURN ANYTHING OTHER THAN THE MAPPING JSON!** +- **DO NOT ENCLOSE THE RESULT JSON WITH ANYTHING.** +- **DO NOT USE MARKDOWN CODE BLOCKS OR BACKTICKS.** +- **RETURN ONLY RAW JSON WITHOUT ANY FORMATTING OR WRAPPER.** +- **FOR DIRECT MAPPINGS:** + - **Input fields, variables, constants, configurables and module variables: use field ID/path from the input schema** + - **Enum values: use their exact enum identifiers** + - **DEFAULT VALUES AND NULL LIKE VALUES MUST NOT BE MAPPED DIRECT.** +- **Use the exact field IDs as provided in the input/output schema (e.g., "input.contactInfo.email", "output.salaryInfo.baseSalary")** +- **Consider mapping tips as additional reference for understanding field relationships and mapping patterns** +`; +} + + diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/types.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/types.ts index 60fbe082d26..28c761ba9f5 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/types.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/types.ts @@ -14,6 +14,8 @@ // specific language governing permissions and limitations // under the License. +import { IOType } from "@wso2/ballerina-core"; + // ============================================================================= // OPERATION TYPES // ============================================================================= @@ -160,3 +162,17 @@ export interface ChatResponse { }; } +// ============================================================================= +// INLINE DATAMAPPING TYPES +// ============================================================================= + +export interface InlineDataMapping { + output: string; + inputs?: string[]; + expression: string; +} + +export interface InlineInputs { + input: IOType[]; + output: IOType; +} diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/inline-utils.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/inline-utils.ts index eb3522eec8b..4ebcea4b63a 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/inline-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/inline-utils.ts @@ -13,6 +13,8 @@ import { getAccessToken, getLoginMethod, getRefreshedAccessToken } from "../../u import { NOT_LOGGED_IN, TIMEOUT } from "../../views/ai-panel/errorCodes"; import { AIStateMachine } from "../../views/ai-panel/aiMachine"; import { BACKEND_URL } from "../../features/ai/utils"; +import { DatamapperResponse } from "../../../src/features/ai/service/datamapper/types"; +import { generateInlineAutoMappings } from "../../../src/features/ai/service/datamapper/inline_datamapper"; let abortController = new AbortController(); @@ -407,18 +409,8 @@ export async function getInlineParamDefinitions( }; } -async function sendInlineDatamapperRequest(inlineDataMapperResponse: InlineDataMapperModelResponse | ErrorCode, accessToken: string | ErrorCode): Promise { - const response = await fetchWithTimeout(BACKEND_URL + "/inline/datamapper", { - method: "POST", - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json', - 'User-Agent': 'Ballerina-VSCode-Plugin', - 'Authorization': 'Bearer ' + accessToken - }, - body: JSON.stringify(inlineDataMapperResponse) - }, REQUEST_TIMEOUT); - +async function sendInlineDatamapperRequest(inlineDataMapperResponse: InlineDataMapperModelResponse | ErrorCode): Promise { + const response: DatamapperResponse = await generateInlineAutoMappings(inlineDataMapperResponse as InlineDataMapperModelResponse); return response; } @@ -433,32 +425,9 @@ async function getInlineDatamapperCode(inlineDataMapperResponse: InlineDataMappe return NOT_LOGGED_IN; }); } - let response = await sendInlineDatamapperRequest(inlineDataMapperResponse, accessToken); - if (isErrorCode(response)) { - return (response as ErrorCode); - } - - response = (response as Response); - - // Refresh - if (response.status === 401) { - const newAccessToken = await getRefreshedAccessToken(); - if (!newAccessToken) { - AIStateMachine.service().send(AIMachineEventType.LOGOUT); - return; - } - let retryResponse: Response | ErrorCode = await sendInlineDatamapperRequest(inlineDataMapperResponse, newAccessToken); - - if (isErrorCode(retryResponse)) { - return (retryResponse as ErrorCode); - } + let response: DatamapperResponse = await sendInlineDatamapperRequest(inlineDataMapperResponse); - retryResponse = (retryResponse as Response); - let intermediateMapping = await filterResponse(retryResponse); - let finalCode = await generateBallerinaCode(intermediateMapping, parameterDefinitions, "", nestedKeyArray); - return finalCode; - } - let intermediateMapping = await filterResponse(response); + let intermediateMapping = response.mappings; let finalCode = await generateBallerinaCode(intermediateMapping, parameterDefinitions, "", nestedKeyArray); return finalCode; } catch (error) { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx index 82138c404c5..5eb826a7ffa 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx @@ -1343,8 +1343,15 @@ const AIChat: React.FC = () => { assistant_response = `Here are the data mappings:\n\n`; assistant_response += `\n**Note**: When you click **Add to Integration**, it will override your existing mappings.\n`; + + const moduleInfo = metadata.mappingsModel.output.moduleInfo; + const hasModuleInfo = moduleInfo && moduleInfo.moduleName; + + const typePrefix = hasModuleInfo + ? `${moduleInfo.moduleName.split('.').pop()}:${typeName}` + : typeName; - const formattedContent = `${typeName} ${variableName} = {\n${formatWithProperIndentation(finalContent)}\n};`; + const formattedContent = `${typePrefix} ${variableName} = {\n${formatWithProperIndentation(finalContent)}\n};`; assistant_response += `\n\`\`\`ballerina\n${formattedContent}\n\`\`\`\n`; From 08316d2ac6215daacb85af8a30f528f0c1540101 Mon Sep 17 00:00:00 2001 From: tharindulak Date: Mon, 28 Jul 2025 15:00:04 +0530 Subject: [PATCH 229/349] Fix issues --- .github/workflows/build.yml | 1 - .github/workflows/test-pr.yml | 5 - common/config/rush/pnpm-lock.yaml | 17 +--- package.json | 3 - pnpm-lock.yaml | 157 ++++++++++++++---------------- 5 files changed, 73 insertions(+), 110 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 37a52a9b0b9..57ee113365f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -327,7 +327,6 @@ jobs: exit 1 else echo "✅ SUCCESS: No security vulnerabilities detected" - echo "⚠️ WARNING: If axios 0.21.0 is installed, this result is INCORRECT" fi else echo "❌ ERROR: No scan results file generated!" diff --git a/.github/workflows/test-pr.yml b/.github/workflows/test-pr.yml index c69e0acfe22..b7a6d7cca92 100644 --- a/.github/workflows/test-pr.yml +++ b/.github/workflows/test-pr.yml @@ -9,11 +9,6 @@ concurrency: group: ${{ github.ref }} cancel-in-progress: true -permissions: - contents: read - issues: write - pull-requests: write - jobs: Build: if: github.event.pull_request.draft == false diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index d271842ec8f..3b670bc18f2 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -2851,9 +2851,6 @@ importers: '@wso2/font-wso2-vscode': specifier: workspace:* version: link:../font-wso2-vscode - axios: - specifier: 0.21.0 - version: 0.21.0 classnames: specifier: ^2.5.1 version: 2.5.1 @@ -10484,10 +10481,6 @@ packages: resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} engines: {node: '>=4'} - axios@0.21.0: - resolution: {integrity: sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==} - deprecated: Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410 - axios@1.9.0: resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} @@ -34442,12 +34435,6 @@ snapshots: axe-core@4.10.3: {} - axios@0.21.0: - dependencies: - follow-redirects: 1.15.9 - transitivePeerDependencies: - - debug - axios@1.9.0: dependencies: follow-redirects: 1.15.9 @@ -47541,7 +47528,7 @@ snapshots: schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.43.1 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@6.0.1) terser@4.8.1: dependencies: @@ -47862,7 +47849,7 @@ snapshots: semver: 7.7.2 source-map: 0.7.4 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@6.0.1) ts-mixer@6.0.4: {} diff --git a/package.json b/package.json index fd74b2bc4a2..3cdf1ca4b8f 100644 --- a/package.json +++ b/package.json @@ -16,9 +16,6 @@ "form-data": "^4.0.4" } }, - "dependencies": { - "axios": "0.21.0" - }, "scripts": { "prebuild": "pnpm run init-submodules && rush install", "init-submodules": "git submodule update --init --recursive && git submodule foreach git pull origin master", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 65055fed6da..14cfcd65e87 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,11 +20,7 @@ overrides: importers: - .: - dependencies: - axios: - specifier: 0.21.0 - version: 0.21.0 + .: {} workspaces/ballerina/ballerina-core: dependencies: @@ -813,7 +809,7 @@ importers: version: 1.57.5 '@types/webpack': specifier: ^5.28.5 - version: 5.28.5(webpack-cli@5.1.4) + version: 5.28.5(webpack-cli@4.10.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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) @@ -855,10 +851,10 @@ importers: version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.100.2(webpack-cli@5.1.4) + version: 5.100.2(webpack-cli@4.10.0) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@5.1.4)(webpack@5.100.2) + version: 5.2.2(webpack-cli@4.10.0)(webpack@5.100.2) workspaces/ballerina/bi-diagram: dependencies: @@ -1488,6 +1484,9 @@ importers: '@wso2/ballerina-rpc-client': specifier: workspace:* version: link:../ballerina-rpc-client + '@wso2/syntax-tree': + specifier: workspace:* + version: link:../syntax-tree '@wso2/ui-toolkit': specifier: workspace:* version: link:../../common-libs/ui-toolkit @@ -10634,10 +10633,6 @@ packages: resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} engines: {node: '>=4'} - axios@0.21.0: - resolution: {integrity: sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==} - deprecated: Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410 - axios@1.9.0: resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} @@ -25461,10 +25456,7 @@ snapshots: jest-runner: 25.5.4 jest-runtime: 25.5.4 transitivePeerDependencies: - - bufferutil - - canvas - supports-color - - utf-8-validate '@jest/test-sequencer@29.7.0': dependencies: @@ -26038,7 +26030,7 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.2 source-map: 0.7.4 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) optionalDependencies: '@types/webpack': 5.28.5 type-fest: 4.41.0 @@ -28565,7 +28557,7 @@ snapshots: ts-dedent: 2.2.0 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) webpack-dev-middleware: 3.7.3(webpack@5.100.2) webpack-filter-warnings-plugin: 1.2.1(webpack@5.100.2) webpack-hot-middleware: 2.26.1 @@ -28628,7 +28620,7 @@ snapshots: ts-dedent: 2.2.0 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) webpack-dev-middleware: 3.7.3(webpack@5.100.2) webpack-filter-warnings-plugin: 1.2.1(webpack@5.100.2) webpack-hot-middleware: 2.26.1 @@ -28754,7 +28746,7 @@ snapshots: ts-dedent: 2.2.0 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) webpack-dev-middleware: 3.7.3(webpack@5.100.2) webpack-filter-warnings-plugin: 1.2.1(webpack@5.100.2) webpack-hot-middleware: 2.26.1 @@ -28963,7 +28955,7 @@ snapshots: url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) webpack-dev-middleware: 6.1.3(webpack@5.100.2) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 @@ -29336,7 +29328,7 @@ snapshots: ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) optionalDependencies: typescript: 5.8.3 @@ -29364,7 +29356,7 @@ snapshots: ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) optionalDependencies: typescript: 4.9.5 @@ -29491,7 +29483,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -29556,7 +29548,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -29751,7 +29743,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -30013,7 +30005,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.4.4 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) ws: 8.18.2 x-default-browser: 0.4.0 optionalDependencies: @@ -30078,7 +30070,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.4.4 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) ws: 8.18.2 x-default-browser: 0.4.0 optionalDependencies: @@ -30143,7 +30135,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.4.4 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) ws: 8.18.2 x-default-browser: 0.4.0 optionalDependencies: @@ -30287,7 +30279,7 @@ snapshots: '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.4.2))(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.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -30310,7 +30302,7 @@ snapshots: '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -30333,7 +30325,7 @@ snapshots: '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -30636,7 +30628,7 @@ snapshots: ts-dedent: 2.2.0 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) webpack-dev-middleware: 3.7.3(webpack@5.100.2) webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -30688,7 +30680,7 @@ snapshots: ts-dedent: 2.2.0 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) webpack-dev-middleware: 3.7.3(webpack@5.100.2) webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -30792,7 +30784,7 @@ snapshots: ts-dedent: 2.2.0 url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) webpack-dev-middleware: 3.7.3(webpack@5.100.2) webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -31046,7 +31038,7 @@ snapshots: semver: 7.7.2 storybook: 8.6.14(prettier@3.6.2) tsconfig-paths: 4.2.0 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -31179,7 +31171,7 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@4.9.5) tslib: 2.8.1 typescript: 4.9.5 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) transitivePeerDependencies: - supports-color @@ -31193,7 +31185,7 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) transitivePeerDependencies: - supports-color @@ -31221,7 +31213,7 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) transitivePeerDependencies: - supports-color @@ -31522,7 +31514,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) optionalDependencies: '@babel/core': 7.28.0 typescript: 5.8.3 @@ -31585,7 +31577,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) optionalDependencies: '@babel/core': 7.28.0 typescript: 5.8.3 @@ -31648,7 +31640,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) optionalDependencies: '@babel/core': 7.28.0 typescript: 4.9.5 @@ -33196,7 +33188,7 @@ snapshots: dependencies: '@types/node': 22.15.32 tapable: 2.2.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) transitivePeerDependencies: - '@swc/core' - esbuild @@ -33237,7 +33229,6 @@ snapshots: - esbuild - uglify-js - webpack-cli - optional: true '@types/webpack@5.28.5(webpack-cli@5.1.4)': dependencies: @@ -33249,6 +33240,7 @@ snapshots: - esbuild - uglify-js - webpack-cli + optional: true '@types/webpack@5.28.5(webpack-cli@6.0.1)': dependencies: @@ -34172,7 +34164,7 @@ snapshots: '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.100.2)': dependencies: webpack: 5.100.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.100.2) + webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.100.2) '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.100.2)': dependencies: @@ -34187,7 +34179,7 @@ snapshots: '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.100.2)': dependencies: webpack: 5.100.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.100.2) + webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.100.2) '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.100.2)': dependencies: @@ -34776,12 +34768,6 @@ snapshots: axe-core@4.10.3: {} - axios@0.21.0: - dependencies: - follow-redirects: 1.15.9 - transitivePeerDependencies: - - debug - axios@1.9.0: dependencies: follow-redirects: 1.15.9 @@ -34996,7 +34982,7 @@ snapshots: dependencies: '@babel/core': 7.27.4 find-up: 5.0.0 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.4))(webpack@5.100.2): dependencies: @@ -35012,7 +34998,7 @@ snapshots: find-cache-dir: 1.0.0 loader-utils: 1.4.2 mkdirp: 0.5.6 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) babel-loader@8.4.1(@babel/core@7.27.4)(webpack@5.100.2): dependencies: @@ -35021,7 +35007,7 @@ snapshots: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) babel-loader@9.2.1(@babel/core@7.27.4)(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)): dependencies: @@ -36804,7 +36790,7 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.1 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) css-loader@5.2.7(webpack@5.100.2): dependencies: @@ -36818,7 +36804,7 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 3.3.0 semver: 7.7.2 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) css-loader@6.11.0(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)): dependencies: @@ -36857,7 +36843,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.2 optionalDependencies: - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) css-select@4.3.0: dependencies: @@ -37860,7 +37846,7 @@ snapshots: eslint: 6.8.0 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@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@6.8.0)(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(babel-eslint@10.1.0(eslint@9.27.0(jiti@2.4.2)))(eslint-plugin-flowtype@3.13.0(eslint@9.27.0(jiti@2.4.2)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2)))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.27.0(jiti@2.4.2)))(eslint-plugin-react-hooks@2.5.1(eslint@6.8.0))(eslint-plugin-react@7.37.5(eslint@9.27.0(jiti@2.4.2)))(eslint@6.8.0)(typescript@3.9.10): + eslint-config-react-app@5.2.1(@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@6.8.0)(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(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(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(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)(typescript@3.9.10): dependencies: '@typescript-eslint/eslint-plugin': 2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@6.8.0)(typescript@3.9.10) '@typescript-eslint/parser': 2.34.0(eslint@6.8.0)(typescript@3.9.10) @@ -38954,7 +38940,7 @@ snapshots: lodash.startswith: 4.2.1 minimatch: 3.1.2 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) optionalDependencies: eslint: 9.26.0(jiti@2.4.2) @@ -38982,7 +38968,7 @@ snapshots: semver: 5.7.2 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) worker-rpc: 0.1.1 optionalDependencies: eslint: 9.26.0(jiti@2.4.2) @@ -38996,7 +38982,7 @@ snapshots: semver: 5.7.2 tapable: 1.1.3 typescript: 4.9.5 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) worker-rpc: 0.1.1 optionalDependencies: eslint: 9.27.0(jiti@2.4.2) @@ -39010,7 +38996,7 @@ snapshots: semver: 5.7.2 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) worker-rpc: 0.1.1 optionalDependencies: eslint: 9.27.0(jiti@2.4.2) @@ -39031,7 +39017,7 @@ snapshots: semver: 7.7.2 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) optionalDependencies: eslint: 9.26.0(jiti@2.4.2) @@ -39051,7 +39037,7 @@ snapshots: semver: 7.7.2 tapable: 1.1.3 typescript: 4.9.5 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) optionalDependencies: eslint: 9.27.0(jiti@2.4.2) @@ -39071,7 +39057,7 @@ snapshots: semver: 7.7.2 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) optionalDependencies: eslint: 9.27.0(jiti@2.4.2) @@ -40067,7 +40053,7 @@ snapshots: pretty-error: 2.1.2 tapable: 1.1.3 util.promisify: 1.0.0 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) html-webpack-plugin@5.6.3(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)): dependencies: @@ -40087,7 +40073,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.2 optionalDependencies: - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) htmlparser2@10.0.0: dependencies: @@ -44745,7 +44731,7 @@ snapshots: postcss: 7.0.39 schema-utils: 3.3.0 semver: 7.7.2 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) postcss-loader@8.1.1(postcss@8.5.6)(typescript@5.8.3)(webpack@5.100.2): dependencies: @@ -45393,7 +45379,7 @@ snapshots: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) rc-config-loader@4.1.3: dependencies: @@ -45932,7 +45918,7 @@ snapshots: typescript: 5.8.3 uglifyjs-webpack-plugin: 1.2.5(webpack@5.100.2) url-loader: 0.6.2(file-loader@1.1.5(webpack@5.100.2)) - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) webpack-dev-server: 5.2.2(webpack@5.100.2) webpack-manifest-plugin: 1.3.2(webpack@5.100.2) whatwg-fetch: 2.0.3 @@ -47218,7 +47204,7 @@ snapshots: dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) source-map-resolve@0.6.0: dependencies: @@ -47661,13 +47647,13 @@ snapshots: dependencies: loader-utils: 2.0.4 schema-utils: 2.7.1 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) style-loader@2.0.0(webpack@5.100.2): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) style-loader@3.3.4(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)): dependencies: @@ -47679,7 +47665,7 @@ snapshots: style-loader@4.0.0(webpack@5.100.2): dependencies: - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) style-mod@4.1.2: {} @@ -48191,7 +48177,7 @@ snapshots: serialize-javascript: 5.0.1 source-map: 0.6.1 terser: 5.43.1 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) webpack-sources: 1.4.3 transitivePeerDependencies: - bluebird @@ -48226,7 +48212,7 @@ snapshots: schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.43.1 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) terser@4.8.1: dependencies: @@ -48552,7 +48538,7 @@ snapshots: semver: 7.7.2 source-map: 0.7.4 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) ts-mixer@6.0.4: {} @@ -48623,7 +48609,7 @@ snapshots: 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@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@6.8.0)(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(babel-eslint@10.1.0(eslint@9.27.0(jiti@2.4.2)))(eslint-plugin-flowtype@3.13.0(eslint@9.27.0(jiti@2.4.2)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2)))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.27.0(jiti@2.4.2)))(eslint-plugin-react-hooks@2.5.1(eslint@6.8.0))(eslint-plugin-react@7.37.5(eslint@9.27.0(jiti@2.4.2)))(eslint@6.8.0)(typescript@3.9.10) + eslint-config-react-app: 5.2.1(@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@6.8.0)(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(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(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(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)(typescript@3.9.10) eslint-plugin-flowtype: 3.13.0(eslint@6.8.0) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@6.8.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@6.8.0) @@ -49245,7 +49231,7 @@ snapshots: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) optionalDependencies: file-loader: 6.2.0(webpack@5.100.2) @@ -49776,7 +49762,7 @@ snapshots: mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) webpack-log: 2.0.0 webpack-dev-middleware@4.3.0(webpack@5.100.2): @@ -49787,7 +49773,7 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 3.3.0 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) webpack-dev-middleware@6.1.3(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)): dependencies: @@ -49830,7 +49816,7 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.2 optionalDependencies: - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) webpack-dev-server@5.2.2(webpack-cli@4.10.0)(webpack@5.100.2): dependencies: @@ -49870,7 +49856,6 @@ snapshots: - debug - supports-color - utf-8-validate - optional: true webpack-dev-server@5.2.2(webpack-cli@5.1.4)(webpack@5.100.2): dependencies: @@ -50020,7 +50005,7 @@ snapshots: webpack-dev-middleware: 7.4.2(webpack@5.100.2) ws: 8.18.2 optionalDependencies: - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.100.2(webpack-cli@4.10.0) transitivePeerDependencies: - bufferutil - debug @@ -50029,7 +50014,7 @@ snapshots: webpack-filter-warnings-plugin@1.2.1(webpack@5.100.2): dependencies: - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) + webpack: 5.100.2(webpack-cli@4.10.0) webpack-hot-middleware@2.26.1: dependencies: @@ -50218,7 +50203,7 @@ snapshots: watchpack: 2.4.4 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 5.1.4(webpack@5.100.2) + webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.100.2) transitivePeerDependencies: - '@swc/core' - esbuild From 26c7ca40af5350c2d61d26a0e4c78e28e2cea012 Mon Sep 17 00:00:00 2001 From: sachiniSam Date: Mon, 28 Jul 2025 15:44:40 +0530 Subject: [PATCH 230/349] Add loader when deleting component --- .../src/views/BI/ComponentDiagram/index.tsx | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentDiagram/index.tsx index a5506d582f9..86b2ec59646 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentDiagram/index.tsx @@ -34,6 +34,7 @@ import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { Diagram } from "@wso2/component-diagram"; import { ProgressRing, ThemeColors } from "@wso2/ui-toolkit"; import styled from "@emotion/styled"; +import { RelativeLoader } from "../../../components/RelativeLoader"; const SpinnerContainer = styled.div` display: flex; @@ -54,6 +55,7 @@ export function ComponentDiagram(props: ComponentDiagramProps) { const { projectStructure } = props; const [project, setProject] = useState(null); + const [isDeleting, setIsDeleting] = useState(false); const { rpcClient } = useRpcContext(); useEffect(() => { @@ -139,6 +141,8 @@ export function ComponentDiagram(props: ComponentDiagramProps) { const handleDeleteComponent = async (component: CDListener | CDService | CDAutomation | CDConnection) => { console.log(">>> delete component", component); + setIsDeleting(true); + rpcClient .getBIDiagramRpcClient() .deleteByComponentInfo({ @@ -156,10 +160,15 @@ export function ComponentDiagram(props: ComponentDiagramProps) { console.log(">>> Updated source code after delete", response); if (!response.textEdits) { console.error(">>> Error updating source code", response); - return; + } else { + fetchProject(); } - // Refresh the component diagram - fetchProject(); + }) + .catch((error) => { + console.error(">>> Error deleting component", error); + }) + .finally(() => { + setIsDeleting(false); }); }; @@ -174,15 +183,23 @@ export function ComponentDiagram(props: ComponentDiagramProps) { return ( {project ? ( - + <> + {isDeleting ? ( + + + + ) : ( + + )} + ) : ( From ffd233aaaa9c34dd1c0d5fe5ab9e3d98db8bfc02 Mon Sep 17 00:00:00 2001 From: madushajg Date: Mon, 28 Jul 2025 14:05:35 +0530 Subject: [PATCH 231/349] Add rpc function for get project diagnostics --- .../ballerina-core/src/rpc-types/lang-client/index.ts | 3 ++- .../ballerina-core/src/rpc-types/lang-client/rpc-type.ts | 3 ++- .../src/rpc-managers/lang-client/rpc-handler.ts | 3 +++ .../src/rpc-managers/lang-client/rpc-manager.ts | 8 ++++++++ .../src/rpc-clients/lang-client/rpc-client.ts | 7 +++++++ 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/lang-client/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/lang-client/index.ts index 8072c2ab0c9..9bc819ee589 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/lang-client/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/lang-client/index.ts @@ -16,7 +16,7 @@ * under the License. */ -import { BallerinaPackagesParams, BallerinaProjectComponents, BallerinaSTParams, ComponentModels, ComponentModelsParams, ExecutorPositions, PartialST, PartialSTParams, STModifyParams, SymbolInfo, SymbolInfoParams, SyntaxTree, SyntaxTreeParams, TypeFromExpressionParams, TypeFromSymbolParams, TypesFromFnDefinitionParams } from "../../interfaces/extended-lang-client"; +import { BallerinaPackagesParams, BallerinaProjectComponents, BallerinaSTParams, ComponentModels, ComponentModelsParams, ExecutorPositions, PartialST, PartialSTParams, ProjectDiagnosticsRequest, ProjectDiagnosticsResponse, STModifyParams, SymbolInfo, SymbolInfoParams, SyntaxTree, SyntaxTreeParams, TypeFromExpressionParams, TypeFromSymbolParams, TypesFromFnDefinitionParams } from "../../interfaces/extended-lang-client"; import { BallerinaVersionResponse, CompletionRequest, CompletionResponse, DiagnosticsResponse, CodeActionRequest, CodeActionResponse, RenameRequest, RenameResponse, DefinitionPositionRequest, UpdateFileContentRequest, UpdateFileContentResponse, DefinitionResponse, ExecutorPositionsRequest, DidCloseRequest, TypesFromExpressionResponse, TypesFromSymbolResponse, DidOpenRequest, DidChangeRequest } from "./interfaces"; export interface LangClientAPI { @@ -27,6 +27,7 @@ export interface LangClientAPI { getBallerinaVersion: () => Promise; getCompletion: (params: CompletionRequest) => Promise; getDiagnostics: (params: SyntaxTreeParams) => Promise; + getProjectDiagnostics: (params: ProjectDiagnosticsRequest) => Promise; codeAction: (params: CodeActionRequest) => Promise; rename: (params: RenameRequest) => Promise; getDefinitionPosition: (params: DefinitionPositionRequest) => Promise; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/lang-client/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/lang-client/rpc-type.ts index 4ad3422f853..bfb481eef1b 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/lang-client/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/lang-client/rpc-type.ts @@ -17,7 +17,7 @@ * * THIS FILE INCLUDES AUTO GENERATED CODE */ -import { BallerinaPackagesParams, BallerinaProjectComponents, BallerinaSTParams, ComponentModels, ComponentModelsParams, ExecutorPositions, PartialST, PartialSTParams, STModifyParams, SymbolInfo, SymbolInfoParams, SyntaxTree, SyntaxTreeParams, TypeFromExpressionParams, TypeFromSymbolParams, TypesFromFnDefinitionParams } from "../../interfaces/extended-lang-client"; +import { BallerinaPackagesParams, BallerinaProjectComponents, BallerinaSTParams, ComponentModels, ComponentModelsParams, ExecutorPositions, PartialST, PartialSTParams, ProjectDiagnosticsRequest, ProjectDiagnosticsResponse, STModifyParams, SymbolInfo, SymbolInfoParams, SyntaxTree, SyntaxTreeParams, TypeFromExpressionParams, TypeFromSymbolParams, TypesFromFnDefinitionParams } from "../../interfaces/extended-lang-client"; import { BallerinaVersionResponse, CompletionRequest, CompletionResponse, DiagnosticsResponse, CodeActionRequest, CodeActionResponse, RenameRequest, RenameResponse, DefinitionPositionRequest, UpdateFileContentRequest, UpdateFileContentResponse, DefinitionResponse, ExecutorPositionsRequest, DidCloseRequest, TypesFromExpressionResponse, TypesFromSymbolResponse, DidOpenRequest, DidChangeRequest } from "./interfaces"; import { RequestType, NotificationType } from "vscode-messenger-common"; @@ -29,6 +29,7 @@ export const getBallerinaProjectComponents: RequestType = { method: `${_preFix}/getBallerinaVersion` }; export const getCompletion: RequestType = { method: `${_preFix}/getCompletion` }; export const getDiagnostics: RequestType = { method: `${_preFix}/getDiagnostics` }; +export const getProjectDiagnostics: RequestType = { method: `${_preFix}/getProjectDiagnostics` }; export const codeAction: RequestType = { method: `${_preFix}/codeAction` }; export const rename: RequestType = { method: `${_preFix}/rename` }; export const getDefinitionPosition: RequestType = { method: `${_preFix}/getDefinitionPosition` }; diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/lang-client/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/lang-client/rpc-handler.ts index 6f07fb835f8..120e15d7bac 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/lang-client/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/lang-client/rpc-handler.ts @@ -29,6 +29,7 @@ import { DidOpenRequest, ExecutorPositionsRequest, PartialSTParams, + ProjectDiagnosticsRequest, RenameRequest, STModifyParams, SymbolInfoParams, @@ -49,6 +50,7 @@ import { getDiagnostics, getExecutorPositions, getPackageComponentModels, + getProjectDiagnostics, getST, getSTByRange, getSTForExpression, @@ -78,6 +80,7 @@ export function registerLangClientRpcHandlers(messenger: Messenger) { messenger.onRequest(getBallerinaVersion, () => rpcManger.getBallerinaVersion()); messenger.onRequest(getCompletion, (args: CompletionRequest) => rpcManger.getCompletion(args)); messenger.onRequest(getDiagnostics, (args: SyntaxTreeParams) => rpcManger.getDiagnostics(args)); + messenger.onRequest(getProjectDiagnostics, (args: ProjectDiagnosticsRequest) => rpcManger.getProjectDiagnostics(args)); messenger.onRequest(codeAction, (args: CodeActionRequest) => rpcManger.codeAction(args)); messenger.onRequest(rename, (args: RenameRequest) => rpcManger.rename(args)); messenger.onRequest(getDefinitionPosition, (args: DefinitionPositionRequest) => rpcManger.getDefinitionPosition(args)); diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/lang-client/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/lang-client/rpc-manager.ts index 8470be5a40e..c6d7f63b837 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/lang-client/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/lang-client/rpc-manager.ts @@ -41,6 +41,8 @@ import { LangClientAPI, PartialST, PartialSTParams, + ProjectDiagnosticsRequest, + ProjectDiagnosticsResponse, RenameRequest, RenameResponse, STModifyParams, @@ -288,4 +290,10 @@ export class LangClientRpcManager implements LangClientAPI { }); } + async getProjectDiagnostics(params: ProjectDiagnosticsRequest): Promise { + return new Promise(async (resolve) => { + const diagnostics = await StateMachine.langClient().getProjectDiagnostics(params) as ProjectDiagnosticsResponse; + resolve(diagnostics); + }); + } } diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/lang-client/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/lang-client/rpc-client.ts index 534bdfcb072..f8ca9980d51 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/lang-client/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/lang-client/rpc-client.ts @@ -39,6 +39,8 @@ import { LangClientAPI, PartialST, PartialSTParams, + ProjectDiagnosticsRequest, + ProjectDiagnosticsResponse, RenameRequest, RenameResponse, STModifyParams, @@ -65,6 +67,7 @@ import { getDiagnostics, getExecutorPositions, getPackageComponentModels, + getProjectDiagnostics, getST, getSTByRange, getSTForExpression, @@ -120,6 +123,10 @@ export class LangClientRpcClient implements LangClientAPI { return this._messenger.sendRequest(getDiagnostics, HOST_EXTENSION, params); } + getProjectDiagnostics(params: ProjectDiagnosticsRequest): Promise { + return this._messenger.sendRequest(getProjectDiagnostics, HOST_EXTENSION, params); + } + codeAction(params: CodeActionRequest): Promise { return this._messenger.sendRequest(codeAction, HOST_EXTENSION, params); } From 525f2730906d42139c269607693764c1de2e3f7e Mon Sep 17 00:00:00 2001 From: madushajg Date: Mon, 28 Jul 2025 14:12:09 +0530 Subject: [PATCH 232/349] Improve sub mapping button --- .../Node/SubMapping/SubMappingTreeWidget.tsx | 8 +++----- .../inline-data-mapper/src/components/styles.ts | 13 ++----------- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/SubMapping/SubMappingTreeWidget.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/SubMapping/SubMappingTreeWidget.tsx index e8382a72dab..5ae8ba551a1 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/SubMapping/SubMappingTreeWidget.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/SubMapping/SubMappingTreeWidget.tsx @@ -100,13 +100,11 @@ export function SubMappingTreeWidget(props: SubMappingTreeWidgetProps) { ) : !isFocusedView && !searchValue && ( )} diff --git a/workspaces/ballerina/inline-data-mapper/src/components/styles.ts b/workspaces/ballerina/inline-data-mapper/src/components/styles.ts index fc33b5472c6..c6fb9d1b5a4 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/styles.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/styles.ts @@ -228,18 +228,9 @@ export const useIONodesStyles = () => ({ }), addSubMappingButton: css({ "& > vscode-button": { - ...addElementButton, - width: `${IO_NODE_DEFAULT_WIDTH}px`, height: "40px", - border: "1px solid var(--vscode-welcomePage-tileBorder)", - color: "var(--button-primary-foreground)", - opacity: 0.7, - backgroundColor: "var(--vscode-button-secondaryBackground)", - borderRadius: "0px", - textTransform: "none", - "&:hover": { - backgroundColor: "var(--vscode-button-secondaryHoverBackground)" - }, + width: `${IO_NODE_DEFAULT_WIDTH}px`, + border: "none", }, "& > vscode-button > *": { margin: "0px 6px" From 72006100f6d02ab42aaeefe4f424ce9d61b1088e Mon Sep 17 00:00:00 2001 From: madushajg Date: Mon, 28 Jul 2025 14:47:15 +0530 Subject: [PATCH 233/349] Use project diagnostics API within Data Mapper --- .../src/components/Diagram/utils/ls-utils.ts | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/data-mapper-view/src/components/Diagram/utils/ls-utils.ts b/workspaces/ballerina/data-mapper-view/src/components/Diagram/utils/ls-utils.ts index 1f38c26bd4a..9f920b29168 100644 --- a/workspaces/ballerina/data-mapper-view/src/components/Diagram/utils/ls-utils.ts +++ b/workspaces/ballerina/data-mapper-view/src/components/Diagram/utils/ls-utils.ts @@ -33,13 +33,28 @@ import { EXPR_SCHEME, FILE_SCHEME } from "../../DataMapper/ConfigPanel/utils"; import { LangClientRpcClient } from "@wso2/ballerina-rpc-client"; export async function getDiagnostics(docUri: string, langServerRpcClient: LangClientRpcClient): Promise { - const diagnostics = await langServerRpcClient.getDiagnostics({ - documentIdentifier: { - uri: docUri, + + // Extract project URI from file URI by getting the directory path + const fileUri = URI.parse(docUri); + const projectUri = URI.file(fileUri.fsPath.split('/').slice(0, -1).join('/')).toString(); + + const projectDiagnostics = await langServerRpcClient.getProjectDiagnostics({ + projectRootIdentifier: { + uri: projectUri, } }); - return diagnostics.diagnostics; + // Convert errorDiagnosticMap to DiagnosticData array + const diagnosticDataArray: DiagnosticData[] = []; + if (projectDiagnostics.errorDiagnosticMap) { + for (const [uri, diagnostics] of Object.entries(projectDiagnostics.errorDiagnosticMap)) { + if (uri === docUri) { + diagnosticDataArray.push({ uri, diagnostics }); + } + } + } + + return diagnosticDataArray; } export const handleDiagnostics = async (fileURI: string, langServerRpcClient: LangClientRpcClient): From 441d08055256f7024f8e632c7afbc13ad1c5ffc7 Mon Sep 17 00:00:00 2001 From: tharindulak Date: Mon, 28 Jul 2025 16:03:18 +0530 Subject: [PATCH 234/349] Fix review comments --- .github/workflows/build.yml | 162 ++---------------- common/config/rush/pnpm-lock.yaml | 18 +- .../common-libs/ui-toolkit/package.json | 1 + 3 files changed, 25 insertions(+), 156 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 57ee113365f..5d8643cef26 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -167,30 +167,6 @@ jobs: PLATFORM_DEV_GHAPP_CLIENT_ID: ${{ secrets.PLATFORM_DEV_GHAPP_CLIENT_ID }} PLATFORM_DEV_DEVANT_ASGARDEO_CLIENT_ID: ${{ secrets.PLATFORM_DEV_DEVANT_ASGARDEO_CLIENT_ID }} - Security_Scan: - name: Security vulnerability scan - needs: Build_Stage - runs-on: ubuntu-latest - timeout-minutes: 15 - steps: - - name: Restore build - uses: actions/download-artifact@v4 - with: - name: ExtBuild - path: ./ - - - name: Set up workspace - run: | - unzip build.zip - rm build.zip - - - name: Setup Rush - uses: gigara/setup-rush@v1.2.0 - with: - pnpm: 10.11.0 - node: 22.x - rush-install: true - - name: Install Trivy run: | sudo apt-get update @@ -200,139 +176,21 @@ jobs: sudo apt-get update sudo apt-get install trivy - - name: Update Trivy vulnerability database + - name: Security vulnerability scan run: | - echo "🔄 Updating Trivy vulnerability database..." - echo "🔄 Run attempt: ${{ github.run_attempt }}" - - # Force complete cleanup of any cached data - rm -rf ~/.cache/trivy || true - rm -rf /tmp/trivy* || true - - # Download fresh vulnerability database - trivy image --download-db-only - - echo "✅ Trivy database updated successfully" - echo "📊 Database info:" - trivy version --format json | jq '.VulnerabilityDB' || trivy version - - # Show database timestamp to detect any caching issues - echo "📅 Database cache info:" - ls -la ~/.cache/trivy/ 2>/dev/null || echo "No cache directory found" - - - name: Verify Trivy installation - run: | - trivy version - echo "Trivy installed successfully" - - - name: Show scan configuration - run: | - echo "🔧 Security Scan Configuration:" - echo " - Scanning: Production dependencies" - echo " - Severity levels: CRITICAL, HIGH, MEDIUM, LOW" - echo " - Skipping directories: common/temp" - echo " - Timeout: 10 minutes" - echo " - Exit on vulnerabilities: YES (Build will fail)" - - - name: Run Trivy vulnerability scanner - run: | - echo "🔍 Scanning for security vulnerabilities..." - echo "🔄 Run attempt: ${{ github.run_attempt }}" - echo "📂 Current working directory: $(pwd)" - echo "" - - # Debug: Check environment and file system state - echo "📊 Environment check:" - echo " - Build artifacts restored: $(test -f rush.json && echo 'YES' || echo 'NO')" - echo " - Rush installed: $(rush --version 2>/dev/null && echo 'YES' || echo 'NO')" - echo " - ui-toolkit exists: $(test -d workspaces/common-libs/ui-toolkit && echo 'YES' || echo 'NO')" - echo " - ui-toolkit node_modules: $(test -d workspaces/common-libs/ui-toolkit/node_modules && echo 'YES' || echo 'NO')" - echo "" - - # Check if axios is actually installed with vulnerable version - if [ -d "workspaces/common-libs/ui-toolkit/node_modules/axios" ]; then - AXIOS_VERSION=$(cat workspaces/common-libs/ui-toolkit/node_modules/axios/package.json | grep '"version"' | cut -d'"' -f4) - echo " - axios version found: $AXIOS_VERSION" - if [ "$AXIOS_VERSION" = "0.21.0" ]; then - echo " - ⚠️ VULNERABLE AXIOS VERSION DETECTED: $AXIOS_VERSION" - fi - else - echo " - axios not found in node_modules" - fi - echo "" - - # Run Trivy vulnerability scan - echo "🚀 Starting Trivy scan..." + echo "🔍 Running security vulnerability scan..." trivy fs . \ --timeout 10m \ --skip-dirs common/temp \ --severity CRITICAL,HIGH,MEDIUM,LOW \ - --format table \ - --output trivy-results.txt \ - --exit-code 0 - - TRIVY_EXIT_CODE=$? - echo "📊 Trivy scan exit code: $TRIVY_EXIT_CODE" - echo "" - - # Always display the results for transparency - if [ -f "trivy-results.txt" ]; then - echo "📋 Complete vulnerability report:" - cat trivy-results.txt - echo "" - - # Count vulnerabilities with detailed breakdown - TOTAL_LINES=$(wc -l < trivy-results.txt) - CVE_COUNT=$(grep -c "CVE-" trivy-results.txt 2>/dev/null || echo "0") - GHSA_COUNT=$(grep -c "GHSA-" trivy-results.txt 2>/dev/null || echo "0") - - # Clean the counts to remove any whitespace/newlines - CVE_COUNT=$(echo "$CVE_COUNT" | tr -d '\n\r ') - GHSA_COUNT=$(echo "$GHSA_COUNT" | tr -d '\n\r ') - - # Calculate total vulnerabilities safely - VULN_COUNT=$((CVE_COUNT + GHSA_COUNT)) - - # Debug vulnerability detection inconsistency - echo "🔍 Vulnerability Detection Analysis:" - echo " - CVE count (cleaned): '$CVE_COUNT'" - echo " - GHSA count (cleaned): '$GHSA_COUNT'" - echo " - Total vulnerabilities: $VULN_COUNT" - echo " - Run attempt: ${{ github.run_attempt }}" - echo " - Expected: Should ALWAYS find axios 0.21.0 vulnerabilities" - - # Check if this is inconsistent behavior - if [ "${{ github.run_attempt }}" -gt 1 ] && [ "$VULN_COUNT" -eq 0 ]; then - echo " - 🚨 CRITICAL: Vulnerability detection is INCONSISTENT!" - echo " - 🚨 First run found vulnerabilities, but rerun shows clean results" - echo " - 🚨 This indicates a serious issue with the security scanning process" - fi - - echo "📊 Scan Analysis:" - echo " - Total lines in report: $TOTAL_LINES" - echo " - CVE entries found: $CVE_COUNT" - echo " - GHSA entries found: $GHSA_COUNT" - echo " - Total vulnerabilities: $VULN_COUNT" - echo " - File size: $(wc -c < trivy-results.txt) bytes" - echo "" - - # Show specific axios vulnerabilities if found - echo "🔍 Axios-specific vulnerabilities:" - grep -i "axios" trivy-results.txt || echo " - No axios vulnerabilities found in report" - echo "" - - if [ "$VULN_COUNT" -gt 0 ]; then - echo "❌ SECURITY ALERT: Found $VULN_COUNT vulnerabilities" - echo "🚫 Build failed due to security vulnerabilities" - exit 1 - else - echo "✅ SUCCESS: No security vulnerabilities detected" - fi - else - echo "❌ ERROR: No scan results file generated!" - echo "This indicates a problem with the Trivy scan itself" - exit 1 - fi + --format table + + - name: Security scan failure reporting + if: failure() + run: | + echo "❌ Security vulnerabilities detected!" + echo "Please review the vulnerability report above and address the issues." + echo "Build failed due to security vulnerabilities." ExtTest_Ballerina: name: Run Ballerina extension tests diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 3b670bc18f2..9440a34fa5e 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -2851,6 +2851,9 @@ importers: '@wso2/font-wso2-vscode': specifier: workspace:* version: link:../font-wso2-vscode + axios: + specifier: 0.21.0 + version: 0.21.0 classnames: specifier: ^2.5.1 version: 2.5.1 @@ -10481,6 +10484,10 @@ packages: resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} engines: {node: '>=4'} + axios@0.21.0: + resolution: {integrity: sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==} + deprecated: Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410 + axios@1.9.0: resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} @@ -21974,7 +21981,7 @@ snapshots: '@ai-sdk/provider': 1.1.3 '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) zod: 3.25.76 - zod-to-json-schema: 3.24.5(zod@3.25.76) + zod-to-json-schema: 3.24.6(zod@3.25.76) '@alloc/quick-lru@5.2.0': {} @@ -25167,10 +25174,7 @@ snapshots: jest-runner: 25.5.4 jest-runtime: 25.5.4 transitivePeerDependencies: - - bufferutil - - canvas - supports-color - - utf-8-validate '@jest/test-sequencer@29.7.0': dependencies: @@ -34435,6 +34439,12 @@ snapshots: axe-core@4.10.3: {} + axios@0.21.0: + dependencies: + follow-redirects: 1.15.9 + transitivePeerDependencies: + - debug + axios@1.9.0: dependencies: follow-redirects: 1.15.9 diff --git a/workspaces/common-libs/ui-toolkit/package.json b/workspaces/common-libs/ui-toolkit/package.json index d221f13b2d3..0151a5fb2bd 100644 --- a/workspaces/common-libs/ui-toolkit/package.json +++ b/workspaces/common-libs/ui-toolkit/package.json @@ -33,6 +33,7 @@ "@vscode/codicons": "0.0.36", "@vscode/webview-ui-toolkit": "~1.4.0", "@wso2/font-wso2-vscode": "workspace:*", + "axios": "0.21.0", "classnames": "^2.5.1", "lodash": "~4.17.21", "monaco-editor": "~0.52.2", From 53d3482ad4f3936f9bcd878b4ec974b87e48134d Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Mon, 28 Jul 2025 16:38:12 +0530 Subject: [PATCH 235/349] Implement debounced fetching of context in MainPanel to optimize performance --- .../ballerina-visualizer/src/MainPanel.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx index f859af759ee..d3480079063 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/MainPanel.tsx @@ -16,7 +16,7 @@ * under the License. */ -import React, { useEffect, useState } from "react"; +import React, { useCallback, useEffect, useState } from "react"; import { KeyboardNavigationManager, MachineStateValue, @@ -27,6 +27,7 @@ import { } from "@wso2/ballerina-core"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; import { Global, css } from "@emotion/react"; +import { debounce } from "lodash"; import styled from "@emotion/styled"; import { LoadingRing } from "./components/Loader"; import { DataMapper } from "./views/DataMapper"; @@ -179,10 +180,16 @@ const MainPanel = () => { rpcClient?.onStateChanged((newState: MachineStateValue) => { if (typeof newState === "object" && "viewActive" in newState && newState.viewActive === "viewReady") { - fetchContext(); + debounceFetchContext(); } }); + const debounceFetchContext = useCallback( + debounce(() => { + fetchContext(); + }, 200), [] + ); + rpcClient?.onPopupStateChanged((newState: PopupMachineStateValue) => { setPopupState(newState); }); @@ -465,7 +472,7 @@ const MainPanel = () => { }; useEffect(() => { - fetchContext(); + debounceFetchContext(); }, [breakpointState]); useEffect(() => { From 4cb368b8ed1e356f9760ccde7d55f07f3997343e Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Mon, 28 Jul 2025 16:50:41 +0530 Subject: [PATCH 236/349] Introduce graphql util class --- .../api-services/graphql-service.spec.ts | 26 +- .../api-services/graphqlUtils.ts | 249 ++++++++++++------ .../test/e2e-playwright-tests/test.list.ts | 62 ++--- 3 files changed, 208 insertions(+), 129 deletions(-) diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts index f0cedca0ad1..b7de97a3611 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts @@ -19,7 +19,7 @@ import { test } from '@playwright/test'; import { addArtifact, initTest, page } from '../utils'; import { Form, switchToIFrame } from '@wso2/playwright-vscode-tester'; import { ProjectExplorer } from '../ProjectExplorer'; -import { addGraphQLOperation, clickButtonByTestId, TEST_DATA, addArgumentToGraphQLService, addOutputObject, createInputObjectFromScratch } from './graphqlUtils'; +import { TEST_DATA, GraphQLServiceUtils} from './graphqlUtils'; export default function createTests() { @@ -107,11 +107,13 @@ export default function createTests() { throw new Error('WSO2 Integrator: BI webview not found'); } - await clickButtonByTestId(artifactWebView, 'create-operation-button'); - await addGraphQLOperation(artifactWebView, 'query', TEST_DATA.query.name, TEST_DATA.query.fieldType); - await addGraphQLOperation(artifactWebView, 'mutation', TEST_DATA.mutation[0].name, TEST_DATA.mutation[0].fieldType); - await addGraphQLOperation(artifactWebView, 'subscription', TEST_DATA.subscription.name, TEST_DATA.subscription.fieldType); - await clickButtonByTestId(artifactWebView, 'close-panel-btn'); + const graphqlServiceUtils = new GraphQLServiceUtils(page.page,artifactWebView); + + await graphqlServiceUtils.clickButtonByTestId( 'create-operation-button'); + await graphqlServiceUtils.addGraphQLOperation( 'query', TEST_DATA.query.name, TEST_DATA.query.fieldType); + await graphqlServiceUtils.addGraphQLOperation( 'mutation', TEST_DATA.mutation[0].name, TEST_DATA.mutation[0].fieldType); + await graphqlServiceUtils.addGraphQLOperation( 'subscription', TEST_DATA.subscription.name, TEST_DATA.subscription.fieldType); + await graphqlServiceUtils.clickButtonByTestId( 'close-panel-btn'); }); @@ -122,11 +124,13 @@ export default function createTests() { if (!artifactWebView) { throw new Error('WSO2 Integrator: BI webview not found'); } - - await clickButtonByTestId(artifactWebView, 'graphql-add-mutation-btn'); - await addArgumentToGraphQLService(artifactWebView); - await createInputObjectFromScratch(artifactWebView); - await addOutputObject(artifactWebView); + + const graphqlServiceUtils = new GraphQLServiceUtils(page.page, artifactWebView); + + await graphqlServiceUtils.clickButtonByTestId( 'graphql-add-mutation-btn'); + await graphqlServiceUtils.addArgumentToGraphQLService(); + await graphqlServiceUtils.createInputObjectFromScratch(); + await graphqlServiceUtils.addOutputObject(); await artifactWebView.getByRole('textbox', { name: 'Field Name*The name of the' }).fill(TEST_DATA.mutation[1].name); await artifactWebView.waitForTimeout(5000); // Wait for the field name to be set diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts index 581360e3bf8..79ccf816ee6 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts @@ -15,8 +15,8 @@ * specific language governing permissions and limitations * under the License. */ -import { Frame } from '@playwright/test'; -import { page } from '../utils'; +import { Frame,Page } from '@playwright/test'; +// import { page } from '../utils'; // Centralized test data for all GraphQL service E2E tests export const TEST_DATA = { @@ -48,97 +48,172 @@ export const TEST_DATA = { }, }; -/** - * Utility to add a GraphQL operation (mutation, subscription, etc.) - * @param artifactWebView - The Playwright frame/locator for the webview - * @param operationType - 'mutation' | 'subscription' | 'query' - * @param name - The name to use for the operation - * @param fieldType - The type to use for the field (e.g., 'boolean', 'float', etc.) - */ -export async function addGraphQLOperation(artifactWebView: Frame, operationType: string, name: string, fieldType: string) { - const addBtnTestId = `graphql-add-${operationType}-btn`; - await artifactWebView.getByTestId(addBtnTestId).waitFor({ state: 'visible', timeout: 10000 }); - const addBtn = artifactWebView.getByTestId(addBtnTestId); - await addBtn.click(); - - const fieldNameBox = artifactWebView.getByRole('textbox', { name: /Field Name/i }); - await fieldNameBox.waitFor({ state: 'visible', timeout: 10000 }); - await fieldNameBox.fill(name); - - const fieldTypeBox = artifactWebView.getByRole('textbox', { name: /Field Type/i }); - await fieldTypeBox.waitFor({ state: 'visible', timeout: 10000 }); - // await fieldTypeBox.click(); - await fieldTypeBox.fill(fieldType); - - // Wait a short moment to allow UI to register the value - await page.page.waitForTimeout(5000); - const fieldDefaultCompletion = artifactWebView.getByTestId('add-type-completion'); - await fieldDefaultCompletion.waitFor({ state: 'visible', timeout: 10000 }); - - if (fieldDefaultCompletion.isVisible()) { - await fieldTypeBox.press('Escape'); +export class GraphQLServiceUtils { + /** + * Constructor for GraphQLServiceUtils + * @param webView - The Playwright frame/locator for the webview + */ + constructor(private page: Page, private webView: Frame) {} + + async addGraphQLOperation(operationType: string, name: string, fieldType: string) { + const addBtnTestId = `graphql-add-${operationType}-btn`; + await this.webView.getByTestId(addBtnTestId).waitFor({ state: 'visible', timeout: 10000 }); + const addBtn = this.webView.getByTestId(addBtnTestId); + await addBtn.click(); + + const fieldNameBox = this.webView.getByRole('textbox', { name: /Field Name/i }); + await fieldNameBox.waitFor({ state: 'visible', timeout: 10000 }); + await fieldNameBox.fill(name); + + const fieldTypeBox = this.webView.getByRole('textbox', { name: /Field Type/i }); + await fieldTypeBox.waitFor({ state: 'visible', timeout: 10000 }); + // await fieldTypeBox.click(); + await fieldTypeBox.fill(fieldType); + + // Wait a short moment to allow UI to register the value + await this.page.waitForTimeout(5000); + const fieldDefaultCompletion = this.webView.getByTestId('add-type-completion'); + await fieldDefaultCompletion.waitFor({ state: 'visible', timeout: 10000 }); + + if (fieldDefaultCompletion.isVisible()) { + await fieldTypeBox.press('Escape'); + } + + const saveBtn = this.webView.getByRole('button', { name: /Save/i }); + await saveBtn.waitFor({ state: 'visible', timeout: 10000 }); + await saveBtn.click(); } - const saveBtn = artifactWebView.getByRole('button', { name: /Save/i }); - await saveBtn.waitFor({ state: 'visible', timeout: 10000 }); - await saveBtn.click(); -} - -/** - * Click a button in the artifact webview by test id - * @param artifactWebView - The Playwright frame/locator for the webview - * @param testId - The test id of the button to click - */ -export async function clickButtonByTestId(artifactWebView: Frame, testId: string) { - const button = artifactWebView.getByTestId(testId); - await button.waitFor({ state: 'visible', timeout: 10000 }); - await button.click(); -} + async clickButtonByTestId(testId: string) { + const button = this.webView.getByTestId(testId); + await button.waitFor({ state: 'visible', timeout: 10000 }); + await button.click(); + } -/** - * Create an output object type in the GraphQL service - * @param artifactWebView - The Playwright frame/locator for the webview - */ -export async function addOutputObject(artifactWebView: Frame) { - const createFromScratchTab = artifactWebView.getByTestId('create-from-scratch-tab'); - await artifactWebView.getByRole('textbox', { name: 'Field Type' }).click(); - await artifactWebView.getByText('Create New Type').click(); - await artifactWebView.getByTestId('type-kind-dropdown').locator('svg').click(); - await artifactWebView.getByRole('option', { name: 'Object' }).click(); - await createFromScratchTab.getByRole('textbox', { name: 'Name' }).fill(TEST_DATA.mutation[0].outputType); - await artifactWebView.getByTestId('type-create-save').getByRole('button', { name: 'Save' }).click(); -} + async addOutputObject() { + const createFromScratchTab = this.webView.getByTestId('create-from-scratch-tab'); + await this.webView.getByRole('textbox', { name: 'Field Type' }).click(); + await this.webView.getByText('Create New Type').click(); + await this.webView.getByTestId('type-kind-dropdown').locator('svg').click(); + await this.webView.getByRole('option', { name: 'Object' }).click(); + await createFromScratchTab.getByRole('textbox', { name: 'Name' }).fill(TEST_DATA.mutation[0].outputType); + await this.webView.getByTestId('type-create-save').getByRole('button', { name: 'Save' }).click(); + } -/** - * Create an input object type from scratch in the GraphQL service - * @param artifactWebView - The Playwright frame/locator for the webview - */ -export async function createInputObjectFromScratch(artifactWebView: Frame) { - await artifactWebView.getByText('Add Argument').click(); - await artifactWebView.getByRole('textbox', { name: 'Argument Type' }).click(); - await artifactWebView.getByText('Create New Type').click(); - await artifactWebView.locator('slot', { hasText: /^Input Object$/ }).click(); - await artifactWebView.getByRole('option', { name: 'Input Object' }).click(); - - // Fill name for the new input object type - const createFromScratchTab = artifactWebView.getByTestId('create-from-scratch-tab'); - await createFromScratchTab.getByRole('textbox', { name: 'Name' }).fill(TEST_DATA.mutation[0].arguments[1].type); - await artifactWebView.getByTestId('type-create-save').getByRole('button', { name: 'Save' }).click(); - await artifactWebView.getByRole('textbox', { name: 'Argument Name*The name of the' }).fill(TEST_DATA.mutation[0].arguments[1].name); - await artifactWebView.getByRole('button', { name: 'Add' }).click(); -} + async createInputObjectFromScratch() { + await this.webView.getByText('Add Argument').click(); + await this.webView.getByRole('textbox', { name: 'Argument Type' }).click(); + await this.webView.getByText('Create New Type').click(); + await this.webView.locator('slot', { hasText: /^Input Object$/ }).click(); + await this.webView.getByRole('option', { name: 'Input Object' }).click(); + + // Fill name for the new input object type + const createFromScratchTab = this.webView.getByTestId('create-from-scratch-tab'); + await createFromScratchTab.getByRole('textbox', { name: 'Name' }).fill(TEST_DATA.mutation[0].arguments[1].type); + await this.webView.getByTestId('type-create-save').getByRole('button', { name: 'Save' }).click(); + await this.webView.getByRole('textbox', { name: 'Argument Name*The name of the' }).fill(TEST_DATA.mutation[0].arguments[1].name); + await this.webView.getByRole('button', { name: 'Add' }).click(); + } -/** - * Add an argument to a GraphQL service - * @param artifactWebView - The Playwright frame/locator for the webview - */ -export async function addArgumentToGraphQLService(artifactWebView: Frame) { - await artifactWebView.getByText('Add Argument').click(); - await artifactWebView.getByRole('textbox', { name: 'Argument Type' }).click(); - await artifactWebView.getByTitle('string', { exact: true }).click(); - await artifactWebView.getByRole('textbox', { name: 'Argument Name*The name of the' }).fill(TEST_DATA.mutation[0].arguments[0].name); - await artifactWebView.getByRole('button', { name: 'Add' }).click(); + async addArgumentToGraphQLService() { + await this.webView.getByText('Add Argument').click(); + await this.webView.getByRole('textbox', { name: 'Argument Type' }).click(); + await this.webView.getByTitle('string', { exact: true }).click(); + await this.webView.getByRole('textbox', { name: 'Argument Name*The name of the' }).fill(TEST_DATA.mutation[0].arguments[0].name); + await this.webView.getByRole('button', { name: 'Add' }).click(); + } } +// /** +// * Utility to add a GraphQL operation (mutation, subscription, etc.) +// * @param artifactWebView - The Playwright frame/locator for the webview +// * @param operationType - 'mutation' | 'subscription' | 'query' +// * @param name - The name to use for the operation +// * @param fieldType - The type to use for the field (e.g., 'boolean', 'float', etc.) +// */ +// export async function addGraphQLOperation(artifactWebView: Frame, operationType: string, name: string, fieldType: string) { +// const addBtnTestId = `graphql-add-${operationType}-btn`; +// await artifactWebView.getByTestId(addBtnTestId).waitFor({ state: 'visible', timeout: 10000 }); +// const addBtn = artifactWebView.getByTestId(addBtnTestId); +// await addBtn.click(); + +// const fieldNameBox = artifactWebView.getByRole('textbox', { name: /Field Name/i }); +// await fieldNameBox.waitFor({ state: 'visible', timeout: 10000 }); +// await fieldNameBox.fill(name); + +// const fieldTypeBox = artifactWebView.getByRole('textbox', { name: /Field Type/i }); +// await fieldTypeBox.waitFor({ state: 'visible', timeout: 10000 }); +// // await fieldTypeBox.click(); +// await fieldTypeBox.fill(fieldType); + +// // Wait a short moment to allow UI to register the value +// await page.page.waitForTimeout(5000); +// const fieldDefaultCompletion = artifactWebView.getByTestId('add-type-completion'); +// await fieldDefaultCompletion.waitFor({ state: 'visible', timeout: 10000 }); + +// if (fieldDefaultCompletion.isVisible()) { +// await fieldTypeBox.press('Escape'); +// } + +// const saveBtn = artifactWebView.getByRole('button', { name: /Save/i }); +// await saveBtn.waitFor({ state: 'visible', timeout: 10000 }); +// await saveBtn.click(); +// } + +// /** +// * Click a button in the artifact webview by test id +// * @param artifactWebView - The Playwright frame/locator for the webview +// * @param testId - The test id of the button to click +// */ +// export async function clickButtonByTestId(artifactWebView: Frame, testId: string) { +// const button = artifactWebView.getByTestId(testId); +// await button.waitFor({ state: 'visible', timeout: 10000 }); +// await button.click(); +// } + +// /** +// * Create an output object type in the GraphQL service +// * @param artifactWebView - The Playwright frame/locator for the webview +// */ +// export async function addOutputObject(artifactWebView: Frame) { +// const createFromScratchTab = artifactWebView.getByTestId('create-from-scratch-tab'); +// await artifactWebView.getByRole('textbox', { name: 'Field Type' }).click(); +// await artifactWebView.getByText('Create New Type').click(); +// await artifactWebView.getByTestId('type-kind-dropdown').locator('svg').click(); +// await artifactWebView.getByRole('option', { name: 'Object' }).click(); +// await createFromScratchTab.getByRole('textbox', { name: 'Name' }).fill(TEST_DATA.mutation[0].outputType); +// await artifactWebView.getByTestId('type-create-save').getByRole('button', { name: 'Save' }).click(); +// } + +// /** +// * Create an input object type from scratch in the GraphQL service +// * @param artifactWebView - The Playwright frame/locator for the webview +// */ +// export async function createInputObjectFromScratch(artifactWebView: Frame) { +// await artifactWebView.getByText('Add Argument').click(); +// await artifactWebView.getByRole('textbox', { name: 'Argument Type' }).click(); +// await artifactWebView.getByText('Create New Type').click(); +// await artifactWebView.locator('slot', { hasText: /^Input Object$/ }).click(); +// await artifactWebView.getByRole('option', { name: 'Input Object' }).click(); + +// // Fill name for the new input object type +// const createFromScratchTab = artifactWebView.getByTestId('create-from-scratch-tab'); +// await createFromScratchTab.getByRole('textbox', { name: 'Name' }).fill(TEST_DATA.mutation[0].arguments[1].type); +// await artifactWebView.getByTestId('type-create-save').getByRole('button', { name: 'Save' }).click(); +// await artifactWebView.getByRole('textbox', { name: 'Argument Name*The name of the' }).fill(TEST_DATA.mutation[0].arguments[1].name); +// await artifactWebView.getByRole('button', { name: 'Add' }).click(); +// } + +// /** +// * Add an argument to a GraphQL service +// * @param artifactWebView - The Playwright frame/locator for the webview +// */ +// export async function addArgumentToGraphQLService(artifactWebView: Frame) { +// await artifactWebView.getByText('Add Argument').click(); +// await artifactWebView.getByRole('textbox', { name: 'Argument Type' }).click(); +// await artifactWebView.getByTitle('string', { exact: true }).click(); +// await artifactWebView.getByRole('textbox', { name: 'Argument Name*The name of the' }).fill(TEST_DATA.mutation[0].arguments[0].name); +// await artifactWebView.getByRole('button', { name: 'Add' }).click(); +// } diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test.list.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test.list.ts index d4d64a2b899..8059d7fb925 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test.list.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test.list.ts @@ -58,40 +58,40 @@ test.beforeAll(async () => { console.log('>>> Starting test suite'); }); -// <----Automation Test----> -test.describe(automation); +// // <----Automation Test----> +// test.describe(automation); -// <----AI Chat Service Test----> -test.describe(aiChatService); +// // <----AI Chat Service Test----> +// test.describe(aiChatService); -// <----Integration as API Test----> -test.describe(httpService); +// // <----Integration as API Test----> +// test.describe(httpService); test.describe(graphqlService); -test.describe(tcpService); - -// <----Event Integration Test----> -test.describe(kafkaIntegration); -test.describe(rabbitmqIntegration); -test.describe(mqttIntegration); -test.describe(azureIntegration); -test.describe(salesforceIntegration); -test.describe(twillioIntegration); -test.describe(githubIntegration); - -// <----File Integration Test----> -test.describe(ftpIntegration); -test.describe(directoryIntegration); - -// <----Other Artifacts Test----> -test.describe(functionArtifact); -test.describe(naturalFunctionArtifact); -test.describe(dataMapperArtifact); // TODO: Fix this test -test.describe(typeDiagramArtifact); // TODO: Fix this test -test.describe(connectionArtifact); -test.describe(configuration); // TODO: Fix this test - -test.describe(configuration); -test.describe(typeTest); +// test.describe(tcpService); + +// // <----Event Integration Test----> +// test.describe(kafkaIntegration); +// test.describe(rabbitmqIntegration); +// test.describe(mqttIntegration); +// test.describe(azureIntegration); +// test.describe(salesforceIntegration); +// test.describe(twillioIntegration); +// test.describe(githubIntegration); + +// // <----File Integration Test----> +// test.describe(ftpIntegration); +// test.describe(directoryIntegration); + +// // <----Other Artifacts Test----> +// test.describe(functionArtifact); +// test.describe(naturalFunctionArtifact); +// test.describe(dataMapperArtifact); // TODO: Fix this test +// test.describe(typeDiagramArtifact); // TODO: Fix this test +// test.describe(connectionArtifact); +// test.describe(configuration); // TODO: Fix this test + +// test.describe(configuration); +// test.describe(typeTest); test.afterAll(async () => { console.log(`>>> Finished test suite`); From e89b4a6b8c9f343f523d613368da7d9fc34a8741 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Mon, 28 Jul 2025 17:24:50 +0530 Subject: [PATCH 237/349] Add skeleton components for visualizer: DiagramSkeleton, SwitchSkeleton, and TitleBarSkeleton --- .../components/Skeletons/DiagramSkeleton.tsx | 186 ++++++++++++++++++ .../components/Skeletons/SwitchSkeleton.tsx | 183 +++++++++++++++++ .../components/Skeletons/TitleBarSkeleton.tsx | 185 +++++++++++++++++ .../src/components/Skeletons/index.tsx | 3 + 4 files changed, 557 insertions(+) create mode 100644 workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/DiagramSkeleton.tsx create mode 100644 workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/SwitchSkeleton.tsx create mode 100644 workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/TitleBarSkeleton.tsx diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/DiagramSkeleton.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/DiagramSkeleton.tsx new file mode 100644 index 00000000000..63ecf20f1d9 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/DiagramSkeleton.tsx @@ -0,0 +1,186 @@ +/** + * 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 React from "react"; +import styled from "@emotion/styled"; +import { keyframes } from "@emotion/react"; +import { ThemeColors } from "@wso2/ui-toolkit"; + +// Skeleton pulse animation +const skeletonPulse = keyframes` + 0% { + opacity: 0.6; + } + 50% { + opacity: 0.8; + } + 100% { + opacity: 0.6; + } +`; + +// Diagram container with dotted background +const DiagramSkeletonContainer = styled.div` + height: 100%; + width: 100%; + background-image: radial-gradient(${ThemeColors.SURFACE_CONTAINER} 10%, transparent 0px); + background-size: 16px 16px; + background-color: ${ThemeColors.SURFACE_BRIGHT}; + font-family: "GilmerRegular"; + position: relative; + overflow: hidden; +`; + +// Base skeleton element +const SkeletonBase = styled.div<{ + width?: string | number; + height?: string | number; + borderRadius?: string | number; + margin?: string; + position?: string; + top?: string | number; + left?: string | number; +}>` + background-color: var(--vscode-editor-inactiveSelectionBackground); + border-radius: ${({ borderRadius = "4px" }) => + typeof borderRadius === "number" ? `${borderRadius}px` : borderRadius}; + animation: ${skeletonPulse} 1.5s ease-in-out infinite; + width: ${({ width = "100%" }) => + typeof width === "number" ? `${width}px` : width}; + height: ${({ height = "16px" }) => + typeof height === "number" ? `${height}px` : height}; + margin: ${({ margin = "0" }) => margin}; + position: ${({ position = "static" }) => position}; + top: ${({ top }: { top?: string | number }) => + typeof top === "number" ? `${top}px` : top}; + left: ${({ left }: { left?: string | number }) => + typeof left === "number" ? `${left}px` : left}; +`; + +// Start node skeleton (oval shape) +const StartNodeSkeleton = styled(SkeletonBase)` + width: 93.33px; + height: 33.33px; + border-radius: 40px; + position: absolute; + top: 200px; + left: 50%; + transform: translateX(-50%); +`; + +// AI Agent node skeleton (large rectangle with rounded corners) +const MiddleNodeSkeleton = styled(SkeletonBase)` + width: 280px; + height: 50px; + border-radius: 10px; + position: absolute; + top: 285px; + left: 50%; + transform: translateX(-50%); + display: flex; + flex-direction: column; + padding: 16px; + gap: 12px; +`; + + +const ErrorNodeSkeleton = styled(SkeletonBase)` + width: 52px; + height: 52px; + border-radius: 8px; + position: absolute; + top: 435px; + left: 50%; + transform: translateX(-50%); + display: flex; + flex-direction: column; + padding: 16px; + gap: 12px; +`; + +// Return node skeleton (rectangle with rounded corners) +const ReturnNodeSkeleton = styled(SkeletonBase)` + width: 20px; + height: 20px; + border-radius: 100px; + position: absolute; + top: 542px; + left: 50%; + transform: translateX(-50%); + display: flex; + flex-direction: column; + padding: 12px; + gap: 8px; +`; + +// Arrow connector skeleton +const ArrowSkeleton = styled(SkeletonBase)` + width: 4px; + border-radius: 2px; + position: absolute; + left: 50%; + transform: translateX(-50%); +`; + +// Arrow head skeleton +const ArrowHeadSkeleton = styled.div` + position: absolute; + width: 0; + height: 0; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-top: 8px solid var(--vscode-editor-inactiveSelectionBackground); + left: 50%; + transform: translateX(-50%); + animation: ${skeletonPulse} 1.5s ease-in-out infinite; +`; + + + +export const DiagramSkeleton = () => { + return ( + + {/* Start Node */} + + + {/* Arrow from Start to middle node */} + + + + + {/* Middle Node */} + + + {/* Arrow from middle node to error node */} + + + {/* Error Node */} + + + {/* Arrow from error node to return node */} + + + + + {/* Return Node */} + + + ); +}; + +export default DiagramSkeleton; diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/SwitchSkeleton.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/SwitchSkeleton.tsx new file mode 100644 index 00000000000..a31b2b3a5e8 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/SwitchSkeleton.tsx @@ -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 React from "react"; +import styled from "@emotion/styled"; +import { keyframes } from "@emotion/react"; + +// Skeleton pulse animation +const skeletonPulse = keyframes` + 0% { + opacity: 0.6; + } + 50% { + opacity: 0.8; + } + 100% { + opacity: 0.6; + } +`; + +// Base skeleton element +const SkeletonBase = styled.div<{ + width?: string | number; + height?: string | number; + borderRadius?: string | number; + margin?: string; +}>` + background-color: var(--vscode-editor-inactiveSelectionBackground); + border-radius: ${({ borderRadius = "4px" }) => + typeof borderRadius === "number" ? `${borderRadius}px` : borderRadius}; + animation: ${skeletonPulse} 1.5s ease-in-out infinite; + width: ${({ width = "100%" }) => + typeof width === "number" ? `${width}px` : width}; + height: ${({ height = "16px" }) => + typeof height === "number" ? `${height}px` : height}; + margin: ${({ margin = "0" }) => margin}; +`; + +// Switch container skeleton - matches SwitchContainer +const SwitchSkeletonContainer = styled.div<{ + width?: string | number; + height?: string | number; + sx?: any; +}>` + display: flex; + align-items: center; + justify-content: center; + flex-direction: row; + height: ${({ height = "30px" }) => + typeof height === "number" ? `${height}px` : height}; + width: ${({ width = "200px" }) => + typeof width === "number" ? `${width}px` : width}; + border: 1px solid var(--vscode-tree-indentGuidesStroke); + border-radius: 4px; + ${({ sx }: { sx?: any }) => sx}; +`; + +// Left inner container skeleton - matches LeftInnerContainer +const LeftInnerContainerSkeleton = styled.div` + display: flex; + align-items: center; + justify-content: center; + height: 100%; + width: 50%; + background-color: var(--vscode-tab-unfocusedInactiveBackground); + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +`; + +// Right inner container skeleton - matches RightInnerContainer +const RightInnerContainerSkeleton = styled.div` + display: flex; + align-items: center; + justify-content: center; + height: 100%; + width: 50%; + background-color: var(--vscode-tab-unfocusedInactiveBackground); + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +`; + +// Inner container skeleton - matches InnerContainer +const InnerContainerSkeleton = styled.div<{ + active?: boolean; +}>` + display: flex; + align-items: center; + justify-content: center; + height: calc(100% - 8px); + width: calc(100% - 8px); + font-weight: bold; + color: ${({ active }: { active?: boolean }) => + active ? "var(--vscode-editor-foreground)" : "var(--vscode-editor-foreground)"}; + background-color: ${({ active }: { active?: boolean }) => + active ? "var(--vscode-editor-background)" : "var(--vscode-tab-unfocusedInactiveBackground)"}; + margin: 4px; + border-radius: ${({ active }: { active?: boolean }) => active ? "4px" : 0}; +`; + +// Label skeleton - for text labels +const LabelSkeleton = styled(SkeletonBase)` + width: 40px; + height: 14px; + border-radius: 2px; +`; + +// Icon skeleton - for icons +const IconSkeleton = styled(SkeletonBase)` + width: 16px; + height: 16px; + border-radius: 50%; + margin-right: 4px; +`; + +// Content skeleton - matches Content +const ContentSkeleton = styled.div` + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + height: 100%; + width: 100%; + user-select: none; +`; + +interface SwitchSkeletonProps { + width?: string | number; + height?: string | number; + showIcons?: boolean; + leftLabel?: string; + rightLabel?: string; + checked?: boolean; + sx?: any; +} + +export const SwitchSkeleton: React.FC = ({ + width = "200px", + height = "30px", + showIcons = false, + leftLabel = "Flow", + rightLabel = "Sequence", + checked = false, + sx, +}) => { + const renderLabel = (label: string, isActive: boolean) => ( + + {showIcons && } + + + ); + + return ( + + + + {renderLabel(leftLabel, !checked)} + + + + + {renderLabel(rightLabel, checked)} + + + + ); +}; + +export default SwitchSkeleton; diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/TitleBarSkeleton.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/TitleBarSkeleton.tsx new file mode 100644 index 00000000000..1436ab9dd65 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/TitleBarSkeleton.tsx @@ -0,0 +1,185 @@ +/** + * 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 React from "react"; +import styled from "@emotion/styled"; +import { keyframes } from "@emotion/react"; +import { Icon } from "@wso2/ui-toolkit"; +import { useRpcContext } from "@wso2/ballerina-rpc-client"; + +// Skeleton pulse animation +const skeletonPulse = keyframes` + 0% { + opacity: 0.6; + } + 50% { + opacity: 0.8; + } + 100% { + opacity: 0.6; + } +`; + +// Base skeleton element +const SkeletonBase = styled.div<{ + width?: string | number; + height?: string | number; + borderRadius?: string | number; + margin?: string; +}>` + background-color: var(--vscode-editor-inactiveSelectionBackground); + border-radius: ${({ borderRadius = "4px" }) => + typeof borderRadius === "number" ? `${borderRadius}px` : borderRadius}; + animation: ${skeletonPulse} 1.5s ease-in-out infinite; + width: ${({ width = "100%" }) => + typeof width === "number" ? `${width}px` : width}; + height: ${({ height = "16px" }) => + typeof height === "number" ? `${height}px` : height}; + margin: ${({ margin = "0" }) => margin}; +`; + +// TitleBar skeleton container - matches TitleBarContainer +const TitleBarSkeletonContainer = styled.div` + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 12px; + min-height: 56px; + background-color: var(--vscode-editorWidget-background); + z-index: 1000; +`; + +// Left container - matches LeftContainer +const LeftContainer = styled.div` + display: flex; + align-items: center; + gap: 12px; + flex: 1; + width: 100%; +`; + +// Right container - matches RightContainer +const RightContainer = styled.div` + display: flex; + align-items: center; + gap: 12px; +`; + +// Title section - matches TitleSection +const TitleSection = styled.div` + display: flex; + align-items: baseline; + gap: 12px; +`; + +// Back button skeleton - matches IconButton + +// Title skeleton - matches Title styling +const TitleSkeleton = styled(SkeletonBase)` + width: 180px; + height: 24px; + border-radius: 4px; + margin: 0; +`; + +// Actions container - matches ActionsContainer +const ActionsContainer = styled.div` + display: flex; + align-items: center; + gap: 8px; +`; + +// Action button skeleton - matches Button styling +const ActionButtonSkeleton = styled(SkeletonBase)` + border-radius: 4px; + padding: 8px 16px; +`; + +// Subtitle element skeleton for complex subtitle structures +const SubtitleElementSkeleton = styled.div` + display: flex; + align-items: center; + justify-content: flex-start; + gap: 12px; + width: 100%; +`; + +const LeftElementsWrapper = styled.div` + display: flex; + align-items: center; + gap: 12px; +`; + +const AccessorTypeSkeleton = styled(SkeletonBase)` + width: 160px; + height: 20px; + border-radius: 4px; +`; + +const IconButton = styled.div` + padding: 4px; + cursor: pointer; + border-radius: 4px; + + &:hover { + background-color: var(--vscode-toolbar-hoverBackground); + } + + & > div:first-child { + width: 24px; + height: 24px; + font-size: 24px; + } +`; + + +interface TitleBarSkeletonProps { +} + +export const TitleBarSkeleton: React.FC = ({ }) => { + + const { rpcClient } = useRpcContext(); + const handleBackButtonClick = () => { + rpcClient.getVisualizerRpcClient().goBack(); + }; + return ( + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default TitleBarSkeleton; diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/index.tsx index be99d1fb5e1..f5d87d98d5a 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/index.tsx @@ -17,3 +17,6 @@ */ export { SkeletonText } from "./SkeletonText"; +export { TitleBarSkeleton } from "./TitleBarSkeleton"; +export { SwitchSkeleton } from "./SwitchSkeleton"; +export { DiagramSkeleton } from "./DiagramSkeleton"; From 3c434352ab2037f9aa9b3ab99ba394f8361a9b3f Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Mon, 28 Jul 2025 17:25:39 +0530 Subject: [PATCH 238/349] Update DiagramWrapper and FlowDiagram to include skeleton components for loading states --- .../src/views/BI/DiagramWrapper/index.tsx | 107 +++++++++++------- .../src/views/BI/FlowDiagram/index.tsx | 7 +- 2 files changed, 65 insertions(+), 49 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx index 1eb07914181..56561fad839 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx @@ -30,6 +30,7 @@ import { MACHINE_VIEW } from "@wso2/ballerina-core"; import styled from "@emotion/styled"; import { BIFocusFlowDiagram } from "../FocusFlowDiagram"; import { getColorByMethod } from "../ServiceDesigner/components/ResourceAccordion"; +import { SwitchSkeleton, TitleBarSkeleton } from "../../../components/Skeletons"; const ActionButton = styled(Button)` display: flex; @@ -171,7 +172,7 @@ export function DiagramWrapper(param: DiagramWrapperProps) { const [showSequenceDiagram, setShowSequenceDiagram] = useState(false); const [enableSequenceDiagram, setEnableSequenceDiagram] = useState(false); - const [loadingDiagram, setLoadingDiagram] = useState(false); + const [loadingDiagram, setLoadingDiagram] = useState(true); const [fileName, setFileName] = useState(""); const [serviceType, setServiceType] = useState(""); const [basePath, setBasePath] = useState(""); @@ -348,49 +349,67 @@ export function DiagramWrapper(param: DiagramWrapperProps) { return ( - - { - enableSequenceDiagram && !isAgent && ( - - ) - } - { - showSequenceDiagram ? ( - - ) : view ? ( - - ) : ( - - ) - } + {loadingDiagram ? ( + + ) : ( + + )} + { + enableSequenceDiagram && !isAgent && !loadingDiagram ? + ( + + ) : ( + + ) + } + { + showSequenceDiagram ? ( + + ) : view ? ( + + ) : ( + + ) + } ); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index 5c153563075..5d2f4a5f78a 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -70,6 +70,7 @@ import { removeToolFromAgentNode, } from "../AIChatAgent/utils"; import { PROVIDER_NAME_MAP } from "../../../constants"; +import { DiagramSkeleton } from "../../../components/Skeletons"; const Container = styled.div` width: 100%; @@ -1786,11 +1787,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { )} - {!model && ( - - - - )} + {!model && } {model && } From f97656b86466721dbd3014691a65dbe9520b724c Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Mon, 28 Jul 2025 17:35:05 +0530 Subject: [PATCH 239/349] Refactor skeleton components: move styles to a new file, remove unused SkeletonText --- .../components/Skeletons/DiagramSkeleton.tsx | 44 +------------- .../src/components/Skeletons/SkeletonText.tsx | 27 --------- .../components/Skeletons/SwitchSkeleton.tsx | 33 +---------- .../components/Skeletons/TitleBarSkeleton.tsx | 33 +---------- .../src/components/Skeletons/index.tsx | 1 - .../src/components/Skeletons/styles.tsx | 59 +++++++++++++++++++ 6 files changed, 62 insertions(+), 135 deletions(-) delete mode 100644 workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/SkeletonText.tsx create mode 100644 workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/styles.tsx diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/DiagramSkeleton.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/DiagramSkeleton.tsx index 63ecf20f1d9..c318c18445b 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/DiagramSkeleton.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/DiagramSkeleton.tsx @@ -18,21 +18,8 @@ import React from "react"; import styled from "@emotion/styled"; -import { keyframes } from "@emotion/react"; import { ThemeColors } from "@wso2/ui-toolkit"; - -// Skeleton pulse animation -const skeletonPulse = keyframes` - 0% { - opacity: 0.6; - } - 50% { - opacity: 0.8; - } - 100% { - opacity: 0.6; - } -`; +import { SkeletonBase, skeletonPulse } from "./styles"; // Diagram container with dotted background const DiagramSkeletonContainer = styled.div` @@ -46,32 +33,6 @@ const DiagramSkeletonContainer = styled.div` overflow: hidden; `; -// Base skeleton element -const SkeletonBase = styled.div<{ - width?: string | number; - height?: string | number; - borderRadius?: string | number; - margin?: string; - position?: string; - top?: string | number; - left?: string | number; -}>` - background-color: var(--vscode-editor-inactiveSelectionBackground); - border-radius: ${({ borderRadius = "4px" }) => - typeof borderRadius === "number" ? `${borderRadius}px` : borderRadius}; - animation: ${skeletonPulse} 1.5s ease-in-out infinite; - width: ${({ width = "100%" }) => - typeof width === "number" ? `${width}px` : width}; - height: ${({ height = "16px" }) => - typeof height === "number" ? `${height}px` : height}; - margin: ${({ margin = "0" }) => margin}; - position: ${({ position = "static" }) => position}; - top: ${({ top }: { top?: string | number }) => - typeof top === "number" ? `${top}px` : top}; - left: ${({ left }: { left?: string | number }) => - typeof left === "number" ? `${left}px` : left}; -`; - // Start node skeleton (oval shape) const StartNodeSkeleton = styled(SkeletonBase)` width: 93.33px; @@ -98,7 +59,6 @@ const MiddleNodeSkeleton = styled(SkeletonBase)` gap: 12px; `; - const ErrorNodeSkeleton = styled(SkeletonBase)` width: 52px; height: 52px; @@ -150,8 +110,6 @@ const ArrowHeadSkeleton = styled.div` animation: ${skeletonPulse} 1.5s ease-in-out infinite; `; - - export const DiagramSkeleton = () => { return ( diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/SkeletonText.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/SkeletonText.tsx deleted file mode 100644 index c1f94b0aae2..00000000000 --- a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/SkeletonText.tsx +++ /dev/null @@ -1,27 +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 React, { type FC, type HTMLProps } from "react"; - -interface Props { - className?: HTMLProps["className"]; -} - -export const SkeletonText: FC = ({ className }) => { - return
; -}; diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/SwitchSkeleton.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/SwitchSkeleton.tsx index a31b2b3a5e8..fc4a76e6228 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/SwitchSkeleton.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/SwitchSkeleton.tsx @@ -18,38 +18,7 @@ import React from "react"; import styled from "@emotion/styled"; -import { keyframes } from "@emotion/react"; - -// Skeleton pulse animation -const skeletonPulse = keyframes` - 0% { - opacity: 0.6; - } - 50% { - opacity: 0.8; - } - 100% { - opacity: 0.6; - } -`; - -// Base skeleton element -const SkeletonBase = styled.div<{ - width?: string | number; - height?: string | number; - borderRadius?: string | number; - margin?: string; -}>` - background-color: var(--vscode-editor-inactiveSelectionBackground); - border-radius: ${({ borderRadius = "4px" }) => - typeof borderRadius === "number" ? `${borderRadius}px` : borderRadius}; - animation: ${skeletonPulse} 1.5s ease-in-out infinite; - width: ${({ width = "100%" }) => - typeof width === "number" ? `${width}px` : width}; - height: ${({ height = "16px" }) => - typeof height === "number" ? `${height}px` : height}; - margin: ${({ margin = "0" }) => margin}; -`; +import { SkeletonBase } from "./styles"; // Switch container skeleton - matches SwitchContainer const SwitchSkeletonContainer = styled.div<{ diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/TitleBarSkeleton.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/TitleBarSkeleton.tsx index 1436ab9dd65..2fdb869bd75 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/TitleBarSkeleton.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/TitleBarSkeleton.tsx @@ -18,40 +18,9 @@ import React from "react"; import styled from "@emotion/styled"; -import { keyframes } from "@emotion/react"; import { Icon } from "@wso2/ui-toolkit"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; - -// Skeleton pulse animation -const skeletonPulse = keyframes` - 0% { - opacity: 0.6; - } - 50% { - opacity: 0.8; - } - 100% { - opacity: 0.6; - } -`; - -// Base skeleton element -const SkeletonBase = styled.div<{ - width?: string | number; - height?: string | number; - borderRadius?: string | number; - margin?: string; -}>` - background-color: var(--vscode-editor-inactiveSelectionBackground); - border-radius: ${({ borderRadius = "4px" }) => - typeof borderRadius === "number" ? `${borderRadius}px` : borderRadius}; - animation: ${skeletonPulse} 1.5s ease-in-out infinite; - width: ${({ width = "100%" }) => - typeof width === "number" ? `${width}px` : width}; - height: ${({ height = "16px" }) => - typeof height === "number" ? `${height}px` : height}; - margin: ${({ margin = "0" }) => margin}; -`; +import { SkeletonBase } from "./styles"; // TitleBar skeleton container - matches TitleBarContainer const TitleBarSkeletonContainer = styled.div` diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/index.tsx index f5d87d98d5a..53d47454d80 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/index.tsx @@ -16,7 +16,6 @@ * under the License. */ -export { SkeletonText } from "./SkeletonText"; export { TitleBarSkeleton } from "./TitleBarSkeleton"; export { SwitchSkeleton } from "./SwitchSkeleton"; export { DiagramSkeleton } from "./DiagramSkeleton"; diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/styles.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/styles.tsx new file mode 100644 index 00000000000..6e753802bb9 --- /dev/null +++ b/workspaces/ballerina/ballerina-visualizer/src/components/Skeletons/styles.tsx @@ -0,0 +1,59 @@ +/** + * 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 { keyframes } from "@emotion/react"; +import styled from "@emotion/styled"; + +// Skeleton pulse animation +export const skeletonPulse = keyframes` + 0% { + opacity: 0.3; + } + 50% { + opacity: 0.9; + } + 100% { + opacity: 0.3; + } +`; + +// Base skeleton element +export const SkeletonBase = styled.div<{ + width?: string | number; + height?: string | number; + borderRadius?: string | number; + margin?: string; + position?: string; + top?: string | number; + left?: string | number; +}>` + background-color: var(--vscode-editor-inactiveSelectionBackground); + border-radius: ${({ borderRadius = "4px" }) => + typeof borderRadius === "number" ? `${borderRadius}px` : borderRadius}; + animation: ${skeletonPulse} 1.5s ease-in-out infinite; + width: ${({ width = "100%" }) => + typeof width === "number" ? `${width}px` : width}; + height: ${({ height = "16px" }) => + typeof height === "number" ? `${height}px` : height}; + margin: ${({ margin = "0" }) => margin}; + position: ${({ position = "static" }) => position}; + top: ${({ top }: { top?: string | number }) => + typeof top === "number" ? `${top}px` : top}; + left: ${({ left }: { left?: string | number }) => + typeof left === "number" ? `${left}px` : left}; +`; From 42aacc49a81837b7b5d76296065676638b2bb912 Mon Sep 17 00:00:00 2001 From: tharindulak Date: Mon, 28 Jul 2025 16:18:42 +0530 Subject: [PATCH 240/349] Clean trivy cache --- .github/workflows/build.yml | 65 +- common/config/rush/pnpm-lock.yaml | 1888 +++++++++++++++-------------- 2 files changed, 993 insertions(+), 960 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5d8643cef26..f7e1b39345c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -143,7 +143,47 @@ jobs: echo "MI Tests: ${{ steps.diff.outputs.hasMIDiff }}" echo "runMIExtTests=${{ steps.diff.outputs.hasMIDiff }}" >> $GITHUB_OUTPUT + - name: Install Trivy + run: | + sudo apt-get update + sudo apt-get install wget apt-transport-https gnupg lsb-release + wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo gpg --dearmor -o /usr/share/keyrings/trivy.gpg + echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list + sudo apt-get update + sudo apt-get install trivy + + - name: Security vulnerability scan + id: security-scan + run: | + echo "🔍 Running security vulnerability scan..." + trivy clean --all + echo "🔄 Downloading latest vulnerability database..." + trivy image --download-db-only alpine:latest || true + echo "🔍 Starting filesystem scan (matching local command exactly)..." + + # Run Trivy and capture output + TRIVY_OUTPUT=$(trivy fs . --timeout 10m --skip-dirs common/temp --format table) + echo "$TRIVY_OUTPUT" + + # Check if vulnerabilities were found (look for "Total:" line with non-zero counts) + if echo "$TRIVY_OUTPUT" | grep -q "Total:.*[1-9]"; then + echo "❌ Security vulnerabilities detected!" + echo "vulnerabilities_found=true" >> $GITHUB_OUTPUT + else + echo "✅ No security vulnerabilities found." + echo "vulnerabilities_found=false" >> $GITHUB_OUTPUT + fi + + - name: Security scan failure reporting + if: steps.security-scan.outputs.vulnerabilities_found == 'true' + run: | + echo "❌ Security vulnerabilities detected!" + echo "Please review the vulnerability report above and address the issues." + echo "Build failed due to security vulnerabilities." + exit 1 + - name: Build + if: steps.security-scan.outputs.vulnerabilities_found == 'false' uses: ./.github/actions/build with: isPreRelease: ${{ inputs.isPreRelease }} @@ -167,31 +207,6 @@ jobs: PLATFORM_DEV_GHAPP_CLIENT_ID: ${{ secrets.PLATFORM_DEV_GHAPP_CLIENT_ID }} PLATFORM_DEV_DEVANT_ASGARDEO_CLIENT_ID: ${{ secrets.PLATFORM_DEV_DEVANT_ASGARDEO_CLIENT_ID }} - - name: Install Trivy - run: | - sudo apt-get update - sudo apt-get install wget apt-transport-https gnupg lsb-release - wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo gpg --dearmor -o /usr/share/keyrings/trivy.gpg - echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list - sudo apt-get update - sudo apt-get install trivy - - - name: Security vulnerability scan - run: | - echo "🔍 Running security vulnerability scan..." - trivy fs . \ - --timeout 10m \ - --skip-dirs common/temp \ - --severity CRITICAL,HIGH,MEDIUM,LOW \ - --format table - - - name: Security scan failure reporting - if: failure() - run: | - echo "❌ Security vulnerabilities detected!" - echo "Please review the vulnerability report above and address the issues." - echo "Build failed due to security vulnerabilities." - ExtTest_Ballerina: name: Run Ballerina extension tests needs: Build_Stage diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 9440a34fa5e..01ab6efa226 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -111,16 +111,16 @@ importers: version: 1.102.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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.33.1(eslint@9.27.0(jiti@2.5.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.4.2) + version: 9.27.0(jiti@2.5.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -156,7 +156,7 @@ importers: version: link:../../wso2-platform/wso2-platform-core ai: specifier: ^4.3.16 - version: 4.3.17(react@19.1.0)(zod@3.25.76) + version: 4.3.19(react@19.1.0)(zod@3.25.76) cors-anywhere: specifier: ^0.4.4 version: 0.4.4 @@ -428,31 +428,31 @@ importers: version: 7.27.2(@babel/core@7.27.7) '@rollup/plugin-commonjs': specifier: ^28.0.3 - version: 28.0.6(rollup@4.45.1) + version: 28.0.6(rollup@4.46.1) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.45.1) + version: 6.1.0(rollup@4.46.1) '@rollup/plugin-node-resolve': specifier: ^16.0.1 - version: 16.0.1(rollup@4.45.1) + version: 16.0.1(rollup@4.46.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(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.100.2) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(eslint@9.27.0(jiti@2.5.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.100.2) '@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(eslint@9.27.0(jiti@2.4.2))(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(eslint@9.27.0(jiti@2.5.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(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@types/webpack@5.28.5(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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(eslint@9.27.0(jiti@2.5.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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@types/webpack@5.28.5(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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) '@types/classnames': specifier: ^2.2.9 version: 2.3.4 @@ -518,13 +518,13 @@ importers: version: 6.0.1 rollup: specifier: ^4.41.0 - version: 4.45.1 + version: 4.46.1 rollup-plugin-import-css: specifier: ^3.5.8 - version: 3.5.8(rollup@4.45.1) + version: 3.5.8(rollup@4.46.1) rollup-plugin-peer-deps-external: specifier: ^2.2.4 - version: 2.2.4(rollup@4.45.1) + version: 2.2.4(rollup@4.46.1) rollup-plugin-postcss: specifier: ^4.0.2 version: 4.0.2(postcss@8.5.6) @@ -536,7 +536,7 @@ importers: version: 2.0.0 rollup-plugin-typescript2: specifier: ^0.36.0 - version: 0.36.0(rollup@4.45.1)(typescript@5.8.3) + version: 0.36.0(rollup@4.46.1)(typescript@5.8.3) sass: specifier: ^1.89.0 version: 1.89.2 @@ -624,22 +624,22 @@ importers: 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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.33.1(eslint@9.27.0(jiti@2.5.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.4.2) + version: 9.27.0(jiti@2.5.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.4.2)) + version: 5.2.0(eslint@9.27.0(jiti@2.5.1)) eslint-plugin-react-refresh: specifier: ^0.4.20 - version: 0.4.20(eslint@9.27.0(jiti@2.4.2)) + version: 0.4.20(eslint@9.27.0(jiti@2.5.1)) typescript: specifier: 5.8.3 version: 5.8.3 @@ -679,7 +679,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.100.2))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2))(webpack-hot-middleware@2.26.1) '@types/lodash': specifier: ~4.17.16 version: 4.17.17 @@ -709,7 +709,7 @@ importers: version: 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) '@headlessui/react': specifier: ~2.2.4 - version: 2.2.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.2.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@hookform/resolvers': specifier: ~5.0.1 version: 5.0.1(react-hook-form@7.56.4(react@18.2.0)) @@ -854,13 +854,13 @@ importers: 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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) ai: specifier: ^4.3.16 - version: 4.3.17(react@18.2.0)(zod@3.25.76) + version: 4.3.19(react@18.2.0)(zod@3.25.76) buffer: specifier: ^6.0.3 version: 6.0.3 @@ -872,13 +872,13 @@ importers: version: 7.1.2(webpack@5.100.2) eslint: specifier: ^9.26.0 - version: 9.27.0(jiti@2.4.2) + version: 9.27.0(jiti@2.5.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.4.2)) + version: 5.2.0(eslint@9.27.0(jiti@2.5.1)) eslint-plugin-react-refresh: specifier: ^0.4.20 - version: 0.4.20(eslint@9.27.0(jiti@2.4.2)) + version: 0.4.20(eslint@9.27.0(jiti@2.5.1)) sass-loader: specifier: ^16.0.5 version: 16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.100.2) @@ -951,7 +951,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.100.2))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -1021,7 +1021,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.100.2))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -1139,13 +1139,13 @@ importers: version: 7.27.2(@babel/core@7.27.7) '@rollup/plugin-commonjs': specifier: ^28.0.3 - version: 28.0.6(rollup@4.45.1) + version: 28.0.6(rollup@4.46.1) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.45.1) + version: 6.1.0(rollup@4.46.1) '@rollup/plugin-node-resolve': specifier: ^16.0.1 - version: 16.0.1(rollup@4.45.1) + version: 16.0.1(rollup@4.46.1) '@storybook/addon-actions': specifier: ^8.6.14 version: 8.6.14(storybook@8.6.14(prettier@3.5.3)) @@ -1160,7 +1160,7 @@ importers: version: 8.6.14(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/manager-webpack5': specifier: ^6.5.16 - version: 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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: ^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) @@ -1196,13 +1196,13 @@ importers: version: 5.28.5(webpack-cli@6.0.1) '@typescript-eslint/eslint-plugin': specifier: ~8.32.1 - version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ~8.32.1 - version: 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) '@vitejs/plugin-react': specifier: ^4.4.1 - version: 4.7.0(vite@6.3.5(@types/node@22.15.35)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) + version: 4.7.0(vite@6.3.5(@types/node@22.15.35)(jiti@2.5.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) babel-loader: specifier: ^10.0.0 version: 10.0.0(@babel/core@7.27.7)(webpack@5.100.2) @@ -1223,13 +1223,13 @@ importers: version: 0.8.5 eslint: specifier: ^9.27.0 - version: 9.27.0(jiti@2.4.2) + version: 9.27.0(jiti@2.5.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.4.2)) + version: 5.2.0(eslint@9.27.0(jiti@2.5.1)) eslint-plugin-react-refresh: specifier: ^0.4.20 - version: 0.4.20(eslint@9.27.0(jiti@2.4.2)) + version: 0.4.20(eslint@9.27.0(jiti@2.5.1)) file-loader: specifier: ^6.2.0 version: 6.2.0(webpack@5.100.2) @@ -1259,13 +1259,13 @@ importers: version: 6.0.1 rollup: specifier: ^4.41.0 - version: 4.45.1 + version: 4.46.1 rollup-plugin-import-css: specifier: ^3.5.8 - version: 3.5.8(rollup@4.45.1) + version: 3.5.8(rollup@4.46.1) rollup-plugin-peer-deps-external: specifier: ^2.2.4 - version: 2.2.4(rollup@4.45.1) + version: 2.2.4(rollup@4.46.1) rollup-plugin-postcss: specifier: ^4.0.2 version: 4.0.2(postcss@8.5.6) @@ -1277,7 +1277,7 @@ importers: version: 2.0.0 rollup-plugin-typescript2: specifier: ^0.36.0 - version: 0.36.0(rollup@4.45.1)(typescript@5.8.3) + version: 0.36.0(rollup@4.46.1)(typescript@5.8.3) sass: specifier: ^1.89.0 version: 1.89.2 @@ -1319,7 +1319,7 @@ importers: version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@22.15.35)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) + version: 6.3.5(@types/node@22.15.35)(jiti@2.5.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) vscode-uri: specifier: ^3.1.0 version: 3.1.0 @@ -1359,19 +1359,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.4.2))(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.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.100.2) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.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.5.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.100.2) '@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.4.2))(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.27.0(jiti@2.5.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.4.2))(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.27.0(jiti@2.5.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.4.2))(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.4.2))(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.4.2))(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.27.0(jiti@2.5.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.5.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.5.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) '@types/react': specifier: 18.2.0 version: 18.2.0 @@ -1580,10 +1580,10 @@ importers: 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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ~8.32.1 - version: 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -1592,13 +1592,13 @@ importers: version: 7.1.2(webpack@5.100.2) eslint: specifier: ^9.26.0 - version: 9.27.0(jiti@2.4.2) + version: 9.27.0(jiti@2.5.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.4.2)) + version: 5.2.0(eslint@9.27.0(jiti@2.5.1)) eslint-plugin-react-refresh: specifier: ^0.4.4 - version: 0.4.20(eslint@9.27.0(jiti@2.4.2)) + version: 0.4.20(eslint@9.27.0(jiti@2.5.1)) file-loader: specifier: ^6.2.0 version: 6.2.0(webpack@5.100.2) @@ -1868,7 +1868,7 @@ importers: version: 2.4.1 eslint: specifier: ~9.26.0 - version: 9.26.0(jiti@2.4.2) + version: 9.26.0(jiti@2.5.1) react-scripts-ts: specifier: 3.1.0 version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.28.0))(babel-runtime@6.26.0)(typescript@5.8.3) @@ -1926,7 +1926,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.26.0(jiti@2.4.2))(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.100.2))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.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.100.2))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -1941,19 +1941,19 @@ importers: 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.4.2))(typescript@5.8.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.5.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.4.2) + version: 9.26.0(jiti@2.5.1) eslint-plugin-react-hooks: specifier: ~5.2.0 - version: 5.2.0(eslint@9.26.0(jiti@2.4.2)) + version: 5.2.0(eslint@9.26.0(jiti@2.5.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.4.2))(typescript@5.8.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.26.0(jiti@2.4.2)) + version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.5.1)) prettier: specifier: ~3.5.3 version: 3.5.3 @@ -2026,7 +2026,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.5.9 - version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.100.2))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2))(webpack-hot-middleware@2.26.1) '@types/classnames': specifier: ^2.2.9 version: 2.3.4 @@ -2289,7 +2289,7 @@ importers: version: 2.4.1 eslint: specifier: ~9.26.0 - version: 9.26.0(jiti@2.4.2) + version: 9.26.0(jiti@2.5.1) react-scripts-ts: specifier: 3.1.0 version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.28.0))(babel-runtime@6.26.0)(typescript@5.8.3) @@ -2529,7 +2529,7 @@ importers: version: 0.8.2 '@headlessui/react': specifier: ^2.2.4 - version: 2.2.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.2.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@hookform/resolvers': specifier: ^5.0.1 version: 5.0.1(react-hook-form@7.56.4(react@18.2.0)) @@ -2729,10 +2729,10 @@ importers: 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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ~8.33.0 - version: 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -2872,19 +2872,19 @@ importers: devDependencies: '@storybook/addon-docs': specifier: ^9.0.12 - version: 9.0.17(@types/react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + version: 9.0.18(@types/react@18.2.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) '@storybook/addon-essentials': specifier: ^8.6.14 - version: 8.6.14(@types/react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + version: 8.6.14(@types/react@18.2.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) '@storybook/cli': specifier: ^9.0.12 - version: 9.0.17(@babel/preset-env@7.27.2(@babel/core@7.28.0))(@testing-library/dom@10.4.0)(prettier@3.5.3) + version: 9.0.18(@babel/preset-env@7.27.2(@babel/core@7.28.0))(@testing-library/dom@10.4.1)(prettier@3.5.3) '@storybook/react': specifier: ^9.0.12 - version: 9.0.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3) + version: 9.0.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3) '@storybook/react-vite': specifier: ^9.0.12 - version: 9.0.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.45.1)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.35)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) + version: 9.0.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.46.1)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.35)(jiti@2.5.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) '@types/lodash': specifier: ~4.17.16 version: 4.17.17 @@ -2917,7 +2917,7 @@ importers: version: 5.2.0(eslint@8.57.1) eslint-plugin-storybook: specifier: ^9.0.12 - version: 9.0.17(eslint@8.57.1)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3) + version: 9.0.18(eslint@8.57.1)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3) gh-pages: specifier: ^6.3.0 version: 6.3.0 @@ -2932,7 +2932,7 @@ importers: version: 6.0.0(react@19.1.0) storybook: specifier: ^9.0.12 - version: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + version: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -2981,7 +2981,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.100.2))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -3024,13 +3024,13 @@ importers: 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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) eslint: specifier: ^9.27.0 - version: 9.27.0(jiti@2.4.2) + version: 9.27.0(jiti@2.5.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -3133,10 +3133,10 @@ importers: 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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ~8.32.1 - version: 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -3145,13 +3145,13 @@ importers: version: 7.1.2(webpack@5.100.2) eslint: specifier: ^9.27.0 - version: 9.27.0(jiti@2.4.2) + version: 9.27.0(jiti@2.5.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.4.2)) + version: 5.2.0(eslint@9.27.0(jiti@2.5.1)) eslint-plugin-react-refresh: specifier: ^0.4.20 - version: 0.4.20(eslint@9.27.0(jiti@2.4.2)) + version: 0.4.20(eslint@9.27.0(jiti@2.5.1)) file-loader: specifier: ^6.2.0 version: 6.2.0(webpack@5.100.2) @@ -3246,10 +3246,10 @@ importers: version: 2.4.1 eslint-plugin-react-hooks: specifier: ~5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.4.2)) + version: 5.2.0(eslint@9.27.0(jiti@2.5.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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2)) + version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1)) html-to-image: specifier: 1.11.11 version: 1.11.11 @@ -3331,13 +3331,13 @@ importers: version: 8.6.14(storybook@8.6.14(prettier@3.5.3)) '@testing-library/dom': specifier: ~10.4.0 - version: 10.4.0 + version: 10.4.1 '@testing-library/jest-dom': specifier: ~6.6.3 - version: 6.6.3 + version: 6.6.4 '@testing-library/react': specifier: ~16.3.0 - version: 16.3.0(@testing-library/dom@10.4.0)(@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.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) '@types/deep-equal': specifier: ~1.0.4 version: 1.0.4 @@ -3358,7 +3358,7 @@ importers: 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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) babel-jest: specifier: 29.7.0 version: 29.7.0(@babel/core@7.27.7) @@ -3566,10 +3566,10 @@ importers: version: 1.102.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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) '@vscode/test-electron': specifier: ^2.5.2 version: 2.5.2 @@ -3587,7 +3587,7 @@ importers: version: 1.0.1 eslint: specifier: ^9.27.0 - version: 9.27.0(jiti@2.4.2) + version: 9.27.0(jiti@2.5.1) glob: specifier: ^11.0.2 version: 11.0.3 @@ -3651,13 +3651,13 @@ importers: 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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) eslint: specifier: ^9.27.0 - version: 9.27.0(jiti@2.4.2) + version: 9.27.0(jiti@2.5.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -3814,19 +3814,19 @@ importers: version: 7.27.1(@babel/core@7.28.0) '@headlessui/react': specifier: ~2.2.4 - version: 2.2.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.2.6(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@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + version: 8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) '@storybook/addon-essentials': specifier: ~8.6.14 - version: 8.6.14(@types/react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + version: 8.6.14(@types/react@18.2.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) '@storybook/addon-links': specifier: ~8.6.14 - version: 8.6.14(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + version: 8.6.14(react@18.2.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) '@storybook/react-webpack5': specifier: ~8.6.14 - version: 8.6.14(@storybook/test@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4) + version: 8.6.14(@storybook/test@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4) '@types/lodash': specifier: ~4.17.17 version: 4.17.17 @@ -3886,7 +3886,7 @@ importers: version: 22.15.35 eslint: specifier: ~9.27.0 - version: 9.27.0(jiti@2.4.2) + version: 9.27.0(jiti@2.5.1) jsonix: specifier: ~3.0.0 version: 3.0.0 @@ -3902,13 +3902,13 @@ importers: 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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) eslint-plugin-react-hooks: specifier: ~5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.4.2)) + version: 5.2.0(eslint@9.27.0(jiti@2.5.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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2)) + version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1)) husky: specifier: ^9.1.7 version: 9.1.7 @@ -4087,7 +4087,7 @@ importers: version: 0.8.2 '@headlessui/react': specifier: ^2.1.2 - version: 2.2.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 2.2.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@hookform/resolvers': specifier: ^5.0.1 version: 5.0.1(react-hook-form@7.56.4(react@18.2.0)) @@ -4476,16 +4476,16 @@ packages: resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} engines: {node: '>=20.0.0'} - '@azure/msal-browser@4.15.0': - resolution: {integrity: sha512-+AIGTvpVz+FIx5CsM1y+nW0r/qOb/ChRdM8/Cbp+jKWC0Wdw4ldnwPdYOBi5NaALUQnYITirD9XMZX7LdklEzQ==} + '@azure/msal-browser@4.16.0': + resolution: {integrity: sha512-yF8gqyq7tVnYftnrWaNaxWpqhGQXoXpDfwBtL7UCGlIbDMQ1PUJF/T2xCL6NyDNHoO70qp1xU8GjjYTyNIefkw==} engines: {node: '>=0.8.0'} - '@azure/msal-common@15.8.1': - resolution: {integrity: sha512-ltIlFK5VxeJ5BurE25OsJIfcx1Q3H/IZg2LjV9d4vmH+5t4c1UCyRQ/HgKLgXuCZShs7qfc/TC95GYZfsUsJUQ==} + '@azure/msal-common@15.9.0': + resolution: {integrity: sha512-lbz/D+C9ixUG3hiZzBLjU79a0+5ZXCorjel3mwXluisKNH0/rOS/ajm8yi4yI9RP5Uc70CAcs9Ipd0051Oh/kA==} engines: {node: '>=0.8.0'} - '@azure/msal-node@3.6.3': - resolution: {integrity: sha512-95wjsKGyUcAd5tFmQBo5Ug/kOj+hFh/8FsXuxluEvdfbgg6xCimhSP9qnyq6+xIg78/jREkBD1/BSqd7NIDDYQ==} + '@azure/msal-node@3.6.4': + resolution: {integrity: sha512-jMeut9UQugcmq7aPWWlJKhJIse4DQ594zc/JaP6BIxg55XaX3aM/jcPuIQ4ryHnI4QSf03wUspy/uqAvjWKbOg==} engines: {node: '>=16'} '@babel/code-frame@7.27.1': @@ -4608,8 +4608,8 @@ packages: resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.6': - resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + '@babel/helpers@7.28.2': + resolution: {integrity: sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==} engines: {node: '>=6.9.0'} '@babel/parser@7.28.0': @@ -5221,12 +5221,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime-corejs3@7.28.0': - resolution: {integrity: sha512-nlIXnSqLcBij8K8TtkxbBJgfzfvi75V1pAKSM7dUXejGw12vJAqez74jZrHTsJ3Z+Aczc5Q/6JgNjKRMsVU44g==} + '@babel/runtime-corejs3@7.28.2': + resolution: {integrity: sha512-FVFaVs2/dZgD3Y9ZD+AKNKjyGKzwu0C54laAXWUXgLcVXcCX6YZ6GhK2cp7FogSN2OA0Fu+QT8dP3FUdo9ShSQ==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.27.6': - resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} + '@babel/runtime@7.28.2': + resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} engines: {node: '>=6.9.0'} '@babel/template@7.27.2': @@ -5237,8 +5237,8 @@ packages: resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.1': - resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} engines: {node: '>=6.9.0'} '@base2/pretty-print-object@1.0.1': @@ -5754,8 +5754,8 @@ packages: react: ^16 || ^17 || ^18 react-dom: ^16 || ^17 || ^18 - '@headlessui/react@2.2.4': - resolution: {integrity: sha512-lz+OGcAH1dK93rgSMzXmm1qKOJkBUqZf1L4M8TWLNplftQD3IkoEDdUFNfAn4ylsN6WOTVtWaLmvmaHOUk1dTA==} + '@headlessui/react@2.2.6': + resolution: {integrity: sha512-gN5CT8Kf4IWwL04GQOjZ/ZnHMFoeFHZmVSFoDKeTmbtmy9oFqQqJMthdBiO3Pl5LXk2w03fGFLpQV6EW84vjjQ==} engines: {node: '>=10'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc @@ -5975,14 +5975,14 @@ packages: peerDependencies: tslib: '2' - '@jsonjoy.com/json-pack@1.2.0': - resolution: {integrity: sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==} + '@jsonjoy.com/json-pack@1.4.0': + resolution: {integrity: sha512-Akn8XZqN3xO9YGcgvIiTauBBXTP92QSvw6EcGha+p5nm7brhbwvev5gw4fi+ouLGrBpfPpb72+S5pxl4mkMIGQ==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' - '@jsonjoy.com/util@1.6.0': - resolution: {integrity: sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==} + '@jsonjoy.com/util@1.8.0': + resolution: {integrity: sha512-HeR0JQNEdBozt+FrfyM5T0X3R+fIN0D+BRDkxPP5o41fTWzHfeZEqtK16aTW8haU+h+SG7XYq9PP5kobvOmkSA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' @@ -6079,8 +6079,8 @@ packages: '@microsoft/fast-web-utilities@5.4.1': resolution: {integrity: sha512-ReWYncndjV3c8D8iq9tp7NcFNc1vbVHvcBFPME2nNFKNbS1XCesYZGlIlf3ot5EmuOXPlrzUHOWzQ2vFpIkqDg==} - '@modelcontextprotocol/sdk@1.16.0': - resolution: {integrity: sha512-8ofX7gkZcLj9H9rSd50mCgm3SSF8C7XoclxJuLoV0Cz3rEQ1tv9MZRYYvJtm9n1BiEQQMzSmE/w2AEkNacLYfg==} + '@modelcontextprotocol/sdk@1.17.0': + resolution: {integrity: sha512-qFfbWFA7r1Sd8D697L7GkTd36yqDuTkvz0KfOGkgXR8EUhQn3/EDNIR/qUdQNMT8IjmasBvHWuXeisxtXTQT2g==} engines: {node: '>=18'} '@monaco-editor/loader@1.5.0': @@ -6978,26 +6978,26 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@react-aria/focus@3.20.5': - resolution: {integrity: sha512-JpFtXmWQ0Oca7FcvkqgjSyo6xEP7v3oQOLUId6o0xTvm4AD5W0mU2r3lYrbhsJ+XxdUUX4AVR5473sZZ85kU4A==} + '@react-aria/focus@3.21.0': + resolution: {integrity: sha512-7NEGtTPsBy52EZ/ToVKCu0HSelE3kq9qeis+2eEq90XSuJOMaDHUQrA7RC2Y89tlEwQB31bud/kKRi9Qme1dkA==} 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.3': - resolution: {integrity: sha512-J1bhlrNtjPS/fe5uJQ+0c7/jiXniwa4RQlP+Emjfc/iuqpW2RhbF9ou5vROcLzWIyaW8tVMZ468J68rAs/aZ5A==} + '@react-aria/interactions@3.25.4': + resolution: {integrity: sha512-HBQMxgUPHrW8V63u9uGgBymkMfj6vdWbB0GgUJY49K9mBKMsypcHeWkWM6+bF7kxRO728/IK8bWDV6whDbqjHg==} 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/ssr@3.9.9': - resolution: {integrity: sha512-2P5thfjfPy/np18e5wD4WPt8ydNXhij1jwA8oehxZTFqlgVMGXzcWKxTb4RtJrLFsqPO7RUQTiY8QJk0M4Vy2g==} + '@react-aria/ssr@3.9.10': + resolution: {integrity: sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==} engines: {node: '>= 12'} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/utils@3.29.1': - resolution: {integrity: sha512-yXMFVJ73rbQ/yYE/49n5Uidjw7kh192WNN9PNQGV0Xoc7EJUlSOxqhnpHmYTyO0EotJ8fdM1fMH8durHjUSI8g==} + '@react-aria/utils@3.30.0': + resolution: {integrity: sha512-ydA6y5G1+gbem3Va2nczj/0G0W7/jUVo/cbN10WA5IizzWIwMP5qhFr7macgbKfHMkZ+YZC3oXnt2NNre5odKw==} 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 @@ -7014,13 +7014,13 @@ packages: '@react-stately/flags@3.1.2': resolution: {integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==} - '@react-stately/utils@3.10.7': - resolution: {integrity: sha512-cWvjGAocvy4abO9zbr6PW6taHgF24Mwy/LbQ4TC4Aq3tKdKDntxyD+sh7AkSRfJRT2ccMVaHVv2+FfHThd3PKQ==} + '@react-stately/utils@3.10.8': + resolution: {integrity: sha512-SN3/h7SzRsusVQjQ4v10LaVsDc81jyyR0DD5HnsQitm/I5WDpaSr2nRHtyloPFU48jlql1XX/S04T2DLQM7Y3g==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-types/shared@3.30.0': - resolution: {integrity: sha512-COIazDAx1ncDg046cTJ8SFYsX8aS3lB/08LDnbkH/SkdYrFPWDlXMrO/sUam8j1WWM+PJ+4d1mj7tODIKNiFog==} + '@react-types/shared@3.31.0': + resolution: {integrity: sha512-ua5U6V66gDcbLZe4P2QeyNgPp4YWD1ymGA6j3n+s8CGExtrCPe64v+g4mvpT8Bnb985R96e4zFT61+m0YCwqMg==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 @@ -7118,103 +7118,103 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.45.1': - resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} + '@rollup/rollup-android-arm-eabi@4.46.1': + resolution: {integrity: sha512-oENme6QxtLCqjChRUUo3S6X8hjCXnWmJWnedD7VbGML5GUtaOtAyx+fEEXnBXVf0CBZApMQU0Idwi0FmyxzQhw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.45.1': - resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} + '@rollup/rollup-android-arm64@4.46.1': + resolution: {integrity: sha512-OikvNT3qYTl9+4qQ9Bpn6+XHM+ogtFadRLuT2EXiFQMiNkXFLQfNVppi5o28wvYdHL2s3fM0D/MZJ8UkNFZWsw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.45.1': - resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} + '@rollup/rollup-darwin-arm64@4.46.1': + resolution: {integrity: sha512-EFYNNGij2WllnzljQDQnlFTXzSJw87cpAs4TVBAWLdkvic5Uh5tISrIL6NRcxoh/b2EFBG/TK8hgRrGx94zD4A==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.45.1': - resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} + '@rollup/rollup-darwin-x64@4.46.1': + resolution: {integrity: sha512-ZaNH06O1KeTug9WI2+GRBE5Ujt9kZw4a1+OIwnBHal92I8PxSsl5KpsrPvthRynkhMck4XPdvY0z26Cym/b7oA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.45.1': - resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} + '@rollup/rollup-freebsd-arm64@4.46.1': + resolution: {integrity: sha512-n4SLVebZP8uUlJ2r04+g2U/xFeiQlw09Me5UFqny8HGbARl503LNH5CqFTb5U5jNxTouhRjai6qPT0CR5c/Iig==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.45.1': - resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} + '@rollup/rollup-freebsd-x64@4.46.1': + resolution: {integrity: sha512-8vu9c02F16heTqpvo3yeiu7Vi1REDEC/yES/dIfq3tSXe6mLndiwvYr3AAvd1tMNUqE9yeGYa5w7PRbI5QUV+w==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': - resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} + '@rollup/rollup-linux-arm-gnueabihf@4.46.1': + resolution: {integrity: sha512-K4ncpWl7sQuyp6rWiGUvb6Q18ba8mzM0rjWJ5JgYKlIXAau1db7hZnR0ldJvqKWWJDxqzSLwGUhA4jp+KqgDtQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.45.1': - resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} + '@rollup/rollup-linux-arm-musleabihf@4.46.1': + resolution: {integrity: sha512-YykPnXsjUjmXE6j6k2QBBGAn1YsJUix7pYaPLK3RVE0bQL2jfdbfykPxfF8AgBlqtYbfEnYHmLXNa6QETjdOjQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.45.1': - resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} + '@rollup/rollup-linux-arm64-gnu@4.46.1': + resolution: {integrity: sha512-kKvqBGbZ8i9pCGW3a1FH3HNIVg49dXXTsChGFsHGXQaVJPLA4f/O+XmTxfklhccxdF5FefUn2hvkoGJH0ScWOA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.45.1': - resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} + '@rollup/rollup-linux-arm64-musl@4.46.1': + resolution: {integrity: sha512-zzX5nTw1N1plmqC9RGC9vZHFuiM7ZP7oSWQGqpbmfjK7p947D518cVK1/MQudsBdcD84t6k70WNczJOct6+hdg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': - resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} + '@rollup/rollup-linux-loongarch64-gnu@4.46.1': + resolution: {integrity: sha512-O8CwgSBo6ewPpktFfSDgB6SJN9XDcPSvuwxfejiddbIC/hn9Tg6Ai0f0eYDf3XvB/+PIWzOQL+7+TZoB8p9Yuw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': - resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} + '@rollup/rollup-linux-ppc64-gnu@4.46.1': + resolution: {integrity: sha512-JnCfFVEKeq6G3h3z8e60kAp8Rd7QVnWCtPm7cxx+5OtP80g/3nmPtfdCXbVl063e3KsRnGSKDHUQMydmzc/wBA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.45.1': - resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} + '@rollup/rollup-linux-riscv64-gnu@4.46.1': + resolution: {integrity: sha512-dVxuDqS237eQXkbYzQQfdf/njgeNw6LZuVyEdUaWwRpKHhsLI+y4H/NJV8xJGU19vnOJCVwaBFgr936FHOnJsQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.45.1': - resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==} + '@rollup/rollup-linux-riscv64-musl@4.46.1': + resolution: {integrity: sha512-CvvgNl2hrZrTR9jXK1ye0Go0HQRT6ohQdDfWR47/KFKiLd5oN5T14jRdUVGF4tnsN8y9oSfMOqH6RuHh+ck8+w==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.45.1': - resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} + '@rollup/rollup-linux-s390x-gnu@4.46.1': + resolution: {integrity: sha512-x7ANt2VOg2565oGHJ6rIuuAon+A8sfe1IeUx25IKqi49OjSr/K3awoNqr9gCwGEJo9OuXlOn+H2p1VJKx1psxA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.45.1': - resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} + '@rollup/rollup-linux-x64-gnu@4.46.1': + resolution: {integrity: sha512-9OADZYryz/7E8/qt0vnaHQgmia2Y0wrjSSn1V/uL+zw/i7NUhxbX4cHXdEQ7dnJgzYDS81d8+tf6nbIdRFZQoQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.45.1': - resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} + '@rollup/rollup-linux-x64-musl@4.46.1': + resolution: {integrity: sha512-NuvSCbXEKY+NGWHyivzbjSVJi68Xfq1VnIvGmsuXs6TCtveeoDRKutI5vf2ntmNnVq64Q4zInet0UDQ+yMB6tA==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.45.1': - resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} + '@rollup/rollup-win32-arm64-msvc@4.46.1': + resolution: {integrity: sha512-mWz+6FSRb82xuUMMV1X3NGiaPFqbLN9aIueHleTZCc46cJvwTlvIh7reQLk4p97dv0nddyewBhwzryBHH7wtPw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.45.1': - resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} + '@rollup/rollup-win32-ia32-msvc@4.46.1': + resolution: {integrity: sha512-7Thzy9TMXDw9AU4f4vsLNBxh7/VOKuXi73VH3d/kHGr0tZ3x/ewgL9uC7ojUKmH1/zvmZe2tLapYcZllk3SO8Q==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.45.1': - resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} + '@rollup/rollup-win32-x64-msvc@4.46.1': + resolution: {integrity: sha512-7GVB4luhFmGUNXXJhH2jJwZCFB3pIOixv2E3s17GQHBFUOQaISlt7aGcQgqvCaDSxTZJUzlK/QJ1FN8S94MrzQ==} cpu: [x64] os: [win32] @@ -7347,8 +7347,8 @@ packages: resolution: {integrity: sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==} engines: {node: '>=18.0.0'} - '@smithy/core@3.7.1': - resolution: {integrity: sha512-ExRCsHnXFtBPnM7MkfKBPcBBdHw1h/QS/cbNw4ho95qnyNHvnpmGbR39MIAv9KggTr5qSPxRSEL+hRXlyGyGQw==} + '@smithy/core@3.7.2': + resolution: {integrity: sha512-JoLw59sT5Bm8SAjFCYZyuCGxK8y3vovmoVbZWLDPTH5XpPEIwpFd9m90jjVMwoypDuB/SdVgje5Y4T7w50lJaw==} engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.0.6': @@ -7411,12 +7411,12 @@ packages: resolution: {integrity: sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.1.16': - resolution: {integrity: sha512-plpa50PIGLqzMR2ANKAw2yOW5YKS626KYKqae3atwucbz4Ve4uQ9K9BEZxDLIFmCu7hKLcrq2zmj4a+PfmUV5w==} + '@smithy/middleware-endpoint@4.1.17': + resolution: {integrity: sha512-S3hSGLKmHG1m35p/MObQCBCdRsrpbPU8B129BVzRqRfDvQqPMQ14iO4LyRw+7LNizYc605COYAcjqgawqi+6jA==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.1.17': - resolution: {integrity: sha512-gsCimeG6BApj0SBecwa1Be+Z+JOJe46iy3B3m3A8jKJHf7eIihP76Is4LwLrbJ1ygoS7Vg73lfqzejmLOrazUA==} + '@smithy/middleware-retry@4.1.18': + resolution: {integrity: sha512-bYLZ4DkoxSsPxpdmeapvAKy7rM5+25gR7PGxq2iMiecmbrRGBHj9s75N74Ylg+aBiw9i5jIowC/cLU2NR0qH8w==} engines: {node: '>=18.0.0'} '@smithy/middleware-serde@4.0.8': @@ -7463,8 +7463,8 @@ packages: resolution: {integrity: sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.4.8': - resolution: {integrity: sha512-pcW691/lx7V54gE+dDGC26nxz8nrvnvRSCJaIYD6XLPpOInEZeKdV/SpSux+wqeQ4Ine7LJQu8uxMvobTIBK0w==} + '@smithy/smithy-client@4.4.9': + resolution: {integrity: sha512-mbMg8mIUAWwMmb74LoYiArP04zWElPzDoA1jVOp3or0cjlDMgoS6WTC3QXK0Vxoc9I4zdrX0tq6qsOmaIoTWEQ==} engines: {node: '>=18.0.0'} '@smithy/types@4.3.1': @@ -7499,12 +7499,12 @@ packages: resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.0.24': - resolution: {integrity: sha512-UkQNgaQ+bidw1MgdgPO1z1k95W/v8Ej/5o/T/Is8PiVUYPspl/ZxV6WO/8DrzZQu5ULnmpB9CDdMSRwgRc21AA==} + '@smithy/util-defaults-mode-browser@4.0.25': + resolution: {integrity: sha512-pxEWsxIsOPLfKNXvpgFHBGFC3pKYKUFhrud1kyooO9CJai6aaKDHfT10Mi5iiipPXN/JhKAu3qX9o75+X85OdQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.0.24': - resolution: {integrity: sha512-phvGi/15Z4MpuQibTLOYIumvLdXb+XIJu8TA55voGgboln85jytA3wiD7CkUE8SNcWqkkb+uptZKPiuFouX/7g==} + '@smithy/util-defaults-mode-node@4.0.25': + resolution: {integrity: sha512-+w4n4hKFayeCyELZLfsSQG5mCC3TwSkmRHv4+el5CzFU8ToQpYGhpV7mrRzqlwKkntlPilT1HJy1TVeEvEjWOQ==} engines: {node: '>=18.0.0'} '@smithy/util-endpoints@3.0.6': @@ -7652,10 +7652,10 @@ packages: peerDependencies: storybook: ^8.6.14 - '@storybook/addon-docs@9.0.17': - resolution: {integrity: sha512-LOX/kKgQGnyulrqZHsvf77+ZoH/nSUaplGr5hvZglW/U6ak6fO9seJyXAzVKEnC6p+F8n02kFBZbi3s+znQhSg==} + '@storybook/addon-docs@9.0.18': + resolution: {integrity: sha512-1mLhaRDx8s1JAF51o56OmwMnIsg4BOQJ8cn+4wbMjh14pDFALrovlFl/BpAXnV1VaZqHjCB4ZWuP+y5CwXEpeQ==} peerDependencies: - storybook: ^9.0.17 + storybook: ^9.0.18 '@storybook/addon-essentials@6.5.16': resolution: {integrity: sha512-TeoMr6tEit4Pe91GH6f8g/oar1P4M0JL9S6oMcFxxrhhtOGO7XkWD5EnfyCx272Ok2VYfE58FNBTGPNBVIqYKQ==} @@ -7921,10 +7921,10 @@ packages: '@storybook/builder-manager@7.6.20': resolution: {integrity: sha512-e2GzpjLaw6CM/XSmc4qJRzBF8GOoOyotyu3JrSPTYOt4RD8kjUsK4QlismQM1DQRu8i39aIexxmRbiJyD74xzQ==} - '@storybook/builder-vite@9.0.17': - resolution: {integrity: sha512-lyuvgGhb0NaVk1tdB4xwzky6+YXQfxlxfNQqENYZ9uYQZdPfErMa4ZTXVQTV+CQHAa2NL+p/dG2JPAeu39e9UA==} + '@storybook/builder-vite@9.0.18': + resolution: {integrity: sha512-lfbrozA6UPVizDrgbPEe04WMtxIraESwUkmwW3+Lxh8rKEUj5cXngcrJUW+meQNNaggdZZWEqeEtweuaLIR+Hg==} peerDependencies: - storybook: ^9.0.17 + storybook: ^9.0.18 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 '@storybook/builder-webpack4@6.5.16': @@ -7985,8 +7985,8 @@ packages: resolution: {integrity: sha512-ZlP+BJyqg7HlnXf7ypjG2CKMI/KVOn03jFIiClItE/jQfgR6kRFgtjRU7uajh427HHfjv9DRiur8nBzuO7vapA==} hasBin: true - '@storybook/cli@9.0.17': - resolution: {integrity: sha512-e/eFng34IiEGtyqxtwgG+wQeQf3h41XIf5GKNI0mEUwSRRdqYg6m2MGolF41miZ681x35QnABfoh02R5M02OMQ==} + '@storybook/cli@9.0.18': + resolution: {integrity: sha512-C+w8Kr06HOfF1zdok98FQP5JIhFjmDFeEvWwpIpg/RKW1ATQj9fXQ6Wk2QWbo1Cq4WDFG2DeVjlBmQXE2PMbUA==} hasBin: true '@storybook/client-api@6.5.16': @@ -8010,8 +8010,8 @@ packages: '@storybook/codemod@7.6.20': resolution: {integrity: sha512-8vmSsksO4XukNw0TmqylPmk7PxnfNfE21YsxFa7mnEBmEKQcZCQsNil4ZgWfG0IzdhTfhglAN4r++Ew0WE+PYA==} - '@storybook/codemod@9.0.17': - resolution: {integrity: sha512-mTtj4avQS3Y5ROBbIs4srCBbu8Fqpq5oVLwzNvwXysAFpWX/FWccRQ7VM+2UQE906qk3SA59HjI8s9JlcmWvcg==} + '@storybook/codemod@9.0.18': + resolution: {integrity: sha512-Obk26MVkSK9z+aX8hiYI5O+buA3W0CnDcgY+92T0GwM4Ia8W8jdFDv2hxv3CJJxNyu/cLJW6bgxItWwTIKHLUg==} '@storybook/components@6.5.16': resolution: {integrity: sha512-LzBOFJKITLtDcbW9jXl0/PaG+4xAz25PK8JxPZpIALbmOpYWOAPcO6V9C2heX6e6NgWFMUxjplkULEk9RCQMNA==} @@ -8129,10 +8129,10 @@ packages: peerDependencies: storybook: ^8.6.14 - '@storybook/csf-plugin@9.0.17': - resolution: {integrity: sha512-6Q4eo1ObrLlsnB6bIt6T8+45XAb4to2pQGNrI7QPkLQRLrZinrJcNbLY7AGkyIoCOEsEbq08n09/nClQUbu8HA==} + '@storybook/csf-plugin@9.0.18': + resolution: {integrity: sha512-MQ3WwXnMua5sX0uYyuO7dC5WOWuJCLqf8CsOn3zQ2ptNoH6hD7DFx5ZOa1uD6VxIuJ3LkA+YqfSRBncomJoRnA==} peerDependencies: - storybook: ^9.0.17 + storybook: ^9.0.18 '@storybook/csf-tools@6.5.16': resolution: {integrity: sha512-+WD4sH/OwAfXZX3IN6/LOZ9D9iGEFcN+Vvgv9wOsLRgsAZ10DG/NK6c1unXKDM/ogJtJYccNI8Hd+qNE/GFV6A==} @@ -8304,20 +8304,20 @@ packages: react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta storybook: ^8.6.14 - '@storybook/react-dom-shim@9.0.17': - resolution: {integrity: sha512-ak/x/m6MDDxdE6rCDymTltaiQF3oiKrPHSwfM+YPgQR6MVmzTTs4+qaPfeev7FZEHq23IkfDMTmSTTJtX7Vs9A==} + '@storybook/react-dom-shim@9.0.18': + resolution: {integrity: sha512-qGR/d9x9qWRRxITaBVQkMnb73kwOm+N8fkbZRxc7U4lxupXRvkMIDh247nn71SYVBnvbh6//AL7P6ghiPWZYjA==} 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: ^9.0.17 + storybook: ^9.0.18 - '@storybook/react-vite@9.0.17': - resolution: {integrity: sha512-wx1yKScni4ifOC/ccqpnnpceQbyF2xto+jHGsyua+M4UUCQdS2NYPDR8JFWp1YvBhVt2cQiD6SAltVGM9QLGnQ==} + '@storybook/react-vite@9.0.18': + resolution: {integrity: sha512-dHzUoeY0/S35TvSYxCkPuBlNQZx4Zj9QDhAZ0qdv+nSll++uPgqSe2y2vF+2p+XVYhjDn+YX5LORv00YtuQezg==} engines: {node: '>=20.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: ^9.0.17 + storybook: ^9.0.18 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 '@storybook/react-webpack5@7.4.6': @@ -8400,13 +8400,13 @@ packages: typescript: optional: true - '@storybook/react@9.0.17': - resolution: {integrity: sha512-wssao+uXg72OHtEJdQmmQJGdX90x/aU/6avoP3fgVgepWdZXVgciS9mnqHjKRF/vP+vPOlNQcJjojF/zTtq5qg==} + '@storybook/react@9.0.18': + resolution: {integrity: sha512-CCH6Vj/O6I07PrhCHxc1pvCWYMfZhRzK7CVHAtrBP9xxnYA7OoXhM2wymuDogml5HW1BKtyVMeQ3oWZXFNgDXQ==} engines: {node: '>=20.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: ^9.0.17 + storybook: ^9.0.18 typescript: '>= 4.9.x' peerDependenciesMeta: typescript: @@ -8582,68 +8582,68 @@ packages: resolution: {integrity: sha512-qMx1nOrzoB+PF+pzb26Q4Tc2sOlrx9Ba2UBNX9hB31Omrq+QoZ2Gly0KLrQWw4Of1AQ4J9lnD+XOdwOdcdXqqw==} engines: {node: '>=12.20.0'} - '@swc/core-darwin-arm64@1.13.1': - resolution: {integrity: sha512-zO6SW/jSMTUORPm6dUZFPUwf+EFWZsaXWMGXadRG6akCofYpoQb8pcY2QZkVr43z8TMka6BtXpyoD/DJ0iOPHQ==} + '@swc/core-darwin-arm64@1.13.2': + resolution: {integrity: sha512-44p7ivuLSGFJ15Vly4ivLJjg3ARo4879LtEBAabcHhSZygpmkP8eyjyWxrH3OxkY1eRZSIJe8yRZPFw4kPXFPw==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.13.1': - resolution: {integrity: sha512-8RjaTZYxrlYKE5PgzZYWSOT4mAsyhIuh30Nu4dnn/2r0Ef68iNCbvX4ynGnFMhOIhqunjQbJf+mJKpwTwdHXhw==} + '@swc/core-darwin-x64@1.13.2': + resolution: {integrity: sha512-Lb9EZi7X2XDAVmuUlBm2UvVAgSCbD3qKqDCxSI4jEOddzVOpNCnyZ/xEampdngUIyDDhhJLYU9duC+Mcsv5Y+A==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.13.1': - resolution: {integrity: sha512-jEqK6pECs2m4BpL2JA/4CCkq04p6iFOEtVNXTisO+lJ3zwmxlnIEm9UfJZG6VSu8GS9MHRKGB0ieZ1tEdN1qDA==} + '@swc/core-linux-arm-gnueabihf@1.13.2': + resolution: {integrity: sha512-9TDe/92ee1x57x+0OqL1huG4BeljVx0nWW4QOOxp8CCK67Rpc/HHl2wciJ0Kl9Dxf2NvpNtkPvqj9+BUmM9WVA==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.13.1': - resolution: {integrity: sha512-PbkuIOYXO/gQbWQ7NnYIwm59ygNqmUcF8LBeoKvxhx1VtOwE+9KiTfoplOikkPLhMiTzKsd8qentTslbITIg+Q==} + '@swc/core-linux-arm64-gnu@1.13.2': + resolution: {integrity: sha512-KJUSl56DBk7AWMAIEcU83zl5mg3vlQYhLELhjwRFkGFMvghQvdqQ3zFOYa4TexKA7noBZa3C8fb24rI5sw9Exg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.13.1': - resolution: {integrity: sha512-JaqFdBCarIBKiMu5bbAp+kWPMNGg97ej+7KzbKOzWP5pRptqKi86kCDZT3WmjPe8hNG6dvBwbm7Y8JNry5LebQ==} + '@swc/core-linux-arm64-musl@1.13.2': + resolution: {integrity: sha512-teU27iG1oyWpNh9CzcGQ48ClDRt/RCem7mYO7ehd2FY102UeTws2+OzLESS1TS1tEZipq/5xwx3FzbVgiolCiQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.13.1': - resolution: {integrity: sha512-t4cLkku10YECDaakWUH0452WJHIZtrLPRwezt6BdoMntVMwNjvXRX7C8bGuYcKC3YxRW7enZKFpozLhQIQ37oA==} + '@swc/core-linux-x64-gnu@1.13.2': + resolution: {integrity: sha512-dRPsyPyqpLD0HMRCRpYALIh4kdOir8pPg4AhNQZLehKowigRd30RcLXGNVZcc31Ua8CiPI4QSgjOIxK+EQe4LQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.13.1': - resolution: {integrity: sha512-fSMwZOaG+3ukUucbEbzz9GhzGhUhXoCPqHe9qW0/Vc2IZRp538xalygKyZynYweH5d9EHux1aj3+IO8/xBaoiA==} + '@swc/core-linux-x64-musl@1.13.2': + resolution: {integrity: sha512-CCxETW+KkYEQDqz1SYC15YIWYheqFC+PJVOW76Maa/8yu8Biw+HTAcblKf2isrlUtK8RvrQN94v3UXkC2NzCEw==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.13.1': - resolution: {integrity: sha512-tweCXK/79vAwj1NhAsYgICy8T1z2QEairmN2BFEBYFBFNMEB1iI1YlXwBkBtuihRvgZrTh1ORusKa4jLYzLCZA==} + '@swc/core-win32-arm64-msvc@1.13.2': + resolution: {integrity: sha512-Wv/QTA6PjyRLlmKcN6AmSI4jwSMRl0VTLGs57PHTqYRwwfwd7y4s2fIPJVBNbAlXd795dOEP6d/bGSQSyhOX3A==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.13.1': - resolution: {integrity: sha512-zi7hO9D+2R2yQN9D7T10/CAI9KhuXkNkz8tcJOW6+dVPtAk/gsIC5NoGPELjgrAlLL9CS38ZQpLDslLfpP15ng==} + '@swc/core-win32-ia32-msvc@1.13.2': + resolution: {integrity: sha512-PuCdtNynEkUNbUXX/wsyUC+t4mamIU5y00lT5vJcAvco3/r16Iaxl5UCzhXYaWZSNVZMzPp9qN8NlSL8M5pPxw==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.13.1': - resolution: {integrity: sha512-KubYjzqs/nz3H69ncX/XHKsC8c1xqc7UvonQAj26BhbL22HBsqdAaVutZ+Obho6RMpd3F5qQ95ldavUTWskRrw==} + '@swc/core-win32-x64-msvc@1.13.2': + resolution: {integrity: sha512-qlmMkFZJus8cYuBURx1a3YAG2G7IW44i+FEYV5/32ylKkzGNAr9tDJSA53XNnNXkAB5EXSPsOz7bn5C3JlEtdQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.13.1': - resolution: {integrity: sha512-jEKKErLC6uwSqA+p6bmZR08usZM5Fpc+HdEu5CAzvye0q43yf1si1kjhHEa9XMkz0A2SAaal3eKCg/YYmtOsCA==} + '@swc/core@1.13.2': + resolution: {integrity: sha512-YWqn+0IKXDhqVLKoac4v2tV6hJqB/wOh8/Br8zjqeqBkKa77Qb0Kw2i7LOFzjFNZbZaPH6AlMGlBwNrxaauaAg==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -8742,12 +8742,16 @@ packages: resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} + '@testing-library/jest-dom@6.5.0': resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@testing-library/jest-dom@6.6.3': - resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} + '@testing-library/jest-dom@6.6.4': + resolution: {integrity: sha512-xDXgLjVunjHqczScfkCJ9iyjdNOVHvvCdqHSSxwM9L0l/wHkTRum67SDc020uAlCoqktJplgO2AAQeLP1wgqDQ==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} '@testing-library/react@16.3.0': @@ -10059,8 +10063,8 @@ packages: resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} engines: {node: '>=12'} - ai@4.3.17: - resolution: {integrity: sha512-uWqIQ94Nb1GTYtYElGHegJMOzv3r2mCKNFlKrqkft9xrfvIahTI5OdcnD5U9612RFGuUNGmSDTO1/YRNFXobaQ==} + ai@4.3.19: + resolution: {integrity: sha512-dIE2bfNpqHN3r6IINp9znguYdhIOheKW2LDigAMrgt/upT3B8eBGPSCblENvaZGoq+hxaN9fSMzjWpbqloP+7Q==} engines: {node: '>=18'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc @@ -11159,8 +11163,8 @@ packages: resolution: {integrity: sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==} engines: {node: '>=18'} - cacheable@1.10.2: - resolution: {integrity: sha512-hMkETCRV4hwBAvjQY1/xGw15tlPj+7cM4d5HOlYJJFftLQVRCboVX+mT6AJ6eL0fsqUhSUwDiF+pgfTR2r2Hxg==} + cacheable@1.10.3: + resolution: {integrity: sha512-M6p10iJ/VT0wT7TLIGUnm958oVrU2cUK8pQAVU21Zu7h8rbk/PeRtRWrvHJBql97Bhzk3g1N6+2VKC+Rjxna9Q==} call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} @@ -11843,8 +11847,8 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true - create-storybook@9.0.17: - resolution: {integrity: sha512-ilnTYTiEA7Vw1+FCcGecwEgBUxYpsUnUmZkucV38JHUJDnE1MPKKvqi0qFG2x+zYiHA4X7j5IrYfKvh/X+H8+w==} + create-storybook@9.0.18: + resolution: {integrity: sha512-qbpvn3TnSIhb/JDqebap5PX+L6r9WacM045neXTxXRLHLCW6XD16sKrawrMnRoHB4gm/m+MB3yKT5cMEJhuRDA==} hasBin: true crelt@1.0.6: @@ -12511,8 +12515,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.189: - resolution: {integrity: sha512-y9D1ntS1ruO/pZ/V2FtLE+JXLQe28XoRpZ7QCCo0T8LdQladzdcOVQZH/IWLVJvCw12OGMb6hYOeOAjntCmJRQ==} + electron-to-chromium@1.5.191: + resolution: {integrity: sha512-xcwe9ELcuxYLUFqZZxL19Z6HVKcvNkIwhbHUz7L3us6u12yR+7uY89dSl570f/IqNthx8dAw3tojG7i4Ni4tDA==} email-addresses@5.0.0: resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} @@ -12663,8 +12667,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es-toolkit@1.39.7: - resolution: {integrity: sha512-ek/wWryKouBrZIjkwW2BFf91CWOIMvoy2AE5YYgUrfWsJQM2Su1LoLtrw8uusEpN9RfqLlV/0FVNjT0WMv8Bxw==} + es-toolkit@1.39.8: + resolution: {integrity: sha512-A8QO9TfF+rltS8BXpdu8OS+rpGgEdnRhqIVxO/ZmNvnXBYgOdSsxukT55ELyP94gZIntWJ+Li9QRrT2u1Kitpg==} es5-ext@0.10.64: resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} @@ -12833,12 +12837,12 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-storybook@9.0.17: - resolution: {integrity: sha512-IuTdlwCEwoDNobdygRCxNhlKXHmsDfPtPvHGcsY35x2Bx8KItrjfekO19gJrjc1VT2CMfcZMYF8OBKaxHELupw==} + eslint-plugin-storybook@9.0.18: + resolution: {integrity: sha512-f2FnWjTQkM9kYtbpChVuEo8F04QATBiuxYUdSBR58lWb3NprPKBfmRZC1dTA5NVeLY6geXduDLIPXefwXFz6Ag==} engines: {node: '>=20.0.0'} peerDependencies: eslint: '>=8' - storybook: ^9.0.17 + storybook: ^9.0.18 eslint-plugin-unused-imports@4.1.4: resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==} @@ -13239,8 +13243,8 @@ packages: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} - file-entry-cache@10.1.1: - resolution: {integrity: sha512-zcmsHjg2B2zjuBgjdnB+9q0+cWcgWfykIcsDkWDB4GTPtl1eXUA+gTI6sO0u01AqK3cliHryTU55/b2Ow1hfZg==} + file-entry-cache@10.1.3: + resolution: {integrity: sha512-D+w75Ub8T55yor7fPgN06rkCAUbAYw2vpxJmmjv/GDAcvCnv9g7IvHhIZoxzRZThrXPFI2maeY24pPbtyYU7Lg==} file-entry-cache@5.0.1: resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==} @@ -13385,8 +13389,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flat-cache@6.1.11: - resolution: {integrity: sha512-zfOAns94mp7bHG/vCn9Ru2eDCmIxVQ5dELUHKjHfDEOJmHNzE+uGa6208kfkgmtym4a0FFjEuFksCXFacbVhSg==} + flat-cache@6.1.12: + resolution: {integrity: sha512-U+HqqpZPPXP5d24bWuRzjGqVqUcw64k4nZAbruniDwdRg0H10tvN7H6ku1tjhA4rg5B9GS3siEvwO2qjJJ6f8Q==} flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} @@ -13402,8 +13406,8 @@ packages: resolution: {integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==} deprecated: flatten is deprecated in favor of utility frameworks such as lodash. - flow-parser@0.276.0: - resolution: {integrity: sha512-rHZzn3I1Hc6L+XCTHe4miH9mEW4+CozvGghVLwE5xHasf2nchq2GJonUowRihuOx6NsJO8pGD+5XdIDH1iLgNg==} + flow-parser@0.277.1: + resolution: {integrity: sha512-86F5PGl+OrFvCzyK04id9Yf9rxFB8485GPs5sexB4cVLOXmpHbSi1/dYiaemI53I85CpImBu/qHVmZnGQflgmw==} engines: {node: '>=0.4.0'} flush-write-stream@1.1.1: @@ -14088,8 +14092,8 @@ packages: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} - hookified@1.10.0: - resolution: {integrity: sha512-dJw0492Iddsj56U1JsSTm9E/0B/29a1AuoSLRAte8vQg/kaTGF3IgjEWT8c8yG4cC10+HisE1x5QAwR0Xwc+DA==} + hookified@1.11.0: + resolution: {integrity: sha512-aDdIN3GyU5I6wextPplYdfmWCo+aLmjjVbntmX6HLD5RCi/xKsivYEBhnRD+d9224zFf008ZpLMPlWF0ZodYZw==} hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -15407,8 +15411,8 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true - jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + jiti@2.5.1: + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} hasBin: true joi@17.13.3: @@ -15667,8 +15671,8 @@ packages: resolution: {integrity: sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==} engines: {node: '>=4'} - launch-editor@2.10.0: - resolution: {integrity: sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==} + launch-editor@2.11.0: + resolution: {integrity: sha512-R/PIF14L6e2eHkhvQPu7jDRCr0msfCYCxbYiLgkkAGi0dVPWuM+RrsPu0a5dpuNe0KWGL3jpAkOlv53xGfPheQ==} lazy-universal-dotenv@3.0.1: resolution: {integrity: sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ==} @@ -15925,8 +15929,8 @@ packages: loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - loupe@3.1.4: - resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} + loupe@3.2.0: + resolution: {integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==} lower-case@1.1.4: resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} @@ -16165,8 +16169,8 @@ packages: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} - memfs@4.17.2: - resolution: {integrity: sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==} + memfs@4.23.0: + resolution: {integrity: sha512-SucHN2lcWf0jrnw+jP6FoVW6l/zGJiXfNMdApZzG0x/0mAIMdwAeR5mjfsCH5U3BoqpUEtqzz+dSQSO0H/eqxg==} engines: {node: '>= 4.0.0'} memoizee@0.4.17: @@ -16895,8 +16899,8 @@ packages: nwmatcher@1.4.4: resolution: {integrity: sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==} - nwsapi@2.2.20: - resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} + nwsapi@2.2.21: + resolution: {integrity: sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==} nypm@0.5.4: resolution: {integrity: sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA==} @@ -18989,8 +18993,8 @@ packages: resolution: {integrity: sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==} hasBin: true - rollup@4.45.1: - resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} + rollup@4.46.1: + resolution: {integrity: sha512-33xGNBsDJAkzt0PvninskHlWnTIPgDtTwhg0U38CUoNP/7H6wI2Cz6dUeoNPbjdTdsYTGuiFFASuUOWovH0SyQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -19473,9 +19477,9 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} @@ -19603,8 +19607,8 @@ packages: prettier: optional: true - storybook@9.0.17: - resolution: {integrity: sha512-O+9jgJ+Trlq9VGD1uY4OBLKQWHHDKM/A/pA8vMW6PVehhGHNvpzcIC1bngr6mL5gGHZP2nBv+9XG8pTMcggMmg==} + storybook@9.0.18: + resolution: {integrity: sha512-ruxpEpizwoYQTt1hBOrWyp9trPYWD9Apt1TJ37rs1rzmNQWpSNGJDMg91JV4mUhBChzRvnid/oRBFFCWJz/dfw==} hasBin: true peerDependencies: prettier: ^2 || ^3 @@ -21137,8 +21141,8 @@ packages: vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} @@ -22072,7 +22076,7 @@ snapshots: '@aws-sdk/util-user-agent-node': 3.848.0 '@aws-sdk/xml-builder': 3.821.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.7.1 + '@smithy/core': 3.7.2 '@smithy/eventstream-serde-browser': 4.0.4 '@smithy/eventstream-serde-config-resolver': 4.1.2 '@smithy/eventstream-serde-node': 4.0.4 @@ -22083,21 +22087,21 @@ snapshots: '@smithy/invalid-dependency': 4.0.4 '@smithy/md5-js': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.16 - '@smithy/middleware-retry': 4.1.17 + '@smithy/middleware-endpoint': 4.1.17 + '@smithy/middleware-retry': 4.1.18 '@smithy/middleware-serde': 4.0.8 '@smithy/middleware-stack': 4.0.4 '@smithy/node-config-provider': 4.1.3 '@smithy/node-http-handler': 4.1.0 '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.8 + '@smithy/smithy-client': 4.4.9 '@smithy/types': 4.3.1 '@smithy/url-parser': 4.0.4 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.24 - '@smithy/util-defaults-mode-node': 4.0.24 + '@smithy/util-defaults-mode-browser': 4.0.25 + '@smithy/util-defaults-mode-node': 4.0.25 '@smithy/util-endpoints': 3.0.6 '@smithy/util-middleware': 4.0.4 '@smithy/util-retry': 4.0.6 @@ -22125,26 +22129,26 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.840.0 '@aws-sdk/util-user-agent-node': 3.848.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.7.1 + '@smithy/core': 3.7.2 '@smithy/fetch-http-handler': 5.1.0 '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.16 - '@smithy/middleware-retry': 4.1.17 + '@smithy/middleware-endpoint': 4.1.17 + '@smithy/middleware-retry': 4.1.18 '@smithy/middleware-serde': 4.0.8 '@smithy/middleware-stack': 4.0.4 '@smithy/node-config-provider': 4.1.3 '@smithy/node-http-handler': 4.1.0 '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.8 + '@smithy/smithy-client': 4.4.9 '@smithy/types': 4.3.1 '@smithy/url-parser': 4.0.4 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.24 - '@smithy/util-defaults-mode-node': 4.0.24 + '@smithy/util-defaults-mode-browser': 4.0.25 + '@smithy/util-defaults-mode-node': 4.0.25 '@smithy/util-endpoints': 3.0.6 '@smithy/util-middleware': 4.0.4 '@smithy/util-retry': 4.0.6 @@ -22157,12 +22161,12 @@ snapshots: dependencies: '@aws-sdk/types': 3.840.0 '@aws-sdk/xml-builder': 3.821.0 - '@smithy/core': 3.7.1 + '@smithy/core': 3.7.2 '@smithy/node-config-provider': 4.1.3 '@smithy/property-provider': 4.0.4 '@smithy/protocol-http': 5.1.2 '@smithy/signature-v4': 5.1.2 - '@smithy/smithy-client': 4.4.8 + '@smithy/smithy-client': 4.4.9 '@smithy/types': 4.3.1 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 @@ -22187,7 +22191,7 @@ snapshots: '@smithy/node-http-handler': 4.1.0 '@smithy/property-provider': 4.0.4 '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.8 + '@smithy/smithy-client': 4.4.9 '@smithy/types': 4.3.1 '@smithy/util-stream': 4.2.3 tslib: 2.8.1 @@ -22324,11 +22328,11 @@ snapshots: '@aws-sdk/core': 3.846.0 '@aws-sdk/types': 3.840.0 '@aws-sdk/util-arn-parser': 3.804.0 - '@smithy/core': 3.7.1 + '@smithy/core': 3.7.2 '@smithy/node-config-provider': 4.1.3 '@smithy/protocol-http': 5.1.2 '@smithy/signature-v4': 5.1.2 - '@smithy/smithy-client': 4.4.8 + '@smithy/smithy-client': 4.4.9 '@smithy/types': 4.3.1 '@smithy/util-config-provider': 4.0.0 '@smithy/util-middleware': 4.0.4 @@ -22347,7 +22351,7 @@ snapshots: '@aws-sdk/core': 3.846.0 '@aws-sdk/types': 3.840.0 '@aws-sdk/util-endpoints': 3.848.0 - '@smithy/core': 3.7.1 + '@smithy/core': 3.7.2 '@smithy/protocol-http': 5.1.2 '@smithy/types': 4.3.1 tslib: 2.8.1 @@ -22367,26 +22371,26 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.840.0 '@aws-sdk/util-user-agent-node': 3.848.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.7.1 + '@smithy/core': 3.7.2 '@smithy/fetch-http-handler': 5.1.0 '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.16 - '@smithy/middleware-retry': 4.1.17 + '@smithy/middleware-endpoint': 4.1.17 + '@smithy/middleware-retry': 4.1.18 '@smithy/middleware-serde': 4.0.8 '@smithy/middleware-stack': 4.0.4 '@smithy/node-config-provider': 4.1.3 '@smithy/node-http-handler': 4.1.0 '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.8 + '@smithy/smithy-client': 4.4.9 '@smithy/types': 4.3.1 '@smithy/url-parser': 4.0.4 '@smithy/util-base64': 4.0.0 '@smithy/util-body-length-browser': 4.0.0 '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.24 - '@smithy/util-defaults-mode-node': 4.0.24 + '@smithy/util-defaults-mode-browser': 4.0.25 + '@smithy/util-defaults-mode-node': 4.0.25 '@smithy/util-endpoints': 3.0.6 '@smithy/util-middleware': 4.0.4 '@smithy/util-retry': 4.0.6 @@ -22529,8 +22533,8 @@ snapshots: '@azure/core-tracing': 1.3.0 '@azure/core-util': 1.13.0 '@azure/logger': 1.3.0 - '@azure/msal-browser': 4.15.0 - '@azure/msal-node': 3.6.3 + '@azure/msal-browser': 4.16.0 + '@azure/msal-node': 3.6.4 open: 10.2.0 tslib: 2.8.1 transitivePeerDependencies: @@ -22543,15 +22547,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@azure/msal-browser@4.15.0': + '@azure/msal-browser@4.16.0': dependencies: - '@azure/msal-common': 15.8.1 + '@azure/msal-common': 15.9.0 - '@azure/msal-common@15.8.1': {} + '@azure/msal-common@15.9.0': {} - '@azure/msal-node@3.6.3': + '@azure/msal-node@3.6.4': dependencies: - '@azure/msal-common': 15.8.1 + '@azure/msal-common': 15.9.0 jsonwebtoken: 9.0.2 uuid: 8.3.2 @@ -22568,11 +22572,11 @@ snapshots: '@babel/code-frame': 7.27.1 '@babel/generator': 7.28.0 '@babel/helper-module-transforms': 7.27.3(@babel/core@7.12.9) - '@babel/helpers': 7.27.6 + '@babel/helpers': 7.28.2 '@babel/parser': 7.28.0 '@babel/template': 7.27.2 '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 convert-source-map: 1.9.0 debug: 4.4.1(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -22591,11 +22595,11 @@ snapshots: '@babel/generator': 7.28.0 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.7) - '@babel/helpers': 7.27.6 + '@babel/helpers': 7.28.2 '@babel/parser': 7.28.0 '@babel/template': 7.27.2 '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 convert-source-map: 2.0.0 debug: 4.4.1(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -22611,11 +22615,11 @@ snapshots: '@babel/generator': 7.28.0 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helpers': 7.27.6 + '@babel/helpers': 7.28.2 '@babel/parser': 7.28.0 '@babel/template': 7.27.2 '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 convert-source-map: 2.0.0 debug: 4.4.1(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -22627,14 +22631,14 @@ snapshots: '@babel/generator@7.28.0': dependencies: '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@jridgewell/gen-mapping': 0.3.12 '@jridgewell/trace-mapping': 0.3.29 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@babel/helper-compilation-targets@7.27.2': dependencies: @@ -22741,14 +22745,14 @@ snapshots: '@babel/helper-member-expression-to-functions@7.27.1': dependencies: '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.27.1': dependencies: '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 transitivePeerDependencies: - supports-color @@ -22781,7 +22785,7 @@ snapshots: '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@babel/helper-plugin-utils@7.10.4': {} @@ -22827,7 +22831,7 @@ snapshots: '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 transitivePeerDependencies: - supports-color @@ -22841,18 +22845,18 @@ snapshots: dependencies: '@babel/template': 7.27.2 '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 transitivePeerDependencies: - supports-color - '@babel/helpers@7.27.6': + '@babel/helpers@7.28.2': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@babel/parser@7.28.0': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.7)': dependencies: @@ -23775,7 +23779,7 @@ snapshots: '@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.1 + '@babel/types': 7.28.2 transitivePeerDependencies: - supports-color @@ -23786,7 +23790,7 @@ snapshots: '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 transitivePeerDependencies: - supports-color @@ -24139,14 +24143,14 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 esutils: 2.0.3 '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 esutils: 2.0.3 optional: true @@ -24205,17 +24209,17 @@ snapshots: pirates: 4.0.7 source-map-support: 0.5.21 - '@babel/runtime-corejs3@7.28.0': + '@babel/runtime-corejs3@7.28.2': dependencies: core-js-pure: 3.44.0 - '@babel/runtime@7.27.6': {} + '@babel/runtime@7.28.2': {} '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@babel/traverse@7.28.0': dependencies: @@ -24224,12 +24228,12 @@ snapshots: '@babel/helper-globals': 7.28.0 '@babel/parser': 7.28.0 '@babel/template': 7.27.2 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 debug: 4.4.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/types@7.28.1': + '@babel/types@7.28.2': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 @@ -24387,7 +24391,7 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: '@babel/helper-module-imports': 7.27.1 - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -24436,7 +24440,7 @@ snapshots: '@emotion/react@11.14.0(@types/react@17.0.87)(react@19.1.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -24452,7 +24456,7 @@ snapshots: '@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -24468,7 +24472,7 @@ snapshots: '@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -24494,7 +24498,7 @@ snapshots: '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@17.0.87)(react@19.1.0))(@types/react@17.0.87)(react@19.1.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.3.1 '@emotion/react': 11.14.0(@types/react@17.0.87)(react@19.1.0) @@ -24509,7 +24513,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.27.6 + '@babel/runtime': 7.28.2 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.3.1 '@emotion/react': 11.14.0(@types/react@18.2.0)(react@18.2.0) @@ -24524,7 +24528,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.27.6 + '@babel/runtime': 7.28.2 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.3.1 '@emotion/react': 11.14.0(@types/react@18.2.0)(react@19.1.0) @@ -24539,7 +24543,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.27.6 + '@babel/runtime': 7.28.2 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.3.1 '@emotion/react': 11.14.0(@types/react@18.2.0)(react@19.1.0) @@ -24649,14 +24653,14 @@ snapshots: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.7.0(eslint@9.26.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.26.0(jiti@2.5.1))': dependencies: - eslint: 9.26.0(jiti@2.4.2) + eslint: 9.26.0(jiti@2.5.1) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.7.0(eslint@9.27.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.27.0(jiti@2.5.1))': dependencies: - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.27.0(jiti@2.5.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -24863,11 +24867,11 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@headlessui/react@2.2.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@headlessui/react@2.2.6(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.20.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@react-aria/interactions': 3.25.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-aria/focus': 3.21.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-aria/interactions': 3.25.4(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: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -25174,7 +25178,10 @@ snapshots: jest-runner: 25.5.4 jest-runtime: 25.5.4 transitivePeerDependencies: + - bufferutil + - canvas - supports-color + - utf-8-validate '@jest/test-sequencer@29.7.0': dependencies: @@ -25268,12 +25275,12 @@ snapshots: '@types/yargs': 17.0.33 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.35)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.35)(jiti@2.5.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))': dependencies: glob: 10.4.5 magic-string: 0.30.17 react-docgen-typescript: 2.4.0(typescript@5.8.3) - vite: 6.3.5(@types/node@22.15.35)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.15.35)(jiti@2.5.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) optionalDependencies: typescript: 5.8.3 @@ -25302,15 +25309,15 @@ snapshots: dependencies: tslib: 2.8.1 - '@jsonjoy.com/json-pack@1.2.0(tslib@2.8.1)': + '@jsonjoy.com/json-pack@1.4.0(tslib@2.8.1)': dependencies: '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) - '@jsonjoy.com/util': 1.6.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.8.0(tslib@2.8.1) hyperdyperid: 1.2.0 thingies: 1.21.0(tslib@2.8.1) tslib: 2.8.1 - '@jsonjoy.com/util@1.6.0(tslib@2.8.1)': + '@jsonjoy.com/util@1.8.0(tslib@2.8.1)': dependencies: tslib: 2.8.1 @@ -25470,7 +25477,7 @@ snapshots: dependencies: exenv-es6: 1.1.1 - '@modelcontextprotocol/sdk@1.16.0': + '@modelcontextprotocol/sdk@1.17.0': dependencies: ajv: 6.12.6 content-type: 1.0.5 @@ -25682,7 +25689,7 @@ snapshots: loader-utils: 2.0.4 react-refresh: 0.11.0 schema-utils: 4.3.2 - source-map: 0.7.4 + source-map: 0.7.6 webpack: 5.100.2(webpack-cli@4.10.0) optionalDependencies: '@types/webpack': 5.28.5(webpack-cli@4.10.0) @@ -25699,7 +25706,7 @@ snapshots: loader-utils: 2.0.4 react-refresh: 0.11.0 schema-utils: 4.3.2 - source-map: 0.7.4 + source-map: 0.7.6 webpack: 5.100.2(webpack-cli@6.0.1) optionalDependencies: '@types/webpack': 5.28.5(webpack-cli@6.0.1) @@ -25716,7 +25723,7 @@ snapshots: loader-utils: 2.0.4 react-refresh: 0.11.0 schema-utils: 4.3.2 - source-map: 0.7.4 + source-map: 0.7.6 webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: '@types/webpack': 5.28.5 @@ -25732,7 +25739,7 @@ snapshots: html-entities: 2.6.0 react-refresh: 0.17.0 schema-utils: 4.3.2 - source-map: 0.7.4 + source-map: 0.7.6 webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: '@types/webpack': 5.28.5(webpack-cli@5.1.4) @@ -25933,17 +25940,17 @@ snapshots: '@radix-ui/number@1.0.1': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 '@radix-ui/primitive@1.0.1': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 '@radix-ui/primitive@1.1.2': {} '@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.27.6 + '@babel/runtime': 7.28.2 '@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) @@ -25962,7 +25969,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.27.6 + '@babel/runtime': 7.28.2 '@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) @@ -25999,7 +26006,7 @@ snapshots: '@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 @@ -26018,7 +26025,7 @@ snapshots: '@radix-ui/react-context@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 @@ -26059,7 +26066,7 @@ snapshots: '@radix-ui/react-direction@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 @@ -26078,7 +26085,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.27.6 + '@babel/runtime': 7.28.2 '@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) @@ -26120,7 +26127,7 @@ snapshots: '@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 @@ -26133,7 +26140,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.27.6 + '@babel/runtime': 7.28.2 '@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) @@ -26156,7 +26163,7 @@ snapshots: '@radix-ui/react-id@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.0)(react@19.1.0) react: 19.1.0 optionalDependencies: @@ -26204,7 +26211,7 @@ 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.27.6 + '@babel/runtime': 7.28.2 '@floating-ui/react-dom': 2.1.4(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) @@ -26241,7 +26248,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.27.6 + '@babel/runtime': 7.28.2 '@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) @@ -26271,7 +26278,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.27.6 + '@babel/runtime': 7.28.2 '@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) @@ -26333,7 +26340,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.27.6 + '@babel/runtime': 7.28.2 '@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) @@ -26372,7 +26379,7 @@ snapshots: '@radix-ui/react-slot@1.0.2(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@19.1.0) react: 19.1.0 optionalDependencies: @@ -26455,7 +26462,7 @@ snapshots: '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 @@ -26474,7 +26481,7 @@ snapshots: '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.0)(react@19.1.0) react: 19.1.0 optionalDependencies: @@ -26512,7 +26519,7 @@ snapshots: '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.0)(react@19.1.0) react: 19.1.0 optionalDependencies: @@ -26527,7 +26534,7 @@ snapshots: '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 @@ -26546,14 +26553,14 @@ snapshots: '@radix-ui/react-use-previous@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 '@radix-ui/react-use-rect@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 '@radix-ui/rect': 1.0.1 react: 19.1.0 optionalDependencies: @@ -26568,7 +26575,7 @@ snapshots: '@radix-ui/react-use-size@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.0)(react@19.1.0) react: 19.1.0 optionalDependencies: @@ -26583,7 +26590,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.27.6 + '@babel/runtime': 7.28.2 '@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) @@ -26602,41 +26609,41 @@ snapshots: '@radix-ui/rect@1.0.1': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 '@radix-ui/rect@1.1.1': {} - '@react-aria/focus@3.20.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@react-aria/focus@3.21.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@react-aria/interactions': 3.25.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@react-aria/utils': 3.29.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@react-types/shared': 3.30.0(react@18.2.0) + '@react-aria/interactions': 3.25.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-aria/utils': 3.30.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-types/shared': 3.31.0(react@18.2.0) '@swc/helpers': 0.5.17 clsx: 2.1.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@react-aria/interactions@3.25.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@react-aria/interactions@3.25.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@react-aria/ssr': 3.9.9(react@18.2.0) - '@react-aria/utils': 3.29.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-aria/ssr': 3.9.10(react@18.2.0) + '@react-aria/utils': 3.30.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@react-stately/flags': 3.1.2 - '@react-types/shared': 3.30.0(react@18.2.0) + '@react-types/shared': 3.31.0(react@18.2.0) '@swc/helpers': 0.5.17 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@react-aria/ssr@3.9.9(react@18.2.0)': + '@react-aria/ssr@3.9.10(react@18.2.0)': dependencies: '@swc/helpers': 0.5.17 react: 18.2.0 - '@react-aria/utils@3.29.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@react-aria/utils@3.30.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@react-aria/ssr': 3.9.9(react@18.2.0) + '@react-aria/ssr': 3.9.10(react@18.2.0) '@react-stately/flags': 3.1.2 - '@react-stately/utils': 3.10.7(react@18.2.0) - '@react-types/shared': 3.30.0(react@18.2.0) + '@react-stately/utils': 3.10.8(react@18.2.0) + '@react-types/shared': 3.31.0(react@18.2.0) '@swc/helpers': 0.5.17 clsx: 2.1.1 react: 18.2.0 @@ -26652,12 +26659,12 @@ snapshots: dependencies: '@swc/helpers': 0.5.17 - '@react-stately/utils@3.10.7(react@18.2.0)': + '@react-stately/utils@3.10.8(react@18.2.0)': dependencies: '@swc/helpers': 0.5.17 react: 18.2.0 - '@react-types/shared@3.30.0(react@18.2.0)': + '@react-types/shared@3.31.0(react@18.2.0)': dependencies: react: 18.2.0 @@ -26700,9 +26707,9 @@ snapshots: resolve: 1.22.10 rollup: 1.32.1 - '@rollup/plugin-commonjs@28.0.6(rollup@4.45.1)': + '@rollup/plugin-commonjs@28.0.6(rollup@4.46.1)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.45.1) + '@rollup/pluginutils': 5.2.0(rollup@4.46.1) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.4.6(picomatch@4.0.3) @@ -26710,28 +26717,28 @@ snapshots: magic-string: 0.30.17 picomatch: 4.0.3 optionalDependencies: - rollup: 4.45.1 + rollup: 4.46.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.45.1)': + '@rollup/plugin-json@6.1.0(rollup@4.46.1)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.45.1) + '@rollup/pluginutils': 5.2.0(rollup@4.46.1) optionalDependencies: - rollup: 4.45.1 + rollup: 4.46.1 - '@rollup/plugin-node-resolve@16.0.1(rollup@4.45.1)': + '@rollup/plugin-node-resolve@16.0.1(rollup@4.46.1)': dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.45.1) + '@rollup/pluginutils': 5.2.0(rollup@4.46.1) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.10 optionalDependencies: - rollup: 4.45.1 + rollup: 4.46.1 '@rollup/plugin-node-resolve@9.0.0(rollup@1.32.1)': dependencies: @@ -26761,72 +26768,72 @@ snapshots: estree-walker: 2.0.2 picomatch: 2.3.1 - '@rollup/pluginutils@5.2.0(rollup@4.45.1)': + '@rollup/pluginutils@5.2.0(rollup@4.46.1)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.45.1 + rollup: 4.46.1 - '@rollup/rollup-android-arm-eabi@4.45.1': + '@rollup/rollup-android-arm-eabi@4.46.1': optional: true - '@rollup/rollup-android-arm64@4.45.1': + '@rollup/rollup-android-arm64@4.46.1': optional: true - '@rollup/rollup-darwin-arm64@4.45.1': + '@rollup/rollup-darwin-arm64@4.46.1': optional: true - '@rollup/rollup-darwin-x64@4.45.1': + '@rollup/rollup-darwin-x64@4.46.1': optional: true - '@rollup/rollup-freebsd-arm64@4.45.1': + '@rollup/rollup-freebsd-arm64@4.46.1': optional: true - '@rollup/rollup-freebsd-x64@4.45.1': + '@rollup/rollup-freebsd-x64@4.46.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + '@rollup/rollup-linux-arm-gnueabihf@4.46.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.45.1': + '@rollup/rollup-linux-arm-musleabihf@4.46.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.45.1': + '@rollup/rollup-linux-arm64-gnu@4.46.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.45.1': + '@rollup/rollup-linux-arm64-musl@4.46.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + '@rollup/rollup-linux-loongarch64-gnu@4.46.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + '@rollup/rollup-linux-ppc64-gnu@4.46.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.45.1': + '@rollup/rollup-linux-riscv64-gnu@4.46.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.45.1': + '@rollup/rollup-linux-riscv64-musl@4.46.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.45.1': + '@rollup/rollup-linux-s390x-gnu@4.46.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.45.1': + '@rollup/rollup-linux-x64-gnu@4.46.1': optional: true - '@rollup/rollup-linux-x64-musl@4.45.1': + '@rollup/rollup-linux-x64-musl@4.46.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.45.1': + '@rollup/rollup-win32-arm64-msvc@4.46.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.45.1': + '@rollup/rollup-win32-ia32-msvc@4.46.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.45.1': + '@rollup/rollup-win32-x64-msvc@4.46.1': optional: true '@rtsao/scc@1.1.0': {} @@ -26995,7 +27002,7 @@ snapshots: '@smithy/util-middleware': 4.0.4 tslib: 2.8.1 - '@smithy/core@3.7.1': + '@smithy/core@3.7.2': dependencies: '@smithy/middleware-serde': 4.0.8 '@smithy/protocol-http': 5.1.2 @@ -27098,9 +27105,9 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.1.16': + '@smithy/middleware-endpoint@4.1.17': dependencies: - '@smithy/core': 3.7.1 + '@smithy/core': 3.7.2 '@smithy/middleware-serde': 4.0.8 '@smithy/node-config-provider': 4.1.3 '@smithy/shared-ini-file-loader': 4.0.4 @@ -27109,12 +27116,12 @@ snapshots: '@smithy/util-middleware': 4.0.4 tslib: 2.8.1 - '@smithy/middleware-retry@4.1.17': + '@smithy/middleware-retry@4.1.18': dependencies: '@smithy/node-config-provider': 4.1.3 '@smithy/protocol-http': 5.1.2 '@smithy/service-error-classification': 4.0.6 - '@smithy/smithy-client': 4.4.8 + '@smithy/smithy-client': 4.4.9 '@smithy/types': 4.3.1 '@smithy/util-middleware': 4.0.4 '@smithy/util-retry': 4.0.6 @@ -27188,10 +27195,10 @@ snapshots: '@smithy/util-utf8': 4.0.0 tslib: 2.8.1 - '@smithy/smithy-client@4.4.8': + '@smithy/smithy-client@4.4.9': dependencies: - '@smithy/core': 3.7.1 - '@smithy/middleware-endpoint': 4.1.16 + '@smithy/core': 3.7.2 + '@smithy/middleware-endpoint': 4.1.17 '@smithy/middleware-stack': 4.0.4 '@smithy/protocol-http': 5.1.2 '@smithy/types': 4.3.1 @@ -27236,21 +27243,21 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.0.24': + '@smithy/util-defaults-mode-browser@4.0.25': dependencies: '@smithy/property-provider': 4.0.4 - '@smithy/smithy-client': 4.4.8 + '@smithy/smithy-client': 4.4.9 '@smithy/types': 4.3.1 bowser: 2.11.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.0.24': + '@smithy/util-defaults-mode-node@4.0.25': dependencies: '@smithy/config-resolver': 4.1.4 '@smithy/credential-provider-imds': 4.0.6 '@smithy/node-config-provider': 4.1.3 '@smithy/property-provider': 4.0.4 - '@smithy/smithy-client': 4.4.8 + '@smithy/smithy-client': 4.4.9 '@smithy/types': 4.3.1 tslib: 2.8.1 @@ -27367,13 +27374,13 @@ snapshots: storybook: 8.6.14(prettier@3.5.3) uuid: 9.0.1 - '@storybook/addon-actions@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/addon-actions@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 '@types/uuid': 9.0.8 dequal: 2.0.3 polished: 4.3.1 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(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)': @@ -27421,20 +27428,20 @@ snapshots: storybook: 8.6.14(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-backgrounds@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/addon-backgrounds@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 memoizerific: 1.11.3 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-controls@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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.4.2))(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.27.0(jiti@2.5.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) @@ -27455,13 +27462,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/addon-controls@6.5.16(eslint@9.27.0(jiti@2.4.2))(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(eslint@9.27.0(jiti@2.5.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(eslint@9.27.0(jiti@2.4.2))(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(eslint@9.27.0(jiti@2.5.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) @@ -27512,14 +27519,14 @@ snapshots: storybook: 8.6.14(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-controls@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/addon-controls@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 dequal: 2.0.3 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.100.2)': + '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(eslint@9.27.0(jiti@2.5.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.100.2)': dependencies: '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) @@ -27528,7 +27535,7 @@ snapshots: '@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.4.2))(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.27.0(jiti@2.5.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) @@ -27564,7 +27571,7 @@ snapshots: - webpack - webpack-cli - '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.100.2)': + '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(eslint@9.27.0(jiti@2.5.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.100.2)': dependencies: '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) @@ -27573,7 +27580,7 @@ snapshots: '@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.4.2))(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(eslint@9.27.0(jiti@2.5.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) @@ -27651,52 +27658,52 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@storybook/addon-docs@8.6.14(@types/react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/addon-docs@8.6.14(@types/react@18.2.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@mdx-js/react': 3.1.0(@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@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/csf-plugin': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(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@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/blocks': 8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/csf-plugin': 8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(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@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-docs@9.0.17(@types/react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/addon-docs@9.0.18(@types/react@18.2.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@mdx-js/react': 3.1.0(@types/react@18.2.0)(react@19.1.0) - '@storybook/csf-plugin': 9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/csf-plugin': 9.0.18(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) '@storybook/icons': 1.4.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@storybook/react-dom-shim': 9.0.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/react-dom-shim': 9.0.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(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(eslint@9.27.0(jiti@2.4.2))(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.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.100.2)': + '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.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.5.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.100.2)': 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.4.2))(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.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.100.2) + '@storybook/addon-controls': 6.5.16(eslint@9.27.0(jiti@2.5.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.5.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.100.2) '@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.4.2))(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.27.0(jiti@2.5.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.44.0 regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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.100.2(webpack-cli@4.10.0) @@ -27711,26 +27718,26 @@ 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.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.100.2)': + '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(eslint@9.27.0(jiti@2.5.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.100.2)': 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.4.2))(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)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.100.2) + '@storybook/addon-controls': 6.5.16(eslint@9.27.0(jiti@2.5.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)(eslint@9.27.0(jiti@2.5.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.100.2) '@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.4.2))(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(eslint@9.27.0(jiti@2.5.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.44.0 regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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(eslint@9.27.0(jiti@2.5.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.100.2(webpack-cli@6.0.1) @@ -27785,18 +27792,18 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@storybook/addon-essentials@8.6.14(@types/react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': - dependencies: - '@storybook/addon-actions': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/addon-backgrounds': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/addon-controls': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/addon-docs': 8.6.14(@types/react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/addon-highlight': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/addon-measure': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/addon-outline': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/addon-toolbars': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/addon-viewport': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + '@storybook/addon-essentials@8.6.14(@types/react@18.2.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': + dependencies: + '@storybook/addon-actions': 8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/addon-backgrounds': 8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/addon-controls': 8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/addon-docs': 8.6.14(@types/react@18.2.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/addon-highlight': 8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/addon-measure': 8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/addon-outline': 8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/addon-toolbars': 8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/addon-viewport': 8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' @@ -27812,10 +27819,10 @@ snapshots: '@storybook/global': 5.0.0 storybook: 8.6.14(prettier@3.5.3) - '@storybook/addon-highlight@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/addon-highlight@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) '@storybook/addon-interactions@8.6.14(storybook@8.6.14(prettier@3.5.3))': dependencies: @@ -27868,10 +27875,10 @@ snapshots: optionalDependencies: react: 18.2.0 - '@storybook/addon-links@8.6.14(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/addon-links@8.6.14(react@18.2.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 optionalDependencies: react: 18.2.0 @@ -27913,10 +27920,10 @@ snapshots: storybook: 8.6.14(prettier@3.5.3) tiny-invariant: 1.3.3 - '@storybook/addon-measure@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/addon-measure@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) tiny-invariant: 1.3.3 '@storybook/addon-onboarding@8.6.14(storybook@8.6.14(prettier@3.5.3))': @@ -27962,10 +27969,10 @@ snapshots: storybook: 8.6.14(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-outline@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/addon-outline@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(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)': @@ -27999,9 +28006,9 @@ snapshots: dependencies: storybook: 8.6.14(prettier@3.5.3) - '@storybook/addon-toolbars@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/addon-toolbars@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) '@storybook/addon-viewport@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: @@ -28043,10 +28050,10 @@ snapshots: memoizerific: 1.11.3 storybook: 8.6.14(prettier@3.5.3) - '@storybook/addon-viewport@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/addon-viewport@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: memoizerific: 1.11.3 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) '@storybook/addons@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: @@ -28183,10 +28190,10 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@storybook/blocks@8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/blocks@8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@storybook/icons': 1.4.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 optionalDependencies: react: 19.1.0 @@ -28214,14 +28221,14 @@ snapshots: - encoding - supports-color - '@storybook/builder-vite@9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.35)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))': + '@storybook/builder-vite@9.0.18(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.35)(jiti@2.5.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))': dependencies: - '@storybook/csf-plugin': 9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + '@storybook/csf-plugin': 9.0.18(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 - vite: 6.3.5(@types/node@22.15.35)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.15.35)(jiti@2.5.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) - '@storybook/builder-webpack4@6.5.16(eslint@9.26.0(jiti@2.4.2))(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.26.0(jiti@2.5.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) @@ -28231,7 +28238,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.4.2))(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.26.0(jiti@2.5.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) @@ -28283,7 +28290,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack4@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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) @@ -28293,7 +28300,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.4.2))(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.27.0(jiti@2.5.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) @@ -28345,7 +28352,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack4@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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) @@ -28355,7 +28362,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.4.2))(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.27.0(jiti@2.5.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) @@ -28407,7 +28414,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack4@6.5.16(eslint@9.27.0(jiti@2.4.2))(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(eslint@9.27.0(jiti@2.5.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) @@ -28417,7 +28424,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.4.2))(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(eslint@9.27.0(jiti@2.5.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) @@ -28469,7 +28476,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack4@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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) @@ -28479,7 +28486,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.4.2))(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.27.0(jiti@2.5.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) @@ -28531,7 +28538,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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) @@ -28541,7 +28548,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.4.2))(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.27.0(jiti@2.5.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) @@ -28556,7 +28563,7 @@ snapshots: case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.44.0 css-loader: 5.2.7(webpack@5.100.2) - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)(webpack@5.100.2) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.100.2) glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) html-webpack-plugin: 5.6.3(webpack@5.100.2) @@ -28585,7 +28592,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.4.2))(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(eslint@9.27.0(jiti@2.5.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) @@ -28595,7 +28602,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.4.2))(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(eslint@9.27.0(jiti@2.5.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) @@ -28610,7 +28617,7 @@ snapshots: case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.44.0 css-loader: 5.2.7(webpack@5.100.2) - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)(webpack@5.100.2) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.100.2) glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) html-webpack-plugin: 5.6.3(webpack@5.100.2) @@ -28658,7 +28665,7 @@ 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.13.1(@swc/helpers@0.5.17) + '@swc/core': 1.13.2(@swc/helpers@0.5.17) '@types/node': 16.18.126 '@types/semver': 7.7.0 babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.100.2) @@ -28677,13 +28684,13 @@ snapshots: react-dom: 19.1.0(react@19.1.0) semver: 7.7.2 style-loader: 3.3.4(webpack@5.100.2) - swc-loader: 0.2.6(@swc/core@1.13.1(@swc/helpers@0.5.17))(webpack@5.100.2) - terser-webpack-plugin: 5.3.14(@swc/core@1.13.1(@swc/helpers@0.5.17))(webpack@5.100.2) + swc-loader: 0.2.6(@swc/core@1.13.2(@swc/helpers@0.5.17))(webpack@5.100.2) + terser-webpack-plugin: 5.3.14(@swc/core@1.13.2(@swc/helpers@0.5.17))(webpack@5.100.2) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.100.2(@swc/core@1.13.1(@swc/helpers@0.5.17)) + webpack: 5.100.2(@swc/core@1.13.2(@swc/helpers@0.5.17)) webpack-dev-middleware: 6.1.3(webpack@5.100.2) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.5.0 @@ -28772,9 +28779,9 @@ snapshots: - uglify-js - webpack-cli - '@storybook/builder-webpack5@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4)': + '@storybook/builder-webpack5@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4)': dependencies: - '@storybook/core-webpack': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/core-webpack': 8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) '@types/semver': 7.7.0 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 @@ -28788,7 +28795,7 @@ snapshots: path-browserify: 1.0.1 process: 0.11.10 semver: 7.7.2 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) style-loader: 3.3.4(webpack@5.100.2) terser-webpack-plugin: 5.3.14(webpack@5.100.2) ts-dedent: 2.2.0 @@ -28854,7 +28861,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@ndelangen/get-tarball': 3.0.9 '@storybook/codemod': 7.6.20 '@storybook/core-common': 7.6.20(encoding@0.1.13) @@ -28898,15 +28905,15 @@ snapshots: - supports-color - utf-8-validate - '@storybook/cli@9.0.17(@babel/preset-env@7.27.2(@babel/core@7.28.0))(@testing-library/dom@10.4.0)(prettier@3.5.3)': + '@storybook/cli@9.0.18(@babel/preset-env@7.27.2(@babel/core@7.28.0))(@testing-library/dom@10.4.1)(prettier@3.5.3)': dependencies: - '@storybook/codemod': 9.0.17(@babel/preset-env@7.27.2(@babel/core@7.28.0))(@testing-library/dom@10.4.0) + '@storybook/codemod': 9.0.18(@babel/preset-env@7.27.2(@babel/core@7.28.0))(@testing-library/dom@10.4.1) '@types/semver': 7.7.0 commander: 12.1.0 - create-storybook: 9.0.17 + create-storybook: 9.0.18 giget: 1.2.5 jscodeshift: 0.15.2(@babel/preset-env@7.27.2(@babel/core@7.28.0)) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 transitivePeerDependencies: - '@babel/preset-env' @@ -28988,7 +28995,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@storybook/csf': 0.1.13 '@storybook/csf-tools': 7.6.20 '@storybook/node-logger': 7.6.20 @@ -29003,15 +29010,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@storybook/codemod@9.0.17(@babel/preset-env@7.27.2(@babel/core@7.28.0))(@testing-library/dom@10.4.0)': + '@storybook/codemod@9.0.18(@babel/preset-env@7.27.2(@babel/core@7.28.0))(@testing-library/dom@10.4.1)': dependencies: '@types/cross-spawn': 6.0.6 cross-spawn: 7.0.6 - es-toolkit: 1.39.7 + es-toolkit: 1.39.8 globby: 14.1.0 jscodeshift: 0.15.2(@babel/preset-env@7.27.2(@babel/core@7.28.0)) prettier: 3.5.3 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) tiny-invariant: 1.3.3 transitivePeerDependencies: - '@babel/preset-env' @@ -29068,9 +29075,9 @@ snapshots: dependencies: storybook: 8.6.14(prettier@3.5.3) - '@storybook/components@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/components@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(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.100.2)': dependencies: @@ -29133,7 +29140,7 @@ snapshots: '@storybook/client-logger': 7.4.6 '@storybook/preview-api': 7.4.6 - '@storybook/core-common@6.5.16(eslint@9.26.0(jiti@2.4.2))(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.26.0(jiti@2.5.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) @@ -29169,7 +29176,7 @@ snapshots: express: 4.21.2 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.4.2))(typescript@5.8.3)(webpack@5.100.2) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.100.2) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -29198,7 +29205,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-common@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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) @@ -29234,7 +29241,7 @@ snapshots: express: 4.21.2 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.4.2))(typescript@5.8.3)(webpack@5.100.2) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.100.2) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -29263,7 +29270,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-common@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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) @@ -29299,7 +29306,7 @@ snapshots: express: 4.21.2 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.4.2))(typescript@5.8.3)(webpack@5.100.2) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.100.2) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -29328,7 +29335,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-common@6.5.16(eslint@9.27.0(jiti@2.4.2))(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(eslint@9.27.0(jiti@2.5.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) @@ -29364,7 +29371,7 @@ snapshots: express: 4.21.2 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.4.2))(typescript@5.8.3)(webpack@5.100.2) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.100.2) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -29393,7 +29400,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-common@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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) @@ -29429,7 +29436,7 @@ snapshots: express: 4.21.2 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.4.2))(typescript@4.9.5)(webpack@5.100.2) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@4.9.5)(webpack@5.100.2) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -29528,20 +29535,20 @@ snapshots: dependencies: ts-dedent: 2.2.0 - '@storybook/core-server@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4.2))(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.4.2))(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.27.0(jiti@2.5.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.5.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.5.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.4.2))(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.27.0(jiti@2.5.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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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.4.2))(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.27.0(jiti@2.5.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.4.2))(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.27.0(jiti@2.5.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.12 '@types/pretty-hrtime': 1.0.3 @@ -29578,8 +29585,8 @@ snapshots: ws: 8.18.3 x-default-browser: 0.4.0 optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4.2))(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.27.0(jiti@2.5.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.5.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' @@ -29594,20 +29601,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.4.2))(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(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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(eslint@9.27.0(jiti@2.5.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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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(eslint@9.27.0(jiti@2.4.2))(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(eslint@9.27.0(jiti@2.5.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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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(eslint@9.27.0(jiti@2.5.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(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.12 '@types/pretty-hrtime': 1.0.3 @@ -29644,8 +29651,8 @@ snapshots: ws: 8.18.3 x-default-browser: 0.4.0 optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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(eslint@9.27.0(jiti@2.5.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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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' @@ -29660,20 +29667,20 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-server@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.4.2))(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.26.0(jiti@2.5.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.4.2))(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.26.0(jiti@2.5.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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.4.2))(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.26.0(jiti@2.5.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.4.2))(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.26.0(jiti@2.5.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.4.2))(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.26.0(jiti@2.5.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.12 '@types/pretty-hrtime': 1.0.3 @@ -29724,20 +29731,20 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-server@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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.4.2))(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.27.0(jiti@2.5.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.12 '@types/pretty-hrtime': 1.0.3 @@ -29788,20 +29795,20 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-server@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': + '@storybook/core-server@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.4.2))(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.27.0(jiti@2.5.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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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.4.2))(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.27.0(jiti@2.5.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.4.2))(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.27.0(jiti@2.5.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.12 '@types/pretty-hrtime': 1.0.3 @@ -29916,21 +29923,21 @@ snapshots: storybook: 8.6.14(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/core-webpack@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/core-webpack@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4.2))(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.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.100.2)': + '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.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.5.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.5.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.100.2)': 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.100.2) - '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4.2))(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.4.2))(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.27.0(jiti@2.5.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.5.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.5.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.100.2(webpack-cli@4.10.0) optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4.2))(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.27.0(jiti@2.5.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.5.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' @@ -29945,16 +29952,16 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.100.2)': + '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2)': 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.100.2) - '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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(eslint@9.27.0(jiti@2.5.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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2(webpack-cli@6.0.1) optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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(eslint@9.27.0(jiti@2.5.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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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' @@ -29969,10 +29976,10 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.100.2)': + '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.100.2)': 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.100.2) - '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.4.2))(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.26.0(jiti@2.5.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.100.2(webpack-cli@5.1.4) @@ -29991,10 +29998,10 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.100.2)': + '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.100.2)': 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.100.2) - '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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.100.2(webpack-cli@5.1.4) @@ -30013,10 +30020,10 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.100.2)': + '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.100.2)': 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.100.2) - '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2(webpack-cli@5.1.4) @@ -30068,14 +30075,14 @@ snapshots: storybook: 8.6.14(prettier@3.5.3) unplugin: 1.16.1 - '@storybook/csf-plugin@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/csf-plugin@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) unplugin: 1.16.1 - '@storybook/csf-plugin@9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/csf-plugin@9.0.18(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) unplugin: 1.16.1 '@storybook/csf-tools@6.5.16': @@ -30086,7 +30093,7 @@ snapshots: '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/mdx1-csf': 0.0.1(@babel/core@7.27.7) core-js: 3.44.0 @@ -30102,7 +30109,7 @@ snapshots: '@babel/generator': 7.28.0 '@babel/parser': 7.28.0 '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@storybook/csf': 0.1.13 '@storybook/types': 7.4.6 fs-extra: 11.3.0 @@ -30116,7 +30123,7 @@ snapshots: '@babel/generator': 7.28.0 '@babel/parser': 7.28.0 '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@storybook/csf': 0.1.13 '@storybook/types': 7.6.20 fs-extra: 11.3.0 @@ -30193,11 +30200,11 @@ snapshots: '@vitest/utils': 2.1.9 storybook: 8.6.14(prettier@3.5.3) - '@storybook/instrumenter@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/instrumenter@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 '@vitest/utils': 2.1.9 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) optional: true '@storybook/manager-api@7.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': @@ -30224,18 +30231,18 @@ snapshots: dependencies: storybook: 8.6.14(prettier@3.5.3) - '@storybook/manager-api@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/manager-api@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) - '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.4.2))(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.26.0(jiti@2.5.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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.4.2))(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.26.0(jiti@2.5.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) @@ -30279,14 +30286,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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) @@ -30330,14 +30337,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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) @@ -30381,14 +30388,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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(eslint@9.27.0(jiti@2.5.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) @@ -30432,14 +30439,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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) @@ -30483,14 +30490,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.5.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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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) @@ -30532,14 +30539,14 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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(eslint@9.27.0(jiti@2.5.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) @@ -30588,7 +30595,7 @@ snapshots: '@babel/generator': 7.28.0 '@babel/parser': 7.28.0 '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@mdx-js/mdx': 1.6.22 '@types/lodash': 4.17.17 js-string-escape: 1.0.1 @@ -30683,10 +30690,10 @@ snapshots: - uglify-js - webpack-cli - '@storybook/preset-react-webpack@8.6.14(@storybook/test@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(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@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4)': dependencies: - '@storybook/core-webpack': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3) + '@storybook/core-webpack': 8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(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.100.2) '@types/semver': 7.7.0 find-up: 5.0.0 @@ -30696,7 +30703,7 @@ snapshots: react-dom: 18.2.0(react@18.2.0) resolve: 1.22.10 semver: 7.7.2 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) tsconfig-paths: 4.2.0 webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: @@ -30747,9 +30754,9 @@ snapshots: dependencies: storybook: 8.6.14(prettier@3.5.3) - '@storybook/preview-api@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/preview-api@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) '@storybook/preview-web@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: @@ -30848,11 +30855,11 @@ snapshots: react-dom: 18.2.0(react@18.2.0) 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@9.0.17(@testing-library/dom@10.4.0)(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@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(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))': dependencies: @@ -30860,33 +30867,33 @@ snapshots: react-dom: 19.1.0(react@19.1.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@9.0.17(@testing-library/dom@10.4.0)(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@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) - '@storybook/react-dom-shim@9.0.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/react-dom-shim@9.0.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) - '@storybook/react-vite@9.0.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.45.1)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.35)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))': + '@storybook/react-vite@9.0.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.46.1)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.35)(jiti@2.5.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.35)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) - '@rollup/pluginutils': 5.2.0(rollup@4.45.1) - '@storybook/builder-vite': 9.0.17(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.35)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) - '@storybook/react': 9.0.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.35)(jiti@2.5.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) + '@rollup/pluginutils': 5.2.0(rollup@4.46.1) + '@storybook/builder-vite': 9.0.18(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.35)(jiti@2.5.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) + '@storybook/react': 9.0.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3) find-up: 7.0.0 magic-string: 0.30.17 react: 19.1.0 react-docgen: 8.0.0 react-dom: 19.1.0(react@19.1.0) resolve: 1.22.10 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) tsconfig-paths: 4.2.0 - vite: 6.3.5(@types/node@22.15.35)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.15.35)(jiti@2.5.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) transitivePeerDependencies: - rollup - supports-color @@ -30940,14 +30947,14 @@ snapshots: - uglify-js - webpack-cli - '@storybook/react-webpack5@8.6.14(@storybook/test@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4)': + '@storybook/react-webpack5@8.6.14(@storybook/test@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4)': dependencies: - '@storybook/builder-webpack5': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(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@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4) - '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3) + '@storybook/builder-webpack5': 8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(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@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4) + '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -30959,15 +30966,15 @@ snapshots: - uglify-js - webpack-cli - '@storybook/react@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4.2))(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.4.2))(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(eslint@9.27.0(jiti@2.5.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.5.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.5.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)': 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.100.2) '@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.4.2))(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.4.2))(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.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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(eslint@9.27.0(jiti@2.5.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.5.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.5.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.100.2) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.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 @@ -31001,8 +31008,8 @@ snapshots: webpack: 5.100.2(webpack-cli@4.10.0) optionalDependencies: '@babel/core': 7.27.7 - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4.2))(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.27.0(jiti@2.5.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.5.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' @@ -31023,15 +31030,15 @@ snapshots: - 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.4.2))(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(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@types/webpack@5.28.5(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@types/webpack@5.28.5(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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(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.100.2) '@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.4.2))(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(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.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 @@ -31065,8 +31072,8 @@ snapshots: webpack: 5.100.2(webpack-cli@6.0.1) optionalDependencies: '@babel/core': 7.27.7 - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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(eslint@9.27.0(jiti@2.5.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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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' @@ -31087,15 +31094,15 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.26.0(jiti@2.4.2))(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.100.2))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.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.100.2))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.28.0) '@babel/preset-react': 7.27.1(@babel/core@7.28.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.2(webpack@5.100.2))(webpack-hot-middleware@2.26.1)(webpack@5.100.2) '@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.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.100.2) - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.4.2))(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.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.100.2) + '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.5.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 @@ -31149,15 +31156,15 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.100.2))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.28.0) '@babel/preset-react': 7.27.1(@babel/core@7.28.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.2(webpack@5.100.2))(webpack-hot-middleware@2.26.1)(webpack@5.100.2) '@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.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.100.2) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.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 @@ -31211,15 +31218,15 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.100.2))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.28.0) '@babel/preset-react': 7.27.1(@babel/core@7.28.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.2(webpack@5.100.2))(webpack-hot-middleware@2.26.1)(webpack@5.100.2) '@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.4.2))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.100.2) + '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.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 @@ -31319,28 +31326,28 @@ snapshots: '@storybook/test': 8.6.14(storybook@8.6.14(prettier@3.5.3)) typescript: 5.8.3 - '@storybook/react@8.6.14(@storybook/test@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)': + '@storybook/react@8.6.14(@storybook/test@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)': dependencies: - '@storybook/components': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/components': 8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) '@storybook/global': 5.0.0 - '@storybook/manager-api': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/preview-api': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(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@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) - '@storybook/theming': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/manager-api': 8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/preview-api': 8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(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@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) + '@storybook/theming': 8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) optionalDependencies: - '@storybook/test': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/test': 8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) typescript: 5.8.3 - '@storybook/react@9.0.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3)': + '@storybook/react@9.0.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 9.0.17(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/react-dom-shim': 9.0.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) optionalDependencies: typescript: 5.8.3 @@ -31437,10 +31444,10 @@ snapshots: '@storybook/client-logger': 7.4.6 '@storybook/preview-api': 7.4.6 - '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.4.2))(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.26.0(jiti@2.5.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.4.2))(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.26.0(jiti@2.5.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.44.0 detect-package-manager: 2.0.1 @@ -31464,10 +31471,10 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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.44.0 detect-package-manager: 2.0.1 @@ -31491,10 +31498,10 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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.4.2))(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.27.0(jiti@2.5.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.44.0 detect-package-manager: 2.0.1 @@ -31518,10 +31525,10 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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(eslint@9.27.0(jiti@2.4.2))(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(eslint@9.27.0(jiti@2.5.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.44.0 detect-package-manager: 2.0.1 @@ -31545,10 +31552,10 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.5.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.4.2))(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.27.0(jiti@2.5.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.44.0 detect-package-manager: 2.0.1 @@ -31597,16 +31604,16 @@ snapshots: '@vitest/spy': 2.0.5 storybook: 8.6.14(prettier@3.5.3) - '@storybook/test@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/test@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3)) + '@storybook/instrumenter': 8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(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: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) optional: true '@storybook/theming@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': @@ -31640,9 +31647,9 @@ snapshots: dependencies: storybook: 8.6.14(prettier@3.5.3) - '@storybook/theming@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))': + '@storybook/theming@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))': dependencies: - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) '@storybook/types@7.4.6': dependencies: @@ -31698,7 +31705,7 @@ snapshots: '@swagger-api/apidom-ast@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-error': 1.0.0-beta.44 '@types/ramda': 0.30.2 ramda: 0.30.1 @@ -31707,7 +31714,7 @@ snapshots: '@swagger-api/apidom-core@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-ast': 1.0.0-beta.44 '@swagger-api/apidom-error': 1.0.0-beta.44 '@types/ramda': 0.30.2 @@ -31719,18 +31726,18 @@ snapshots: '@swagger-api/apidom-error@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-json-pointer@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-error': 1.0.0-beta.44 '@swaggerexpert/json-pointer': 2.10.2 '@swagger-api/apidom-ns-api-design-systems@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-error': 1.0.0-beta.44 '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-beta.44 @@ -31742,7 +31749,7 @@ snapshots: '@swagger-api/apidom-ns-arazzo-1@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-ns-json-schema-2020-12': 1.0.0-beta.44 '@types/ramda': 0.30.2 @@ -31753,7 +31760,7 @@ snapshots: '@swagger-api/apidom-ns-asyncapi-2@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-ns-json-schema-draft-7': 1.0.0-beta.44 '@types/ramda': 0.30.2 @@ -31764,7 +31771,7 @@ snapshots: '@swagger-api/apidom-ns-json-schema-2019-09@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-error': 1.0.0-beta.44 '@swagger-api/apidom-ns-json-schema-draft-7': 1.0.0-beta.44 @@ -31775,7 +31782,7 @@ snapshots: '@swagger-api/apidom-ns-json-schema-2020-12@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-error': 1.0.0-beta.44 '@swagger-api/apidom-ns-json-schema-2019-09': 1.0.0-beta.44 @@ -31786,7 +31793,7 @@ snapshots: '@swagger-api/apidom-ns-json-schema-draft-4@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-ast': 1.0.0-beta.44 '@swagger-api/apidom-core': 1.0.0-beta.44 '@types/ramda': 0.30.2 @@ -31796,7 +31803,7 @@ snapshots: '@swagger-api/apidom-ns-json-schema-draft-6@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-error': 1.0.0-beta.44 '@swagger-api/apidom-ns-json-schema-draft-4': 1.0.0-beta.44 @@ -31807,7 +31814,7 @@ snapshots: '@swagger-api/apidom-ns-json-schema-draft-7@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-error': 1.0.0-beta.44 '@swagger-api/apidom-ns-json-schema-draft-6': 1.0.0-beta.44 @@ -31818,7 +31825,7 @@ snapshots: '@swagger-api/apidom-ns-openapi-2@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-error': 1.0.0-beta.44 '@swagger-api/apidom-ns-json-schema-draft-4': 1.0.0-beta.44 @@ -31830,7 +31837,7 @@ snapshots: '@swagger-api/apidom-ns-openapi-3-0@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-error': 1.0.0-beta.44 '@swagger-api/apidom-ns-json-schema-draft-4': 1.0.0-beta.44 @@ -31841,7 +31848,7 @@ snapshots: '@swagger-api/apidom-ns-openapi-3-1@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-ast': 1.0.0-beta.44 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-json-pointer': 1.0.0-beta.44 @@ -31854,7 +31861,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-ns-api-design-systems': 1.0.0-beta.44 '@swagger-api/apidom-parser-adapter-json': 1.0.0-beta.44 @@ -31865,7 +31872,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-ns-api-design-systems': 1.0.0-beta.44 '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-beta.44 @@ -31876,7 +31883,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-ns-arazzo-1': 1.0.0-beta.44 '@swagger-api/apidom-parser-adapter-json': 1.0.0-beta.44 @@ -31887,7 +31894,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-ns-arazzo-1': 1.0.0-beta.44 '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-beta.44 @@ -31898,7 +31905,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-ns-asyncapi-2': 1.0.0-beta.44 '@swagger-api/apidom-parser-adapter-json': 1.0.0-beta.44 @@ -31909,7 +31916,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-ns-asyncapi-2': 1.0.0-beta.44 '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-beta.44 @@ -31920,7 +31927,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-json@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-ast': 1.0.0-beta.44 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-error': 1.0.0-beta.44 @@ -31934,7 +31941,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-openapi-json-2@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-ns-openapi-2': 1.0.0-beta.44 '@swagger-api/apidom-parser-adapter-json': 1.0.0-beta.44 @@ -31945,7 +31952,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-beta.44 '@swagger-api/apidom-parser-adapter-json': 1.0.0-beta.44 @@ -31956,7 +31963,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-beta.44 '@swagger-api/apidom-parser-adapter-json': 1.0.0-beta.44 @@ -31967,7 +31974,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-ns-openapi-2': 1.0.0-beta.44 '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-beta.44 @@ -31978,7 +31985,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-beta.44 '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-beta.44 @@ -31989,7 +31996,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-beta.44 '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-beta.44 @@ -32000,7 +32007,7 @@ snapshots: '@swagger-api/apidom-parser-adapter-yaml-1-2@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-ast': 1.0.0-beta.44 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-error': 1.0.0-beta.44 @@ -32014,7 +32021,7 @@ snapshots: '@swagger-api/apidom-reference@1.0.0-beta.44': dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-error': 1.0.0-beta.44 '@types/ramda': 0.30.2 @@ -32055,51 +32062,51 @@ snapshots: dependencies: apg-lite: 1.0.5 - '@swc/core-darwin-arm64@1.13.1': + '@swc/core-darwin-arm64@1.13.2': optional: true - '@swc/core-darwin-x64@1.13.1': + '@swc/core-darwin-x64@1.13.2': optional: true - '@swc/core-linux-arm-gnueabihf@1.13.1': + '@swc/core-linux-arm-gnueabihf@1.13.2': optional: true - '@swc/core-linux-arm64-gnu@1.13.1': + '@swc/core-linux-arm64-gnu@1.13.2': optional: true - '@swc/core-linux-arm64-musl@1.13.1': + '@swc/core-linux-arm64-musl@1.13.2': optional: true - '@swc/core-linux-x64-gnu@1.13.1': + '@swc/core-linux-x64-gnu@1.13.2': optional: true - '@swc/core-linux-x64-musl@1.13.1': + '@swc/core-linux-x64-musl@1.13.2': optional: true - '@swc/core-win32-arm64-msvc@1.13.1': + '@swc/core-win32-arm64-msvc@1.13.2': optional: true - '@swc/core-win32-ia32-msvc@1.13.1': + '@swc/core-win32-ia32-msvc@1.13.2': optional: true - '@swc/core-win32-x64-msvc@1.13.1': + '@swc/core-win32-x64-msvc@1.13.2': optional: true - '@swc/core@1.13.1(@swc/helpers@0.5.17)': + '@swc/core@1.13.2(@swc/helpers@0.5.17)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.23 optionalDependencies: - '@swc/core-darwin-arm64': 1.13.1 - '@swc/core-darwin-x64': 1.13.1 - '@swc/core-linux-arm-gnueabihf': 1.13.1 - '@swc/core-linux-arm64-gnu': 1.13.1 - '@swc/core-linux-arm64-musl': 1.13.1 - '@swc/core-linux-x64-gnu': 1.13.1 - '@swc/core-linux-x64-musl': 1.13.1 - '@swc/core-win32-arm64-msvc': 1.13.1 - '@swc/core-win32-ia32-msvc': 1.13.1 - '@swc/core-win32-x64-msvc': 1.13.1 + '@swc/core-darwin-arm64': 1.13.2 + '@swc/core-darwin-x64': 1.13.2 + '@swc/core-linux-arm-gnueabihf': 1.13.2 + '@swc/core-linux-arm64-gnu': 1.13.2 + '@swc/core-linux-arm64-musl': 1.13.2 + '@swc/core-linux-x64-gnu': 1.13.2 + '@swc/core-linux-x64-musl': 1.13.2 + '@swc/core-win32-arm64-msvc': 1.13.2 + '@swc/core-win32-ia32-msvc': 1.13.2 + '@swc/core-win32-x64-msvc': 1.13.2 '@swc/helpers': 0.5.17 '@swc/counter@0.1.3': {} @@ -32186,7 +32193,7 @@ snapshots: '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 @@ -32194,6 +32201,17 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 + '@testing-library/dom@10.4.1': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.28.2 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + picocolors: 1.1.1 + pretty-format: 27.5.1 + '@testing-library/jest-dom@6.5.0': dependencies: '@adobe/css-tools': 4.4.3 @@ -32204,20 +32222,20 @@ snapshots: lodash: 4.17.21 redent: 3.0.0 - '@testing-library/jest-dom@6.6.3': + '@testing-library/jest-dom@6.6.4': dependencies: '@adobe/css-tools': 4.4.3 aria-query: 5.3.2 - chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 lodash: 4.17.21 + picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@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.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)': dependencies: - '@babel/runtime': 7.27.6 - '@testing-library/dom': 10.4.0 + '@babel/runtime': 7.28.2 + '@testing-library/dom': 10.4.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) optionalDependencies: @@ -32228,9 +32246,9 @@ snapshots: dependencies: '@testing-library/dom': 10.4.0 - '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)': + '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': dependencies: - '@testing-library/dom': 10.4.0 + '@testing-library/dom': 10.4.1 '@textlint/ast-node-types@14.8.4': {} @@ -32295,23 +32313,23 @@ snapshots: '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.7 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@types/blueimp-md5@2.18.2': {} @@ -32765,7 +32783,7 @@ snapshots: dependencies: '@types/node': 22.15.35 '@types/source-list-map': 0.1.6 - source-map: 0.7.4 + source-map: 0.7.6 '@types/webpack@4.41.40': dependencies: @@ -32931,15 +32949,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.32.1(eslint@9.27.0(jiti@2.5.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.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.32.1 - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.27.0(jiti@2.5.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -32948,15 +32966,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.33.1(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.33.1(eslint@9.26.0(jiti@2.5.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.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.32.1(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.32.1 - eslint: 9.26.0(jiti@2.4.2) + eslint: 9.26.0(jiti@2.5.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -32965,15 +32983,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.33.1(eslint@9.27.0(jiti@2.5.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.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.32.1 - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.27.0(jiti@2.5.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -32982,15 +33000,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.33.1(eslint@9.27.0(jiti@2.5.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.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) + '@typescript-eslint/utils': 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.33.1 - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.27.0(jiti@2.5.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -33060,14 +33078,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.5.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.1(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.27.0(jiti@2.5.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -33084,26 +33102,26 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.5.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.1(supports-color@8.1.1) - eslint: 9.26.0(jiti@2.4.2) + eslint: 9.26.0(jiti@2.5.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.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.1(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.27.0(jiti@2.5.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -33200,34 +33218,34 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.32.1(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.32.1(eslint@9.26.0(jiti@2.5.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.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3) debug: 4.4.1(supports-color@8.1.1) - eslint: 9.26.0(jiti@2.4.2) + eslint: 9.26.0(jiti@2.5.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.4.2))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.32.1(eslint@9.27.0(jiti@2.5.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.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) debug: 4.4.1(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.27.0(jiti@2.5.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.4.2))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.33.1(eslint@9.27.0(jiti@2.5.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.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) debug: 4.4.1(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.27.0(jiti@2.5.1) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -33389,35 +33407,35 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@8.32.1(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/utils@8.32.1(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@2.5.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.4.2) + eslint: 9.26.0(jiti@2.5.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/utils@8.32.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.5.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.4.2) + eslint: 9.27.0(jiti@2.5.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/utils@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.5.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.4.2) + eslint: 9.27.0(jiti@2.5.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -33483,7 +33501,7 @@ snapshots: '@uiw/react-codemirror@4.23.14(@codemirror/lint@6.8.5)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.38.1)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 '@codemirror/commands': 6.8.1 '@codemirror/state': 6.5.2 '@codemirror/theme-one-dark': 6.1.3 @@ -33497,7 +33515,7 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@4.7.0(vite@6.3.5(@types/node@22.15.35)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))': + '@vitejs/plugin-react@4.7.0(vite@6.3.5(@types/node@22.15.35)(jiti@2.5.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) @@ -33505,7 +33523,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.5(@types/node@22.15.35)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.15.35)(jiti@2.5.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -33548,19 +33566,19 @@ snapshots: dependencies: '@vitest/pretty-format': 2.0.5 estree-walker: 3.0.3 - loupe: 3.1.4 + loupe: 3.2.0 tinyrainbow: 1.2.0 '@vitest/utils@2.1.9': dependencies: '@vitest/pretty-format': 2.1.9 - loupe: 3.1.4 + loupe: 3.2.0 tinyrainbow: 1.2.0 '@vitest/utils@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 - loupe: 3.1.4 + loupe: 3.2.0 tinyrainbow: 2.0.0 '@vscode-logging/logger@2.0.0': @@ -33986,7 +34004,7 @@ snapshots: clean-stack: 4.2.0 indent-string: 5.0.0 - ai@4.3.17(react@18.2.0)(zod@3.25.76): + ai@4.3.19(react@18.2.0)(zod@3.25.76): dependencies: '@ai-sdk/provider': 1.1.3 '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) @@ -33998,7 +34016,7 @@ snapshots: optionalDependencies: react: 18.2.0 - ai@4.3.17(react@19.1.0)(zod@3.25.76): + ai@4.3.19(react@19.1.0)(zod@3.25.76): dependencies: '@ai-sdk/provider': 1.1.3 '@ai-sdk/provider-utils': 2.2.8(zod@3.25.76) @@ -34506,7 +34524,7 @@ snapshots: '@babel/code-frame': 7.27.1 '@babel/parser': 7.28.0 '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 eslint: 6.8.0 eslint-visitor-keys: 1.3.0 resolve: 1.22.10 @@ -34736,25 +34754,25 @@ snapshots: babel-plugin-jest-hoist@25.5.0: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@types/babel__traverse': 7.20.7 babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.7 babel-plugin-macros@2.8.0: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 cosmiconfig: 6.0.0 resolve: 1.22.10 babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 cosmiconfig: 7.1.0 resolve: 1.22.10 @@ -35379,17 +35397,17 @@ snapshots: browserslist@1.7.7: dependencies: caniuse-db: 1.0.30001727 - electron-to-chromium: 1.5.189 + electron-to-chromium: 1.5.191 browserslist@2.11.3: dependencies: caniuse-lite: 1.0.30001727 - electron-to-chromium: 1.5.189 + electron-to-chromium: 1.5.191 browserslist@4.25.1: dependencies: caniuse-lite: 1.0.30001727 - electron-to-chromium: 1.5.189 + electron-to-chromium: 1.5.191 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.1) @@ -35565,9 +35583,9 @@ snapshots: normalize-url: 8.0.2 responselike: 3.0.0 - cacheable@1.10.2: + cacheable@1.10.3: dependencies: - hookified: 1.10.0 + hookified: 1.11.0 keyv: 5.4.0 call-bind-apply-helpers@1.0.2: @@ -35686,7 +35704,7 @@ snapshots: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.4 + loupe: 3.2.0 pathval: 2.0.1 chainsaw@0.1.0: @@ -36304,7 +36322,7 @@ snapshots: - supports-color - ts-node - create-storybook@9.0.17: + create-storybook@9.0.18: dependencies: semver: 7.7.2 @@ -37063,7 +37081,7 @@ snapshots: dependencies: jake: 10.9.2 - electron-to-chromium@1.5.189: {} + electron-to-chromium@1.5.191: {} email-addresses@5.0.0: {} @@ -37275,7 +37293,7 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es-toolkit@1.39.7: {} + es-toolkit@1.39.8: {} es5-ext@0.10.64: dependencies: @@ -37483,21 +37501,21 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-react-hooks@5.2.0(eslint@9.26.0(jiti@2.4.2)): + eslint-plugin-react-hooks@5.2.0(eslint@9.26.0(jiti@2.5.1)): dependencies: - eslint: 9.26.0(jiti@2.4.2) + eslint: 9.26.0(jiti@2.5.1) - eslint-plugin-react-hooks@5.2.0(eslint@9.27.0(jiti@2.4.2)): + eslint-plugin-react-hooks@5.2.0(eslint@9.27.0(jiti@2.5.1)): dependencies: - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.27.0(jiti@2.5.1) eslint-plugin-react-refresh@0.4.20(eslint@8.57.1): dependencies: eslint: 8.57.1 - eslint-plugin-react-refresh@0.4.20(eslint@9.27.0(jiti@2.4.2)): + eslint-plugin-react-refresh@0.4.20(eslint@9.27.0(jiti@2.5.1)): dependencies: - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.27.0(jiti@2.5.1) eslint-plugin-react@7.37.5(eslint@6.8.0): dependencies: @@ -37543,26 +37561,26 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-storybook@9.0.17(eslint@8.57.1)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3))(typescript@5.8.3): + eslint-plugin-storybook@9.0.18(eslint@8.57.1)(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3))(typescript@5.8.3): dependencies: '@typescript-eslint/utils': 8.38.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3) + storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) 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.4.2))(typescript@5.8.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.26.0(jiti@2.4.2)): + 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.5.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.5.1)): dependencies: - eslint: 9.26.0(jiti@2.4.2) + eslint: 9.26.0(jiti@2.5.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.5.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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2)): + 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.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1)): dependencies: - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.27.0(jiti@2.5.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3) eslint-scope@5.1.1: dependencies: @@ -37685,9 +37703,9 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.26.0(jiti@2.4.2): + eslint@9.26.0(jiti@2.5.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@2.5.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.20.1 '@eslint/config-helpers': 0.2.3 @@ -37698,7 +37716,7 @@ snapshots: '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@modelcontextprotocol/sdk': 1.16.0 + '@modelcontextprotocol/sdk': 1.17.0 '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 ajv: 6.12.6 @@ -37725,13 +37743,13 @@ snapshots: optionator: 0.9.4 zod: 3.25.76 optionalDependencies: - jiti: 2.4.2 + jiti: 2.5.1 transitivePeerDependencies: - supports-color - eslint@9.27.0(jiti@2.4.2): + eslint@9.27.0(jiti@2.5.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.5.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.20.1 '@eslint/config-helpers': 0.2.3 @@ -37767,7 +37785,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.4.2 + jiti: 2.5.1 transitivePeerDependencies: - supports-color @@ -37817,7 +37835,7 @@ snapshots: estree-to-babel@3.2.1: dependencies: '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 c8: 7.14.0 transitivePeerDependencies: - supports-color @@ -38210,9 +38228,9 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - file-entry-cache@10.1.1: + file-entry-cache@10.1.3: dependencies: - flat-cache: 6.1.11 + flat-cache: 6.1.12 file-entry-cache@5.0.1: dependencies: @@ -38401,11 +38419,11 @@ snapshots: flatted: 3.3.3 keyv: 4.5.4 - flat-cache@6.1.11: + flat-cache@6.1.12: dependencies: - cacheable: 1.10.2 + cacheable: 1.10.3 flatted: 3.3.3 - hookified: 1.10.0 + hookified: 1.11.0 flat@5.0.2: {} @@ -38415,7 +38433,7 @@ snapshots: flatten@1.0.3: {} - flow-parser@0.276.0: {} + flow-parser@0.277.1: {} flush-write-stream@1.1.1: dependencies: @@ -38473,7 +38491,7 @@ snapshots: tapable: 1.1.3 worker-rpc: 0.1.1 - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3)(webpack@5.100.2): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.100.2): dependencies: '@babel/code-frame': 7.27.1 '@types/json-schema': 7.0.15 @@ -38491,9 +38509,9 @@ snapshots: typescript: 5.8.3 webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: - eslint: 9.26.0(jiti@2.4.2) + eslint: 9.26.0(jiti@2.5.1) - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.4.2))(typescript@4.9.5)(webpack@5.100.2): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@4.9.5)(webpack@5.100.2): dependencies: '@babel/code-frame': 7.27.1 '@types/json-schema': 7.0.15 @@ -38511,9 +38529,9 @@ snapshots: typescript: 4.9.5 webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.27.0(jiti@2.5.1) - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)(webpack@5.100.2): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.100.2): dependencies: '@babel/code-frame': 7.27.1 '@types/json-schema': 7.0.15 @@ -38531,7 +38549,7 @@ snapshots: typescript: 5.8.3 webpack: 5.100.2(webpack-cli@6.0.1) optionalDependencies: - eslint: 9.27.0(jiti@2.4.2) + eslint: 9.27.0(jiti@2.5.1) fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.100.2): dependencies: @@ -39318,7 +39336,7 @@ snapshots: space-separated-tokens: 2.0.2 style-to-js: 1.1.17 unist-util-position: 5.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 transitivePeerDependencies: - supports-color @@ -39404,7 +39422,7 @@ snapshots: dependencies: parse-passwd: 1.0.0 - hookified@1.10.0: {} + hookified@1.11.0: {} hosted-git-info@2.8.9: {} @@ -41115,7 +41133,7 @@ snapshots: jest-snapshot@25.5.1: dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@jest/types': 25.5.0 '@types/prettier': 1.19.1 chalk: 3.0.0 @@ -41137,7 +41155,7 @@ snapshots: '@babel/generator': 7.28.0 '@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.1 + '@babel/types': 7.28.2 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 @@ -41323,7 +41341,7 @@ snapshots: jiti@1.21.7: {} - jiti@2.4.2: {} + jiti@2.5.1: {} joi@17.13.3: dependencies: @@ -41379,7 +41397,7 @@ snapshots: '@babel/register': 7.27.1(@babel/core@7.27.7) babel-core: 7.0.0-bridge.0(@babel/core@7.27.7) chalk: 4.1.2 - flow-parser: 0.276.0 + flow-parser: 0.277.1 graceful-fs: 4.2.11 micromatch: 4.0.8 neo-async: 2.6.2 @@ -41406,7 +41424,7 @@ snapshots: '@babel/register': 7.27.1(@babel/core@7.27.7) babel-core: 7.0.0-bridge.0(@babel/core@7.27.7) chalk: 4.1.2 - flow-parser: 0.276.0 + flow-parser: 0.277.1 graceful-fs: 4.2.11 micromatch: 4.0.8 neo-async: 2.6.2 @@ -41434,7 +41452,7 @@ snapshots: escodegen: 1.14.3 html-encoding-sniffer: 1.0.2 left-pad: 1.3.0 - nwsapi: 2.2.20 + nwsapi: 2.2.21 parse5: 4.0.0 pn: 1.1.0 request: 2.88.2 @@ -41462,7 +41480,7 @@ snapshots: domexception: 1.0.1 escodegen: 1.14.3 html-encoding-sniffer: 1.0.2 - nwsapi: 2.2.20 + nwsapi: 2.2.21 parse5: 5.1.0 pn: 1.1.0 request: 2.88.2 @@ -41498,7 +41516,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.20 + nwsapi: 2.2.21 parse5: 7.3.0 saxes: 6.0.0 symbol-tree: 3.2.4 @@ -41553,7 +41571,7 @@ snapshots: json-schema-to-ts@3.1.1: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 ts-algebra: 2.0.0 json-schema-traverse@0.3.1: {} @@ -41713,14 +41731,14 @@ snapshots: dependencies: package-json: 4.0.1 - launch-editor@2.10.0: + launch-editor@2.11.0: dependencies: picocolors: 1.1.1 shell-quote: 1.8.3 lazy-universal-dotenv@3.0.1: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 app-root-dir: 1.0.2 core-js: 3.44.0 dotenv: 8.6.0 @@ -41978,7 +41996,7 @@ snapshots: dependencies: get-func-name: 2.0.2 - loupe@3.1.4: {} + loupe@3.2.0: {} lower-case@1.1.4: {} @@ -42274,7 +42292,7 @@ snapshots: parse-entities: 4.0.2 stringify-entities: 4.0.4 unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 + vfile-message: 4.0.3 transitivePeerDependencies: - supports-color @@ -42381,10 +42399,10 @@ snapshots: dependencies: fs-monkey: 1.1.0 - memfs@4.17.2: + memfs@4.23.0: dependencies: - '@jsonjoy.com/json-pack': 1.2.0(tslib@2.8.1) - '@jsonjoy.com/util': 1.6.0(tslib@2.8.1) + '@jsonjoy.com/json-pack': 1.4.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.8.0(tslib@2.8.1) tree-dump: 1.0.3(tslib@2.8.1) tslib: 2.8.1 @@ -43377,7 +43395,7 @@ snapshots: nwmatcher@1.4.4: {} - nwsapi@2.2.20: {} + nwsapi@2.2.21: {} nypm@0.5.4: dependencies: @@ -43980,7 +43998,7 @@ snapshots: polished@4.3.1: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 popmotion@11.0.3: dependencies: @@ -44880,7 +44898,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/generator': 7.28.0 - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 ast-types: 0.14.2 commander: 2.20.3 doctrine: 3.0.0 @@ -44895,7 +44913,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.7 '@types/doctrine': 0.0.9 @@ -44910,7 +44928,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.7 '@types/doctrine': 0.0.9 @@ -44958,7 +44976,7 @@ snapshots: react-error-boundary@6.0.0(react@19.1.0): dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 react: 19.1.0 react-error-overlay@4.0.1: {} @@ -44982,7 +45000,7 @@ snapshots: react-dom: 18.2.0(react@18.2.0) react-lifecycles-compat: 3.0.4 shallowequal: 1.1.0 - source-map: 0.7.4 + source-map: 0.7.6 optionalDependencies: '@types/react': 18.2.0 @@ -45003,7 +45021,7 @@ snapshots: react-inspector@5.1.1(react@18.2.0): dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 is-dom: 1.1.0 prop-types: 15.8.1 react: 18.2.0 @@ -45320,7 +45338,7 @@ snapshots: react-syntax-highlighter@15.6.1(react@18.2.0): dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 highlight.js: 10.7.3 highlightjs-vue: 1.0.0 lowlight: 1.20.0 @@ -45336,7 +45354,7 @@ snapshots: react-textarea-autosize@8.5.9(@types/react@18.2.0)(react@18.2.0): dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 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) @@ -45526,7 +45544,7 @@ snapshots: redux@4.2.1: dependencies: - '@babel/runtime': 7.27.6 + '@babel/runtime': 7.28.2 redux@5.0.1: {} @@ -45912,14 +45930,14 @@ snapshots: glob: 11.0.3 package-json-from-dist: 1.0.1 - rollup-plugin-import-css@3.5.8(rollup@4.45.1): + rollup-plugin-import-css@3.5.8(rollup@4.46.1): dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.45.1) - rollup: 4.45.1 + '@rollup/pluginutils': 5.2.0(rollup@4.46.1) + rollup: 4.46.1 - rollup-plugin-peer-deps-external@2.2.4(rollup@4.45.1): + rollup-plugin-peer-deps-external@2.2.4(rollup@4.46.1): dependencies: - rollup: 4.45.1 + rollup: 4.46.1 rollup-plugin-postcss@4.0.2(postcss@8.5.6): dependencies: @@ -45975,12 +45993,12 @@ snapshots: tslib: 2.0.1 typescript: 3.9.10 - rollup-plugin-typescript2@0.36.0(rollup@4.45.1)(typescript@5.8.3): + rollup-plugin-typescript2@0.36.0(rollup@4.46.1)(typescript@5.8.3): dependencies: '@rollup/pluginutils': 4.2.1 find-cache-dir: 3.3.2 fs-extra: 10.1.0 - rollup: 4.45.1 + rollup: 4.46.1 semver: 7.7.2 tslib: 2.8.1 typescript: 5.8.3 @@ -46000,30 +46018,30 @@ snapshots: '@types/node': 22.15.35 acorn: 7.4.1 - rollup@4.45.1: + rollup@4.46.1: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.45.1 - '@rollup/rollup-android-arm64': 4.45.1 - '@rollup/rollup-darwin-arm64': 4.45.1 - '@rollup/rollup-darwin-x64': 4.45.1 - '@rollup/rollup-freebsd-arm64': 4.45.1 - '@rollup/rollup-freebsd-x64': 4.45.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.45.1 - '@rollup/rollup-linux-arm-musleabihf': 4.45.1 - '@rollup/rollup-linux-arm64-gnu': 4.45.1 - '@rollup/rollup-linux-arm64-musl': 4.45.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.45.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.45.1 - '@rollup/rollup-linux-riscv64-gnu': 4.45.1 - '@rollup/rollup-linux-riscv64-musl': 4.45.1 - '@rollup/rollup-linux-s390x-gnu': 4.45.1 - '@rollup/rollup-linux-x64-gnu': 4.45.1 - '@rollup/rollup-linux-x64-musl': 4.45.1 - '@rollup/rollup-win32-arm64-msvc': 4.45.1 - '@rollup/rollup-win32-ia32-msvc': 4.45.1 - '@rollup/rollup-win32-x64-msvc': 4.45.1 + '@rollup/rollup-android-arm-eabi': 4.46.1 + '@rollup/rollup-android-arm64': 4.46.1 + '@rollup/rollup-darwin-arm64': 4.46.1 + '@rollup/rollup-darwin-x64': 4.46.1 + '@rollup/rollup-freebsd-arm64': 4.46.1 + '@rollup/rollup-freebsd-x64': 4.46.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.46.1 + '@rollup/rollup-linux-arm-musleabihf': 4.46.1 + '@rollup/rollup-linux-arm64-gnu': 4.46.1 + '@rollup/rollup-linux-arm64-musl': 4.46.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.46.1 + '@rollup/rollup-linux-ppc64-gnu': 4.46.1 + '@rollup/rollup-linux-riscv64-gnu': 4.46.1 + '@rollup/rollup-linux-riscv64-musl': 4.46.1 + '@rollup/rollup-linux-s390x-gnu': 4.46.1 + '@rollup/rollup-linux-x64-gnu': 4.46.1 + '@rollup/rollup-linux-x64-musl': 4.46.1 + '@rollup/rollup-win32-arm64-msvc': 4.46.1 + '@rollup/rollup-win32-ia32-msvc': 4.46.1 + '@rollup/rollup-win32-x64-msvc': 4.46.1 fsevents: 2.3.3 router@2.2.0: @@ -46197,7 +46215,7 @@ snapshots: scss-tokenizer@0.4.3: dependencies: js-base64: 2.6.4 - source-map: 0.7.4 + source-map: 0.7.6 secretlint@9.3.4: dependencies: @@ -46462,7 +46480,7 @@ snapshots: dependencies: bytes-iec: 3.1.1 chokidar: 4.0.3 - jiti: 2.4.2 + jiti: 2.5.1 lilconfig: 3.1.3 nanospinner: 1.2.2 picocolors: 1.1.1 @@ -46591,7 +46609,7 @@ snapshots: source-map@0.6.1: {} - source-map@0.7.4: {} + source-map@0.7.6: {} sourcemap-codec@1.4.8: {} @@ -46728,11 +46746,11 @@ snapshots: - supports-color - utf-8-validate - storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.5.3): + storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3): dependencies: '@storybook/global': 5.0.0 - '@testing-library/jest-dom': 6.6.3 - '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) + '@testing-library/jest-dom': 6.6.4 + '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) '@vitest/expect': 3.2.4 '@vitest/spy': 3.2.4 better-opn: 3.0.2 @@ -47044,7 +47062,7 @@ snapshots: debug: 4.4.1(supports-color@8.1.1) fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 - file-entry-cache: 10.1.1 + file-entry-cache: 10.1.3 global-modules: 2.0.0 globby: 11.1.0 globjoin: 0.1.4 @@ -47220,7 +47238,7 @@ snapshots: swagger-client@3.35.6: dependencies: - '@babel/runtime-corejs3': 7.28.0 + '@babel/runtime-corejs3': 7.28.2 '@scarf/scarf': 1.4.0 '@swagger-api/apidom-core': 1.0.0-beta.44 '@swagger-api/apidom-error': 1.0.0-beta.44 @@ -47243,7 +47261,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.0 + '@babel/runtime-corejs3': 7.28.2 '@scarf/scarf': 1.4.0 base64-js: 1.5.1 classnames: 2.5.1 @@ -47284,7 +47302,7 @@ snapshots: swagger-ui-react@5.27.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.0 + '@babel/runtime-corejs3': 7.28.2 '@scarf/scarf': 1.4.0 base64-js: 1.5.1 classnames: 2.5.1 @@ -47323,9 +47341,9 @@ snapshots: - '@types/react' - debug - swc-loader@0.2.6(@swc/core@1.13.1(@swc/helpers@0.5.17))(webpack@5.100.2): + swc-loader@0.2.6(@swc/core@1.13.2(@swc/helpers@0.5.17))(webpack@5.100.2): dependencies: - '@swc/core': 1.13.1(@swc/helpers@0.5.17) + '@swc/core': 1.13.2(@swc/helpers@0.5.17) '@swc/counter': 0.1.3 webpack: 5.100.2(webpack-cli@5.1.4) @@ -47520,7 +47538,7 @@ snapshots: webpack: 5.100.2(webpack-cli@6.0.1) webpack-sources: 1.4.3 - terser-webpack-plugin@5.3.14(@swc/core@1.13.1(@swc/helpers@0.5.17))(webpack@5.100.2): + terser-webpack-plugin@5.3.14(@swc/core@1.13.2(@swc/helpers@0.5.17))(webpack@5.100.2): dependencies: '@jridgewell/trace-mapping': 0.3.29 jest-worker: 27.5.1 @@ -47529,7 +47547,7 @@ snapshots: terser: 5.43.1 webpack: 5.100.2(webpack-cli@5.1.4) optionalDependencies: - '@swc/core': 1.13.1(@swc/helpers@0.5.17) + '@swc/core': 1.13.2(@swc/helpers@0.5.17) terser-webpack-plugin@5.3.14(webpack@5.100.2): dependencies: @@ -47857,7 +47875,7 @@ snapshots: enhanced-resolve: 5.18.2 micromatch: 4.0.8 semver: 7.7.2 - source-map: 0.7.4 + source-map: 0.7.6 typescript: 5.8.3 webpack: 5.100.2(webpack-cli@6.0.1) @@ -48665,7 +48683,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 1.9.0 - source-map: 0.7.4 + source-map: 0.7.6 v8-to-istanbul@9.3.0: dependencies: @@ -48706,7 +48724,7 @@ snapshots: '@types/unist': 3.0.3 vfile: 6.0.3 - vfile-message@4.0.2: + vfile-message@4.0.3: dependencies: '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 @@ -48714,20 +48732,20 @@ snapshots: vfile@6.0.3: dependencies: '@types/unist': 3.0.3 - vfile-message: 4.0.2 + vfile-message: 4.0.3 - vite@6.3.5(@types/node@22.15.35)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0): + vite@6.3.5(@types/node@22.15.35)(jiti@2.5.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0): dependencies: esbuild: 0.25.8 fdir: 6.4.6(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.45.1 + rollup: 4.46.1 tinyglobby: 0.2.14 optionalDependencies: '@types/node': 22.15.35 fsevents: 2.3.3 - jiti: 2.4.2 + jiti: 2.5.1 sass: 1.89.2 terser: 5.43.1 yaml: 2.8.0 @@ -49090,7 +49108,7 @@ snapshots: webpack-dev-middleware@7.4.2(webpack@5.100.2): dependencies: colorette: 2.0.20 - memfs: 4.17.2 + memfs: 4.23.0 mime-types: 2.1.35 on-finished: 2.4.1 range-parser: 1.2.1 @@ -49118,7 +49136,7 @@ snapshots: graceful-fs: 4.2.11 http-proxy-middleware: 2.0.9(@types/express@4.17.23) ipaddr.js: 2.2.0 - launch-editor: 2.10.0 + launch-editor: 2.11.0 open: 10.2.0 p-retry: 6.2.1 schema-utils: 4.3.2 @@ -49158,7 +49176,7 @@ snapshots: graceful-fs: 4.2.11 http-proxy-middleware: 2.0.9(@types/express@4.17.23) ipaddr.js: 2.2.0 - launch-editor: 2.10.0 + launch-editor: 2.11.0 open: 10.2.0 p-retry: 6.2.1 schema-utils: 4.3.2 @@ -49197,7 +49215,7 @@ snapshots: graceful-fs: 4.2.11 http-proxy-middleware: 2.0.9(@types/express@4.17.23) ipaddr.js: 2.2.0 - launch-editor: 2.10.0 + launch-editor: 2.11.0 open: 10.2.0 p-retry: 6.2.1 schema-utils: 4.3.2 @@ -49236,7 +49254,7 @@ snapshots: graceful-fs: 4.2.11 http-proxy-middleware: 2.0.9(@types/express@4.17.23) ipaddr.js: 2.2.0 - launch-editor: 2.10.0 + launch-editor: 2.11.0 open: 10.2.0 p-retry: 6.2.1 schema-utils: 4.3.2 @@ -49315,7 +49333,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.100.2(@swc/core@1.13.1(@swc/helpers@0.5.17)): + webpack@5.100.2(@swc/core@1.13.2(@swc/helpers@0.5.17)): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -49339,7 +49357,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.2 tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(@swc/core@1.13.1(@swc/helpers@0.5.17))(webpack@5.100.2) + terser-webpack-plugin: 5.3.14(@swc/core@1.13.2(@swc/helpers@0.5.17))(webpack@5.100.2) watchpack: 2.4.4 webpack-sources: 3.3.3 transitivePeerDependencies: From fed1401558ca3a0b81afcba6f7da7c6390710d61 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Mon, 28 Jul 2025 18:39:40 +0530 Subject: [PATCH 241/349] Refactor AIChatAgentWizard to streamline agent creation process and remove unused state variables --- .../BI/AIChatAgent/AIChatAgentWizard.tsx | 254 +++++++++--------- 1 file changed, 130 insertions(+), 124 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx index a8ccf0929f0..9c9aeb6ac84 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx @@ -70,11 +70,8 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { const { rpcClient } = useRpcContext(); const [agentName, setAgentName] = useState(""); const [nameError, setNameError] = useState(""); - const [listenerModel, setListenerModel] = useState(undefined); const [isCreating, setIsCreating] = useState(false); const [currentStep, setCurrentStep] = useState(0); - const [agentNode, setAgentNode] = useState(null); - const [defaultModelNode, setDefaultModelNode] = useState(null); const steps = [ { label: "Creating Agent", description: "Creating the AI chat agent" }, { label: "Initializing", description: "Setting up the agent configuration" }, @@ -90,68 +87,6 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { const agentEndOfFile = useRef(null); const mainFilePath = useRef(""); - const initWizard = async () => { - // get agent file path - const filePath = await rpcClient.getVisualizerLocation(); - agentFilePath.current = Utils.joinPath(URI.file(filePath.projectUri), "agents.bal").fsPath; - // get agent org - aiModuleOrg.current = await getAiModuleOrg(rpcClient); - // fetch agent node - await fetchAgentNode(); - // get end of files - // main.bal last line - mainFilePath.current = Utils.joinPath(URI.file(filePath.projectUri), "main.bal").fsPath; - const endOfFile = await rpcClient.getBIDiagramRpcClient().getEndOfFile({ filePath: mainFilePath.current }); - console.log(">>> endOfFile", endOfFile); - agentCallEndOfFile.current = endOfFile; - // agent.bal file last line - const endOfAgentFile = await rpcClient - .getBIDiagramRpcClient() - .getEndOfFile({ filePath: agentFilePath.current }); - console.log(">>> endOfAgentFile", endOfAgentFile); - agentEndOfFile.current = endOfAgentFile; - } - - useEffect(() => { - initWizard().then(() => { - rpcClient.getServiceDesignerRpcClient().getListenerModel({ moduleName: type, orgName: aiModuleOrg.current }).then(res => { - setListenerModel(res.listener); - }); - }).catch(error => { - console.error("Error initializing AI Chat Agent Wizard:", error); - setNameError("Failed to initialize the wizard. Please try again."); - }); - }, []); - - const fetchAgentNode = async () => { - // get the agent node - const allAgents = await rpcClient.getAIAgentRpcClient().getAllAgents({ filePath: agentFilePath.current, orgName: aiModuleOrg.current }); - console.log(">>> allAgents", allAgents); - if (!allAgents.agents.length) { - console.log(">>> no agents found"); - return; - } - const agentCodeData = allAgents.agents.at(0); - // get agent node template - const agentNodeTemplate = await getNodeTemplate(rpcClient, agentCodeData, agentFilePath.current); - setAgentNode(agentNodeTemplate); - - // get all llm models - const allModels = await rpcClient - .getAIAgentRpcClient() - .getAllModels({ agent: agentCodeData.object, filePath: agentFilePath.current, orgName: aiModuleOrg.current }); - console.log(">>> allModels", allModels); - // get openai model - const defaultModel = allModels.models.find((model) => model.object === "OpenAiProvider" || (model.org === BALLERINA && model.module === AI)); - if (!defaultModel) { - console.log(">>> no default model found"); - return; - } - // get model node template - const modelNodeTemplate = await getNodeTemplate(rpcClient, defaultModel, agentFilePath.current); - setDefaultModelNode(modelNodeTemplate); - }; - const validateName = (name: string): boolean => { if (!name) { setNameError("Name is required"); @@ -175,80 +110,151 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { } setIsCreating(true); try { + // Initialize wizard data when user clicks create setCurrentStep(0); - // Update the listener name and create the listener - const listener = listenerModel; + + // get agent file path + const filePath = await rpcClient.getVisualizerLocation(); + agentFilePath.current = Utils.joinPath(URI.file(filePath.projectUri), "agents.bal").fsPath; + + // get agent org + aiModuleOrg.current = await getAiModuleOrg(rpcClient); + + // fetch agent node - get the agent node + const allAgents = await rpcClient.getAIAgentRpcClient().getAllAgents({ + filePath: agentFilePath.current, + orgName: aiModuleOrg.current + }); + console.log(">>> allAgents", allAgents); + + if (!allAgents.agents.length) { + console.log(">>> no agents found"); + throw new Error("No agents found"); + } + + const agentCodeData = allAgents.agents.at(0); + // get agent node template + const agentNodeTemplate = await getNodeTemplate(rpcClient, agentCodeData, agentFilePath.current); + const agentNode = cloneDeep(agentNodeTemplate); + + // get all llm models + const allModels = await rpcClient + .getAIAgentRpcClient() + .getAllModels({ + agent: agentCodeData.object, + filePath: agentFilePath.current, + orgName: aiModuleOrg.current + }); + console.log(">>> allModels", allModels); + + // get openai model + const defaultModel = allModels.models.find((model) => + model.object === "OpenAiProvider" || (model.org === BALLERINA && model.module === AI) + ); + if (!defaultModel) { + console.log(">>> no default model found"); + throw new Error("No default model found"); + } + + // get model node template + const modelNodeTemplate = await getNodeTemplate(rpcClient, defaultModel, agentFilePath.current); + const defaultModelNode = cloneDeep(modelNodeTemplate); + + // get end of files + // main.bal last line + mainFilePath.current = Utils.joinPath(URI.file(filePath.projectUri), "main.bal").fsPath; + const endOfFile = await rpcClient.getBIDiagramRpcClient().getEndOfFile({ filePath: mainFilePath.current }); + console.log(">>> endOfFile", endOfFile); + agentCallEndOfFile.current = endOfFile; + + // agent.bal file last line + const endOfAgentFile = await rpcClient + .getBIDiagramRpcClient() + .getEndOfFile({ filePath: agentFilePath.current }); + console.log(">>> endOfAgentFile", endOfAgentFile); + agentEndOfFile.current = endOfAgentFile; + const listenerName = agentName + "Listener"; + + // Get listener model + const listenerModelResponse = await rpcClient.getServiceDesignerRpcClient().getListenerModel({ + moduleName: type, + orgName: aiModuleOrg.current + }); + console.log(">>> listenerModelResponse", listenerModelResponse); + + const listener = listenerModelResponse.listener; + // Update the listener name and create the listener listener.properties['name'].value = listenerName; listener.properties['listenOn'].value = "check http:getDefaultListener()"; setCurrentStep(1); - // Set a timeout to show step 2 after 3 seconds - const timeoutId = setTimeout(() => { - setCurrentStep(2); - }, 3000); + await rpcClient.getServiceDesignerRpcClient().addListenerSourceCode({ filePath: "", listener }); - // Clear the timeout if the operation completed before 3 seconds - clearTimeout(timeoutId); setCurrentStep(3); // Update the service name and create the service - await rpcClient.getServiceDesignerRpcClient().getServiceModel({ + const serviceModelResponse = await rpcClient.getServiceDesignerRpcClient().getServiceModel({ filePath: "", moduleName: type, listenerName: listenerName, orgName: aiModuleOrg.current, - }).then(res => { - const serviceModel = res.service; - console.log("Service Model: ", serviceModel); - serviceModel.properties["listener"].editable = true; - serviceModel.properties["listener"].items = [listenerName]; - serviceModel.properties["listener"].values = [listenerName]; - serviceModel.properties["basePath"].value = `/${agentName}`; - rpcClient.getServiceDesignerRpcClient().addServiceSourceCode({ - filePath: "", - service: res.service - }).then(async (sourceCode) => { - setCurrentStep(4); - const newArtifact = sourceCode.artifacts.find(res => res.isNew); - console.log(">>> agent service sourceCode", sourceCode); - console.log(">>> newArtifact", newArtifact); - // save model node - const modelVarName = `_${agentName}Model`; - defaultModelNode.properties.variable.value = modelVarName; - const modelResponse = await rpcClient - .getBIDiagramRpcClient() - .getSourceCode({ filePath: agentFilePath.current, flowNode: defaultModelNode }); - console.log(">>> modelResponse getSourceCode", { modelResponse }); - - // wait 2 seconds (wait until LS is updated) - console.log(">>> wait 2 seconds"); - await new Promise((resolve) => setTimeout(resolve, 2000)); - - // save the agent node - const updatedAgentNode = cloneDeep(agentNode); - const systemPromptValue = `{role: "", instructions: string \`\`}`; - const agentVarName = `_${agentName}Agent`; - updatedAgentNode.properties.systemPrompt.value = systemPromptValue; - updatedAgentNode.properties.model.value = modelVarName; - updatedAgentNode.properties.tools.value = []; - updatedAgentNode.properties.variable.value = agentVarName; - - const agentResponse = await rpcClient - .getBIDiagramRpcClient() - .getSourceCode({ filePath: agentFilePath.current, flowNode: updatedAgentNode }); - console.log(">>> agentResponse getSourceCode", { agentResponse }); - - // wait 2 seconds (wait until LS is updated) - console.log(">>> wait 2 seconds"); - await new Promise((resolve) => setTimeout(resolve, 2000)); - if (newArtifact) { - setCurrentStep(5); - rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: { documentUri: newArtifact.path, position: newArtifact.position } }); - return; - } - }); }); + + const serviceModel = serviceModelResponse.service; + console.log("Service Model: ", serviceModel); + serviceModel.properties["listener"].editable = true; + serviceModel.properties["listener"].items = [listenerName]; + serviceModel.properties["listener"].values = [listenerName]; + serviceModel.properties["basePath"].value = `/${agentName}`; + + const sourceCode = await rpcClient.getServiceDesignerRpcClient().addServiceSourceCode({ + filePath: "", + service: serviceModelResponse.service + }); + + setCurrentStep(4); + const newArtifact = sourceCode.artifacts.find(res => res.isNew); + console.log(">>> agent service sourceCode", sourceCode); + console.log(">>> newArtifact", newArtifact); + + // save model node + const modelVarName = `_${agentName}Model`; + defaultModelNode.properties.variable.value = modelVarName; + const modelResponse = await rpcClient + .getBIDiagramRpcClient() + .getSourceCode({ filePath: agentFilePath.current, flowNode: defaultModelNode }); + console.log(">>> modelResponse getSourceCode", { modelResponse }); + + // wait 2 seconds (wait until LS is updated) + console.log(">>> wait 2 seconds"); + await new Promise((resolve) => setTimeout(resolve, 2000)); + + // save the agent node + const updatedAgentNode = cloneDeep(agentNode); + const systemPromptValue = `{role: "", instructions: string \`\`}`; + const agentVarName = `_${agentName}Agent`; + updatedAgentNode.properties.systemPrompt.value = systemPromptValue; + updatedAgentNode.properties.model.value = modelVarName; + updatedAgentNode.properties.tools.value = []; + updatedAgentNode.properties.variable.value = agentVarName; + + const agentResponse = await rpcClient + .getBIDiagramRpcClient() + .getSourceCode({ filePath: agentFilePath.current, flowNode: updatedAgentNode }); + console.log(">>> agentResponse getSourceCode", { agentResponse }); + + // wait 2 seconds (wait until LS is updated) + console.log(">>> wait 2 seconds"); + await new Promise((resolve) => setTimeout(resolve, 2000)); + + if (newArtifact) { + setCurrentStep(5); + rpcClient.getVisualizerRpcClient().openView({ + type: EVENT_TYPE.OPEN_VIEW, + location: { documentUri: newArtifact.path, position: newArtifact.position } + }); + } } catch (error) { console.error("Error creating AI Chat Agent:", error); setIsCreating(false); From f5f4e22e0e85ca10a39e8af6930ceb61781fcd60 Mon Sep 17 00:00:00 2001 From: sachiniSam Date: Mon, 28 Jul 2025 18:50:14 +0530 Subject: [PATCH 242/349] Fix form not navigating properly on save --- .../src/views/GraphQLDiagram/ObjectViewer/index.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/ObjectViewer/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/ObjectViewer/index.tsx index f4a2953f494..92dae494004 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/ObjectViewer/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/GraphQLDiagram/ObjectViewer/index.tsx @@ -267,9 +267,6 @@ export function GraphqlObjectViewer(props: GraphqlObjectViewerProps) { }); } - const serviceArtifact = artifacts.artifacts.find(artifact => artifact.name === serviceIdentifier); - // Update the state machine context to the updated service artifact - await rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.UPDATE_PROJECT_LOCATION, location: { documentUri: serviceArtifact.path, position: serviceArtifact.position } }); if (isNew) { setIsNew(false); From a0cb4431dd58511054f6f29a3018da7e225b555c Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Mon, 28 Jul 2025 14:51:39 +0530 Subject: [PATCH 243/349] Refactor error handling for `Configure default model provider` command --- .../src/features/ai/activator.ts | 23 ++++++++++++-- .../src/features/ai/constants.ts | 7 ++++- .../src/features/ai/utils.ts | 30 +++++++++---------- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts index d0eff4fdc50..321a236b04b 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts @@ -21,6 +21,10 @@ import { BallerinaExtension, ExtendedLangClient } from '../../core'; import { activateCopilotLoginCommand, resetBIAuth } from './completions'; import { addConfigFile, getConfigFilePath } from './utils'; import { StateMachine } from "../../stateMachine"; +import { CONFIGURE_DEFAULT_MODEL_COMMAND, DEFAULT_PROVIDER_ADDED, LOGIN_REQUIRED_WARNING_FOR_DEFAULT_MODEL, OPEN_AI_PANEL_COMMAND, 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'; export let langClient: ExtendedLangClient; @@ -31,10 +35,25 @@ export function activateAIFeatures(ballerinaExternalInstance: BallerinaExtension const projectPath = StateMachine.context().projectUri; - vscode.commands.registerCommand("ballerina.configureWso2DefaultModelProvider", async (...args: any[]) => { + vscode.commands.registerCommand(CONFIGURE_DEFAULT_MODEL_COMMAND, async (...args: any[]) => { const configPath = await getConfigFilePath(ballerinaExternalInstance, projectPath); if (configPath !== null) { - addConfigFile(configPath); + try { + const result = await addConfigFile(configPath); + if (result) { + vscode.window.showInformationMessage(DEFAULT_PROVIDER_ADDED); + } + } catch (error) { + if ((error as Error).message === REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE || (error as Error).message === TOKEN_REFRESH_ONLY_SUPPORTED_FOR_BI_INTEL) { + vscode.window.showWarningMessage(LOGIN_REQUIRED_WARNING_FOR_DEFAULT_MODEL, SIGN_IN_BI_COPILOT).then(selection => { + if (selection === SIGN_IN_BI_COPILOT) { + AIStateMachine.service().send(AIMachineEventType.LOGIN); + } + }); + } else { + vscode.window.showErrorMessage((error as Error).message); + } + } } }); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/constants.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/constants.ts index 78ed49ae313..cac0303deb7 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/constants.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/constants.ts @@ -17,6 +17,11 @@ */ export const CONFIG_FILE_NAME = "Config.toml"; -export const PROGRESS_BAR_MESSAGE_FROM_WSO2_DEFAULT_MODEL = "Fetching and saving access token for WSO2 default model"; +export const CONFIGURE_DEFAULT_MODEL_COMMAND = "ballerina.configureWso2DefaultModelProvider"; +export const OPEN_AI_PANEL_COMMAND = "ballerina.open.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."; 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."; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts index a662c194c99..b608b4ed2ff 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts @@ -21,10 +21,10 @@ import path from "path"; import vscode, { Uri, workspace } from 'vscode'; import { StateMachine } from "../../stateMachine"; -import { getRefreshedAccessToken, REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE, TOKEN_REFRESH_ONLY_SUPPORTED_FOR_BI_INTEL } from '../../../src/utils/ai/auth'; +import { getRefreshedAccessToken, REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE } from '../../../src/utils/ai/auth'; import { AIStateMachine } from '../../../src/views/ai-panel/aiMachine'; import { AIMachineEventType } from '@wso2/ballerina-core/lib/state-machine-types'; -import { CONFIG_FILE_NAME, ERROR_NO_BALLERINA_SOURCES, LOGIN_REQUIRED_WARNING, PROGRESS_BAR_MESSAGE_FROM_WSO2_DEFAULT_MODEL } from './constants'; +import { CONFIG_FILE_NAME, ERROR_NO_BALLERINA_SOURCES, PROGRESS_BAR_MESSAGE_FROM_WSO2_DEFAULT_MODEL } from './constants'; import { getCurrentBallerinaProjectFromContext } from '../config-generator/configGenerator'; import { BallerinaProject } from '@wso2/ballerina-core'; import { BallerinaExtension } from 'src/core'; @@ -131,15 +131,8 @@ export async function getConfigFilePath(ballerinaExtInstance: BallerinaExtension export async function getTokenForDefaultModel() { try { const token = await getRefreshedAccessToken(); - if (!token) { - vscode.window.showWarningMessage(LOGIN_REQUIRED_WARNING); - return null; - } return token; } catch (error) { - if ((error as Error).message === REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE || (error as Error).message === TOKEN_REFRESH_ONLY_SUPPORTED_FOR_BI_INTEL) { - vscode.window.showWarningMessage(LOGIN_REQUIRED_WARNING); - } throw error; } } @@ -171,7 +164,7 @@ function addOrReplaceConfigLine(lines: string[], key: string, value: string) { } function addDefaultModelConfig( - projectPath: string, token: string, backendUrl: string) { + projectPath: string, token: string, backendUrl: string): boolean { const targetTable = `[ballerina.ai.wso2ProviderConfig]`; const SERVICE_URL_KEY = 'serviceUrl'; const ACCESS_TOKEN_KEY = 'accessToken'; @@ -194,7 +187,7 @@ function addDefaultModelConfig( } fileContent += `\n${targetTable}\n${urlLine}\n${accessTokenLine}\n`; fs.writeFileSync(configFilePath, fileContent); - return; + return true; } // Table exists, update it @@ -230,10 +223,11 @@ function addDefaultModelConfig( const updatedTableContent = lines.join('\n'); fileContent = fileContent.substring(0, tableStartIndex) + updatedTableContent + fileContent.substring(tableEndIndex); fs.writeFileSync(configFilePath, fileContent); + return true; } -export async function addConfigFile(configPath: string) { - await vscode.window.withProgress( +export async function addConfigFile(configPath: string): Promise { + const progress = await vscode.window.withProgress( { location: vscode.ProgressLocation.Notification, title: PROGRESS_BAR_MESSAGE_FROM_WSO2_DEFAULT_MODEL, @@ -244,15 +238,19 @@ export async function addConfigFile(configPath: string) { const token: string | null = await getTokenForDefaultModel(); if (token === null) { AIStateMachine.service().send(AIMachineEventType.LOGOUT); - return; + throw new Error(REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE); + } + const success = addDefaultModelConfig(configPath, token, await getBackendURL()); + if (success) { + return true; } - addDefaultModelConfig(configPath, token, await getBackendURL()); } catch (error) { AIStateMachine.service().send(AIMachineEventType.LOGOUT); - return; + throw error; } } ); + return progress; } export async function isBallerinaProjectAsync(rootPath: string): Promise { From 5f1a0f74eddbfb352a6dab9a3e2a987f863245d2 Mon Sep 17 00:00:00 2001 From: sachiniSam Date: Mon, 28 Jul 2025 19:42:00 +0530 Subject: [PATCH 244/349] Fix deletion with unused imports --- .../rpc-managers/bi-diagram/rpc-manager.ts | 53 ++++++++++++++----- .../src/views/BI/ComponentDiagram/index.tsx | 3 +- 2 files changed, 40 insertions(+), 16 deletions(-) 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 4ea685866f6..6976c2f1760 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 @@ -135,6 +135,7 @@ import { DeleteConfigVariableRequestV2, DeleteConfigVariableResponseV2, LoginMethod, + Diagnostics, } from "@wso2/ballerina-core"; import * as fs from "fs"; import * as path from 'path'; @@ -163,6 +164,7 @@ import { README_FILE, createBIAutomation, createBIFunction, createBIProjectPure import { writeBallerinaFileDidOpen } from "../../utils/modification"; import { updateSourceCode } from "../../utils/source-utils"; import { getAccessToken, getLoginMethod } from "../../utils/ai/auth"; +import { checkProjectDiagnostics, removeUnusedImports } from "../ai-panel/repair-utils"; export class BiDiagramRpcManager implements BIDiagramAPI { OpenConfigTomlRequest: (params: OpenConfigTomlRequest) => Promise; @@ -1030,21 +1032,44 @@ export class BiDiagramRpcManager implements BIDiagramAPI { async deleteByComponentInfo(params: BIDeleteByComponentInfoRequest): Promise { console.log(">>> requesting bi delete node from ls by componentInfo", params); - return new Promise((resolve) => { - StateMachine.langClient() - .deleteByComponentInfo(params) - .then(async (model) => { - console.log(">>> bi delete node from ls by componentInfo", model); - await updateSourceCode({ textEdits: model.textEdits }); - resolve(model); - }) - .catch((error) => { - console.log(">>> error fetching delete node from ls by componentInfo", error); - return new Promise((resolve) => { - resolve(undefined); + const projectDiags: Diagnostics[] = await checkProjectDiagnostics(StateMachine.langClient(), StateMachine.context().projectUri); + + // Helper function to perform the actual delete operation + const performDelete = async (): Promise => { + return new Promise((resolve, reject) => { + StateMachine.langClient() + .deleteByComponentInfo(params) + .then(async (model) => { + console.log(">>> bi delete node from ls by componentInfo", model); + await updateSourceCode({ textEdits: model.textEdits }); + resolve(model); + }) + .catch((error) => { + console.log(">>> error fetching delete node from ls by componentInfo", error); + reject("Error fetching delete node from ls by componentInfo"); }); - }); - }); + }); + }; + + // If there are diagnostics, remove unused imports first, then delete component + if (projectDiags.length > 0) { + return new Promise((resolve, reject) => { + removeUnusedImports(projectDiags, StateMachine.langClient()) + .then(() => { + // After removing unused imports, proceed with component deletion + return performDelete(); + }) + .then((result) => { + resolve(result); + }) + .catch((error) => { + reject("Error during delete operation: " + error); + }); + }); + } else { + // No diagnostics, directly delete component + return performDelete(); + } } async getExpressionDiagnostics(params: ExpressionDiagnosticsRequest): Promise { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentDiagram/index.tsx index 86b2ec59646..82c37a808f7 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ComponentDiagram/index.tsx @@ -142,7 +142,6 @@ export function ComponentDiagram(props: ComponentDiagramProps) { const handleDeleteComponent = async (component: CDListener | CDService | CDAutomation | CDConnection) => { console.log(">>> delete component", component); setIsDeleting(true); - rpcClient .getBIDiagramRpcClient() .deleteByComponentInfo({ @@ -165,7 +164,7 @@ export function ComponentDiagram(props: ComponentDiagramProps) { } }) .catch((error) => { - console.error(">>> Error deleting component", error); + console.error(">>> Error deleting component", error?.message); }) .finally(() => { setIsDeleting(false); From 4fdc11c0ad730d1fe5e63ffa0d05db885d289951 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Mon, 28 Jul 2025 16:27:10 +0530 Subject: [PATCH 245/349] Add configureDefaultModelProvider method and integrate into AI Agent components --- .../src/rpc-types/ai-agent/index.ts | 1 + .../src/rpc-types/ai-agent/rpc-type.ts | 1 + .../src/rpc-managers/ai-agent/rpc-handler.ts | 2 + .../src/rpc-managers/ai-agent/rpc-manager.ts | 6 + .../src/rpc-clients/ai-agent/rpc-client.ts | 6 + .../BI/AIChatAgent/AIChatAgentWizard.tsx | 64 ++++++++- .../src/views/BI/AIChatAgent/ModelConfig.tsx | 127 +++++++++++++----- .../src/views/BI/AIChatAgent/NewAgent.tsx | 7 +- 8 files changed, 180 insertions(+), 34 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts index 1be262a1469..b8205a70249 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/index.ts @@ -29,6 +29,7 @@ export interface AIAgentAPI { getTool: (params: AIToolRequest) => Promise; getMcpTools: (params: McpToolsRequest) => Promise; genTool: (params: AIGentToolsRequest) => Promise; + configureDefaultModelProvider: () => Promise; createAIAgent: (params: AIAgentRequest) => Promise; updateAIAgentTools: (params: AIAgentToolsUpdateRequest) => Promise; updateMCPToolKit: (params: McpToolUpdateRequest) => Promise; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts index e57f06c3bae..95be606d2d5 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/rpc-type.ts @@ -31,6 +31,7 @@ export const getTools: RequestType = { method: export const getTool: RequestType = { method: `${_preFix}/getTool` }; export const getMcpTools: RequestType = { method: `${_preFix}/getMcpTools` }; export const genTool: RequestType = { method: `${_preFix}/genTool` }; +export const configureDefaultModelProvider: NotificationType = { method: `${_preFix}/configureDefaultModelProvider` }; export const createAIAgent: RequestType = { method: `${_preFix}/createAIAgent` }; export const updateAIAgentTools: RequestType = { method: `${_preFix}/updateAIAgentTools` }; export const updateMCPToolKit: NotificationType = { method: `${_preFix}/updateMCPToolKit` }; diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts index a6619a1e2c0..62217537b65 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-handler.ts @@ -26,6 +26,7 @@ import { AINodesRequest, AIToolRequest, AIToolsRequest, + configureDefaultModelProvider, createAIAgent, genTool, getAiModuleOrg, @@ -56,6 +57,7 @@ export function registerAiAgentRpcHandlers(messenger: Messenger) { messenger.onRequest(getTool, (args: AIToolRequest) => rpcManger.getTool(args)); messenger.onRequest(getMcpTools, (args: McpToolsRequest) => rpcManger.getMcpTools(args)); messenger.onRequest(genTool, (args: AIGentToolsRequest) => rpcManger.genTool(args)); + messenger.onNotification(configureDefaultModelProvider, () => rpcManger.configureDefaultModelProvider()); messenger.onRequest(createAIAgent, (args: AIAgentRequest) => rpcManger.createAIAgent(args)); messenger.onRequest(updateAIAgentTools, (args: AIAgentToolsUpdateRequest) => rpcManger.updateAIAgentTools(args)); messenger.onNotification(updateMCPToolKit, (args: McpToolUpdateRequest) => rpcManger.updateMCPToolKit(args)); diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts index 5a1fc6867f8..f858b7ac5b8 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-agent/rpc-manager.ts @@ -42,9 +42,11 @@ import { MemoryManagersResponse, NodePosition } from "@wso2/ballerina-core"; +import vscode from "vscode"; import { URI, Utils } from "vscode-uri"; import { StateMachine } from "../../stateMachine"; import { updateSourceCode } from "../../utils/source-utils"; +import { CONFIGURE_DEFAULT_MODEL_COMMAND } from "../../features/ai/constants"; interface EntryPosition { @@ -566,4 +568,8 @@ export class AiAgentRpcManager implements AIAgentAPI { } }); } + + async configureDefaultModelProvider(): Promise { + await vscode.commands.executeCommand(CONFIGURE_DEFAULT_MODEL_COMMAND); + } } diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts index 28e025127dd..dd156fc41a9 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-agent/rpc-client.ts @@ -34,6 +34,7 @@ import { AIToolResponse, AIToolsRequest, AIToolsResponse, + configureDefaultModelProvider, createAIAgent, genTool, getAiModuleOrg, @@ -98,6 +99,11 @@ export class AiAgentRpcClient implements AIAgentAPI { return this._messenger.sendRequest(genTool, HOST_EXTENSION, params); } + configureDefaultModelProvider(): Promise { + this._messenger.sendNotification(configureDefaultModelProvider, HOST_EXTENSION); + return Promise.resolve(); + } + createAIAgent(params: AIAgentRequest): Promise { return this._messenger.sendRequest(createAIAgent, HOST_EXTENSION, params); } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx index 9c9aeb6ac84..89fd6f80d26 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx @@ -29,7 +29,7 @@ import { RelativeLoader } from '../../../components/RelativeLoader'; import { FormHeader } from '../../../components/FormHeader'; import { getAiModuleOrg, getNodeTemplate } from './utils'; import { cloneDeep } from 'lodash'; -import { AI, BALLERINA } from '../../../constants'; +import { AI, BALLERINA, GET_DEFAULT_MODEL_PROVIDER } from '../../../constants'; const FORM_WIDTH = 600; @@ -199,6 +199,68 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { moduleName: type, listenerName: listenerName, orgName: aiModuleOrg.current, +<<<<<<< HEAD +======= + }).then(res => { + const serviceModel = res.service; + console.log("Service Model: ", serviceModel); + serviceModel.properties["listener"].editable = true; + serviceModel.properties["listener"].items = [listenerName]; + serviceModel.properties["listener"].values = [listenerName]; + serviceModel.properties["basePath"].value = `/${agentName}`; + rpcClient.getServiceDesignerRpcClient().addServiceSourceCode({ + filePath: "", + service: res.service + }).then(async (sourceCode) => { + setCurrentStep(4); + const newArtifact = sourceCode.artifacts.find(res => res.isNew); + console.log(">>> agent service sourceCode", sourceCode); + console.log(">>> newArtifact", newArtifact); + // save model node + const modelVarName = `_${agentName}Model`; + defaultModelNode.properties.variable.value = modelVarName; + const modelResponse = await rpcClient + .getBIDiagramRpcClient() + .getSourceCode({ filePath: agentFilePath.current, flowNode: defaultModelNode }); + console.log(">>> modelResponse getSourceCode", { modelResponse }); + + // wait 2 seconds (wait until LS is updated) + console.log(">>> wait 2 seconds"); + await new Promise((resolve) => setTimeout(resolve, 2000)); + + // save the agent node + const updatedAgentNode = cloneDeep(agentNode); + const systemPromptValue = `{role: "", instructions: string \`\`}`; + const agentVarName = `_${agentName}Agent`; + updatedAgentNode.properties.systemPrompt.value = systemPromptValue; + updatedAgentNode.properties.model.value = modelVarName; + updatedAgentNode.properties.tools.value = []; + updatedAgentNode.properties.variable.value = agentVarName; + + const agentResponse = await rpcClient + .getBIDiagramRpcClient() + .getSourceCode({ filePath: agentFilePath.current, flowNode: updatedAgentNode }); + console.log(">>> agentResponse getSourceCode", { agentResponse }); + + // If the selected model is the default WSO2 model provider, configure it + if (defaultModelNode?.codedata?.symbol === GET_DEFAULT_MODEL_PROVIDER) { + await rpcClient.getAIAgentRpcClient().configureDefaultModelProvider(); + } + const agentResponse = await rpcClient + .getBIDiagramRpcClient() + .getSourceCode({ filePath: agentFilePath.current, flowNode: updatedAgentNode }); + console.log(">>> agentResponse getSourceCode", { agentResponse }); + + // wait 2 seconds (wait until LS is updated) + console.log(">>> wait 2 seconds"); + await new Promise((resolve) => setTimeout(resolve, 2000)); + if (newArtifact) { + setCurrentStep(5); + rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: { documentUri: newArtifact.path, position: newArtifact.position } }); + return; + } + }); +>>>>>>> 80f9e657 (Add configureDefaultModelProvider method and integrate into AI Agent components) }); const serviceModel = serviceModelResponse.service; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx index 3cb8d97e001..63a2a3ece76 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/ModelConfig.tsx @@ -49,6 +49,44 @@ const Row = styled.div` margin-bottom: 16px; `; +const InfoBox = styled.div` + font-size: 13px; + color: var(--vscode-foreground); + padding: 12px; + margin-bottom: 16px; + background-color: var(--vscode-editor-inactiveSelectionBackground); + border-radius: 4px; + + strong { + font-weight: 600; + } + + .description { + font-size: 12px; + color: var(--vscode-descriptionForeground); + line-height: 1.4; + } + + .command-wrapper { + display: flex; + align-items: flex-start; + gap: 8px; + margin-bottom: 8px; + } +`; + +const CodeBlock = styled.code` + font-size: 11px; + color: var(--vscode-foreground); + font-family: var(--vscode-editor-font-family); + background-color: var(--vscode-textCodeBlock-background); + padding: 2px 4px; + border-radius: 3px; + border: 1px solid var(--vscode-widget-border); + margin-top: 6px; + display: inline-block; +`; + interface ModelConfigProps { agentCallNode: FlowNode; onSave?: (response?: UpdatedArtifactsResponse) => void; @@ -240,6 +278,12 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { .getBIDiagramRpcClient() .getSourceCode({ filePath: agentFilePath.current, flowNode: nodeTemplate }); console.log(">>> response getSourceCode with template ", { response }); + + // If the selected model is the default WSO2 model provider, configure it + if (selectedModelCodeData?.symbol === GET_DEFAULT_MODEL_PROVIDER) { + await rpcClient.getAIAgentRpcClient().configureDefaultModelProvider(); + } + onSave?.(response); setSavingForm(false); }; @@ -247,39 +291,58 @@ export function ModelConfig(props: ModelConfigProps): JSX.Element { return ( {modelsCodeData.length > 0 && ( - - (b.symbol === GET_DEFAULT_MODEL_PROVIDER ? 1 : 0) - (a.symbol === GET_DEFAULT_MODEL_PROVIDER ? 1 : 0)) - .map((model) => ({ - value: getProviderName(model), - content: model.symbol === GET_DEFAULT_MODEL_PROVIDER ? WSO2_MODEL_PROVIDER : getProviderName(model, true) - })), - ]} - label="Select Model Provider" - description={"Available Providers"} - onValueChange={(value) => { - if (value === "Select a provider...") { - return; // Skip the init option + <> + + (b.symbol === GET_DEFAULT_MODEL_PROVIDER ? 1 : 0) - (a.symbol === GET_DEFAULT_MODEL_PROVIDER ? 1 : 0)) + .map((model) => ({ + value: getProviderName(model), + content: model.symbol === GET_DEFAULT_MODEL_PROVIDER ? WSO2_MODEL_PROVIDER : getProviderName(model, true) + })), + ]} + label="Select Model Provider" + description={"Available Providers"} + onValueChange={(value) => { + if (value === "Select a provider...") { + return; // Skip the init option + } + const selectedModelCodeData = modelsCodeData.find((model) => getProviderName(model) === value); + console.log("Selected Model Code Data: ", selectedModelCodeData); + setSelectedModelCodeData(selectedModelCodeData); + fetchModelNodeTemplate(selectedModelCodeData); + }} + value={ + selectedModelCodeData + ? getProviderName(selectedModelCodeData) + : ((agentCallNode?.metadata.data as NodeMetadata)?.model?.type as string) } - const selectedModelCodeData = modelsCodeData.find((model) => getProviderName(model) === value); - console.log("Selected Model Code Data: ", selectedModelCodeData); - setSelectedModelCodeData(selectedModelCodeData); - fetchModelNodeTemplate(selectedModelCodeData); - }} - value={ - selectedModelCodeData - ? getProviderName(selectedModelCodeData) - : ((agentCallNode?.metadata.data as NodeMetadata)?.model?.type as string) - } - containerSx={{ width: "100%" }} - /> - + containerSx={{ width: "100%" }} + /> + + {selectedModelCodeData?.symbol === GET_DEFAULT_MODEL_PROVIDER && ( + + +
+ + Using the default WSO2 Model Provider will automatically add the necessary configuration values to Config.toml. + +
+
+ This can also be done using the VSCode command palette command:
+ + {">"} Ballerina: Configure default WSO2 model provider + +
+
+
+ )} + )} {loading && ( diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx index f8828428397..e0c11fd5d7c 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/NewAgent.tsx @@ -27,7 +27,7 @@ import ConfigForm from "./ConfigForm"; import { cloneDeep } from "lodash"; import { RelativeLoader } from "../../../components/RelativeLoader"; import { getAiModuleOrg, getNodeTemplate } from "./utils"; -import { AI, BALLERINA } from "../../../constants"; +import { AI, BALLERINA, GET_DEFAULT_MODEL_PROVIDER } from "../../../constants"; const Container = styled.div` padding: 16px; @@ -285,6 +285,11 @@ export function NewAgent(props: NewAgentProps): JSX.Element { .getSourceCode({ filePath: fileName, flowNode: updatedAgentCallNode }); console.log(">>> response getSourceCode with template ", { agentCallResponse }); + // If the selected model is the default WSO2 model provider, configure it + if (defaultModelNode?.codedata?.symbol === GET_DEFAULT_MODEL_PROVIDER) { + await rpcClient.getAIAgentRpcClient().configureDefaultModelProvider(); + } + onSave?.(); setSavingForm(false); }; From c11ca4e6220550867f0f05e41132e68c61f07d88 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Mon, 28 Jul 2025 16:48:11 +0530 Subject: [PATCH 246/349] Add call to invoke configure default model command in model providers form --- .../ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index 5c153563075..1c9329f2857 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -69,7 +69,7 @@ import { removeAgentNode, removeToolFromAgentNode, } from "../AIChatAgent/utils"; -import { PROVIDER_NAME_MAP } from "../../../constants"; +import { GET_DEFAULT_MODEL_PROVIDER } from "../../../constants"; const Container = styled.div` width: 100%; @@ -1036,6 +1036,10 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { .then(async (response) => { console.log(">>> Updated source code", response); if (response.artifacts.length > 0) { + // If the selected model is the default WSO2 model provider, configure it + if (updatedNode?.codedata?.symbol === GET_DEFAULT_MODEL_PROVIDER) { + await rpcClient.getAIAgentRpcClient().configureDefaultModelProvider(); + } selectedNodeRef.current = undefined; await updateCurrentArtifactLocation(response); } else { From 27e217e527c1b086c34dd592e0a89551935e2402 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Mon, 28 Jul 2025 19:48:09 +0530 Subject: [PATCH 247/349] Fix merge conflicts in AIChatWizard.tsx --- .../BI/AIChatAgent/AIChatAgentWizard.tsx | 67 ++----------------- 1 file changed, 5 insertions(+), 62 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx index 89fd6f80d26..4952ce5a22e 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIChatAgentWizard.tsx @@ -199,68 +199,6 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { moduleName: type, listenerName: listenerName, orgName: aiModuleOrg.current, -<<<<<<< HEAD -======= - }).then(res => { - const serviceModel = res.service; - console.log("Service Model: ", serviceModel); - serviceModel.properties["listener"].editable = true; - serviceModel.properties["listener"].items = [listenerName]; - serviceModel.properties["listener"].values = [listenerName]; - serviceModel.properties["basePath"].value = `/${agentName}`; - rpcClient.getServiceDesignerRpcClient().addServiceSourceCode({ - filePath: "", - service: res.service - }).then(async (sourceCode) => { - setCurrentStep(4); - const newArtifact = sourceCode.artifacts.find(res => res.isNew); - console.log(">>> agent service sourceCode", sourceCode); - console.log(">>> newArtifact", newArtifact); - // save model node - const modelVarName = `_${agentName}Model`; - defaultModelNode.properties.variable.value = modelVarName; - const modelResponse = await rpcClient - .getBIDiagramRpcClient() - .getSourceCode({ filePath: agentFilePath.current, flowNode: defaultModelNode }); - console.log(">>> modelResponse getSourceCode", { modelResponse }); - - // wait 2 seconds (wait until LS is updated) - console.log(">>> wait 2 seconds"); - await new Promise((resolve) => setTimeout(resolve, 2000)); - - // save the agent node - const updatedAgentNode = cloneDeep(agentNode); - const systemPromptValue = `{role: "", instructions: string \`\`}`; - const agentVarName = `_${agentName}Agent`; - updatedAgentNode.properties.systemPrompt.value = systemPromptValue; - updatedAgentNode.properties.model.value = modelVarName; - updatedAgentNode.properties.tools.value = []; - updatedAgentNode.properties.variable.value = agentVarName; - - const agentResponse = await rpcClient - .getBIDiagramRpcClient() - .getSourceCode({ filePath: agentFilePath.current, flowNode: updatedAgentNode }); - console.log(">>> agentResponse getSourceCode", { agentResponse }); - - // If the selected model is the default WSO2 model provider, configure it - if (defaultModelNode?.codedata?.symbol === GET_DEFAULT_MODEL_PROVIDER) { - await rpcClient.getAIAgentRpcClient().configureDefaultModelProvider(); - } - const agentResponse = await rpcClient - .getBIDiagramRpcClient() - .getSourceCode({ filePath: agentFilePath.current, flowNode: updatedAgentNode }); - console.log(">>> agentResponse getSourceCode", { agentResponse }); - - // wait 2 seconds (wait until LS is updated) - console.log(">>> wait 2 seconds"); - await new Promise((resolve) => setTimeout(resolve, 2000)); - if (newArtifact) { - setCurrentStep(5); - rpcClient.getVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, location: { documentUri: newArtifact.path, position: newArtifact.position } }); - return; - } - }); ->>>>>>> 80f9e657 (Add configureDefaultModelProvider method and integrate into AI Agent components) }); const serviceModel = serviceModelResponse.service; @@ -306,6 +244,11 @@ export function AIChatAgentWizard(props: AIChatAgentWizardProps) { .getSourceCode({ filePath: agentFilePath.current, flowNode: updatedAgentNode }); console.log(">>> agentResponse getSourceCode", { agentResponse }); + // If the selected model is the default WSO2 model provider, configure it + if (defaultModelNode?.codedata?.symbol === GET_DEFAULT_MODEL_PROVIDER) { + await rpcClient.getAIAgentRpcClient().configureDefaultModelProvider(); + } + // wait 2 seconds (wait until LS is updated) console.log(">>> wait 2 seconds"); await new Promise((resolve) => setTimeout(resolve, 2000)); From aaa7fec6b98dba1a2da6f352c76108d93ccb1931 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Mon, 28 Jul 2025 20:42:56 +0530 Subject: [PATCH 248/349] Remove hardcoded isNew flag --- .../src/views/InlineDataMapper/DataMapperView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/InlineDataMapper/DataMapperView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/InlineDataMapper/DataMapperView.tsx index d5e5c4d7e42..869721186c7 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/InlineDataMapper/DataMapperView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/InlineDataMapper/DataMapperView.tsx @@ -263,7 +263,7 @@ export function InlineDataMapperView(props: InlineDataMapperProps) { filePath, codedata: { ...viewState.codedata, - isNew: true + isNew }, index, clause, From e47c8d5a473041b13cb0808d54227a421db27b67 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Mon, 28 Jul 2025 21:59:05 +0530 Subject: [PATCH 249/349] Update connector icon logic to show WSO2 logo --- .../ballerina-visualizer/src/utils/bi.tsx | 21 ++++-- .../src/views/BI/FlowDiagram/index.tsx | 18 ++--- .../src/components/AIModelIcon/index.tsx | 21 +++++- .../src/components/ConnectorIcon/index.tsx | 13 +++- .../src/components/NodeIcon/index.tsx | 4 ++ .../AgentCallNode/AgentCallNodeWidget.tsx | 1 + .../nodes/ApiCallNode/ApiCallNodeWidget.tsx | 2 +- .../font-wso2-vscode/src/icons/bi-wso2.svg | 70 +++++++++++++++++++ 8 files changed, 125 insertions(+), 25 deletions(-) create mode 100644 workspaces/common-libs/font-wso2-vscode/src/icons/bi-wso2.svg diff --git a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx index 5c312fa94f4..08d9bcb8040 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx @@ -122,11 +122,12 @@ function convertDiagramCategoryToSidePanelCategory(category: Category, functionT // HACK: use the icon of the first item in the category const icon = category.items.at(0)?.metadata.icon; + const codedata = (category.items.at(0) as AvailableNode)?.codedata; return { title: category.metadata.label, description: category.metadata.description, - icon: , + icon: , items: items, }; } @@ -158,22 +159,30 @@ export function convertModelProviderCategoriesToSidePanelCategories(categories: const panelCategories = categories.map((category) => convertDiagramCategoryToSidePanelCategory(category)); panelCategories.forEach((category) => { category.items?.forEach((item) => { - item.icon = ; + const codedata = (item as PanelNode).metadata.codedata; + item.icon = ; }); }); return panelCategories; } export function convertVectorStoreCategoriesToSidePanelCategories(categories: Category[]): PanelCategory[] { - return categories.map((category) => convertDiagramCategoryToSidePanelCategory(category)); + const panelCategories = categories.map((category) => convertDiagramCategoryToSidePanelCategory(category)); + panelCategories.forEach((category) => { + category.items?.forEach((item) => { + const codedata = (item as PanelNode).metadata.codedata; + item.icon = ; + }); + }); + return panelCategories; } export function convertEmbeddingProviderCategoriesToSidePanelCategories(categories: Category[]): PanelCategory[] { - return categories.map((category) => convertDiagramCategoryToSidePanelCategory(category)); + return convertModelProviderCategoriesToSidePanelCategories(categories); } export function convertVectorKnowledgeBaseCategoriesToSidePanelCategories(categories: Category[]): PanelCategory[] { - return categories.map((category) => convertDiagramCategoryToSidePanelCategory(category)); + return convertModelProviderCategoriesToSidePanelCategories(categories); } export function convertNodePropertiesToFormFields( @@ -1065,7 +1074,7 @@ export function filterUnsupportedDiagnostics(diagnostics: Diagnostic[]): Diagnos /** * Check if the type is supported by the data mapper - * + * * @param type - The type to check * @returns Whether the type is supported by the data mapper */ diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index 1c9329f2857..073fc7cbe8c 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -54,6 +54,7 @@ import { convertModelProviderCategoriesToSidePanelCategories, convertVectorStoreCategoriesToSidePanelCategories, convertEmbeddingProviderCategoriesToSidePanelCategories, + convertVectorKnowledgeBaseCategoriesToSidePanelCategories, } from "../../../utils/bi"; import { NodePosition, STNode } from "@wso2/syntax-tree"; import { View, ProgressRing, ProgressIndicator, ThemeColors } from "@wso2/ui-toolkit"; @@ -246,12 +247,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { filePath: model?.fileName, }); console.log(">>> Refreshed model provider list", response); - setCategories( - convertFunctionCategoriesToSidePanelCategories( - response.categories as Category[], - FUNCTION_TYPE.REGULAR - ) - ); + setCategories(convertModelProviderCategoriesToSidePanelCategories(response.categories as Category[])); setSidePanelView(SidePanelView.MODEL_PROVIDER_LIST); setShowSidePanel(true); } catch (error) { @@ -280,10 +276,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }); console.log(">>> Refreshed vector store list", response); setCategories( - convertFunctionCategoriesToSidePanelCategories( - response.categories as Category[], - FUNCTION_TYPE.REGULAR - ) + convertVectorStoreCategoriesToSidePanelCategories(response.categories as Category[]) ); setSidePanelView(SidePanelView.VECTOR_STORE_LIST); setShowSidePanel(true); @@ -313,10 +306,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }); console.log(">>> Refreshed embedding provider list", response); setCategories( - convertFunctionCategoriesToSidePanelCategories( - response.categories as Category[], - FUNCTION_TYPE.REGULAR - ) + convertVectorKnowledgeBaseCategoriesToSidePanelCategories(response.categories as Category[]) ); setSidePanelView(SidePanelView.EMBEDDING_PROVIDER_LIST); setShowSidePanel(true); diff --git a/workspaces/ballerina/bi-diagram/src/components/AIModelIcon/index.tsx b/workspaces/ballerina/bi-diagram/src/components/AIModelIcon/index.tsx index 81084409e0b..9ab36410b4c 100644 --- a/workspaces/ballerina/bi-diagram/src/components/AIModelIcon/index.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/AIModelIcon/index.tsx @@ -24,13 +24,20 @@ import DeepseekIcon from "../../resources/icons/DeepseekIcon"; import { AnthropicIcon } from "../../resources/icons/AnthropicIcon"; import { MistralAIIcon } from "../../resources/icons/MistralAIIcon"; import { OllamaIcon } from "../../resources/icons/OllamaIcon"; +import { Icon } from "@wso2/ui-toolkit"; +import { CodeData } from "@wso2/ballerina-core"; interface AIModelIconProps { type: string; + codedata?: CodeData; } export function AIModelIcon(props: AIModelIconProps): React.ReactElement { - const { type } = props; + const { type, codedata } = props; + + if (codedata && isWso2Module(codedata)) { + return ; + } switch (type) { case "OpenAiProvider": @@ -55,3 +62,15 @@ export function AIModelIcon(props: AIModelIconProps): React.ReactElement { return ; } } + +export function isWso2Module(codedata: CodeData): boolean { + if (codedata?.module === "ai") { + if (["Wso2ModelProvider", "Wso2EmbeddingProvider"].includes(codedata.object)) { + return true; + } + if (["getDefaultModelProvider", "getDefaultEmbeddingProvider"].includes(codedata.symbol)) { + return true; + } + } + return false; +} diff --git a/workspaces/ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx b/workspaces/ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx index 29e79686001..5b8a802b524 100644 --- a/workspaces/ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx @@ -16,10 +16,9 @@ * under the License. */ -import React, { CSSProperties, useState } from "react"; +import React, { CSSProperties } from "react"; import { Icon } from "@wso2/ui-toolkit"; import { ApiIcon } from "../../resources"; -import { getAIColor, ThemeListener } from "../NodeIcon"; import OpenAiIcon from "../../resources/icons/OpenAiIcon"; import AzureOpenAiIcon from "../../resources/icons/AzureOpenAiIcon"; import AnthropicIcon from "../../resources/icons/AnthropicIcon"; @@ -27,16 +26,19 @@ import OllamaIcon from "../../resources/icons/OllamaIcon"; import MistralAIIcon from "../../resources/icons/MistralAIIcon"; import DeepseekIcon from "../../resources/icons/DeepseekIcon"; import DefaultLlmIcon from "../../resources/icons/DefaultLlmIcon"; +import { CodeData } from "@wso2/ballerina-core"; +import { isWso2Module } from "../AIModelIcon"; interface ConnectorIconProps { url?: string; fallbackIcon?: React.ReactNode; style?: CSSProperties; // Custom style for images className?: string; + codedata?: CodeData; } export function ConnectorIcon(props: ConnectorIconProps): React.ReactElement { - const { url, fallbackIcon, className, style } = props; + const { url, fallbackIcon, className, style, codedata } = props; const [imageError, setImageError] = React.useState(false); // use custom icon for http @@ -51,6 +53,11 @@ export function ConnectorIcon(props: ConnectorIconProps): React.ReactElement { return getLlmModelIcons(selectedModule); } + // use custom icon for wso2 module + if (codedata && isWso2Module(codedata)) { + return ; + } + // use custom icon for ai module if (url?.includes("ballerinax_ai_") || url?.includes("ballerina_ai")) { return ; diff --git a/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx b/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx index 4ad857c65b0..d4f122ee0dd 100644 --- a/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/NodeIcon/index.tsx @@ -222,10 +222,14 @@ const NODE_ICONS: Record> = FAIL: ({ size, color }) => , RETRY: ({ size, color }) => , AGENT_CALL: ({ size, color }) => , + MODEL_PROVIDER: ({ size, color }) => , MODEL_PROVIDERS: ({ size, color }) => , + VECTOR_KNOWLEDGE_BASE: ({ size, color }) => , VECTOR_KNOWLEDGE_BASES: ({ size, color }) => , VECTOR_KNOWLEDGE_BASE_CALL: ({ size, color }) => , + VECTOR_STORE: ({ size, color }) => , VECTOR_STORES: ({ size, color }) => , + EMBEDDING_PROVIDER: ({ size, color }) => , EMBEDDING_PROVIDERS: ({ size, color }) => , // Default case for any NodeKind not explicitly handled } as Record>; diff --git a/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx b/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx index c3a1d55c29c..8f7f880a359 100644 --- a/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/nodes/AgentCallNode/AgentCallNodeWidget.tsx @@ -733,6 +733,7 @@ export function AgentCallNodeWidget(props: AgentCallNodeWidgetProps) { url={tool.path} style={{ width: 24, height: 24, fontSize: 24 }} fallbackIcon={} + codedata={model.node?.codedata} /> )} {!tool.path && } diff --git a/workspaces/ballerina/bi-diagram/src/components/nodes/ApiCallNode/ApiCallNodeWidget.tsx b/workspaces/ballerina/bi-diagram/src/components/nodes/ApiCallNode/ApiCallNodeWidget.tsx index e8197700321..c857e43d58d 100644 --- a/workspaces/ballerina/bi-diagram/src/components/nodes/ApiCallNode/ApiCallNodeWidget.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/nodes/ApiCallNode/ApiCallNodeWidget.tsx @@ -381,7 +381,7 @@ export function ApiCallNodeWidget(props: ApiCallNodeWidgetProps) { : model.node.properties.connection.value as ReactNode} - + + + + + + + + + From 6980146ed7b6bf9fd90aedff20ecb56675ee40d6 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Mon, 28 Jul 2025 22:25:24 +0530 Subject: [PATCH 250/349] Disable delete icon in clause items --- .../DataMapper/SidePanel/QueryClauses/ClauseItem.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/DataMapper/SidePanel/QueryClauses/ClauseItem.tsx b/workspaces/ballerina/inline-data-mapper/src/components/DataMapper/SidePanel/QueryClauses/ClauseItem.tsx index bb45b8ba6fb..7d42d9cd6c9 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/DataMapper/SidePanel/QueryClauses/ClauseItem.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/DataMapper/SidePanel/QueryClauses/ClauseItem.tsx @@ -105,7 +105,13 @@ export function ClauseItem(props: ClauseItemProps) { ) : ( - + )} From d6a3abb2a48be4885b47c82fabdace72d3cea2ad Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Mon, 28 Jul 2025 22:33:27 +0530 Subject: [PATCH 251/349] Disable button when saving form in mcp server forms --- .../src/views/BI/AIChatAgent/AddMcpServer.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx index 981d226e837..e25700dc2a2 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AddMcpServer.tsx @@ -682,6 +682,7 @@ export function AddMcpServer(props: AddToolProps): JSX.Element { mcpTools={mcpTools} // Pass the handler to FormGenerator onToolsChange={handleToolsChange} + showProgressIndicator={savingForm} /> )}
From 7f2694789bc5327731d84ef9ac241b217ec92005 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Mon, 28 Jul 2025 22:36:18 +0530 Subject: [PATCH 252/349] Enhance connector icon rendering by adding WSO2 model provider icon --- .../ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/workspaces/ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx b/workspaces/ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx index 5b8a802b524..b89d190da31 100644 --- a/workspaces/ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/ConnectorIcon/index.tsx @@ -109,6 +109,8 @@ export function getLlmModelIcons(modelType: string) { case "DeepseekProvider": case "ai.deepseek": return ; + case "Wso2ModelProvider": + return ; default: return ; } From 8bdefc6cc3766dc314f6d5317382fd7371d2c350 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Mon, 28 Jul 2025 22:38:14 +0530 Subject: [PATCH 253/349] Refactor category conversion function in BIFlowDiagram to use embedding provider categories --- .../ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx index 073fc7cbe8c..26480e9ef06 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/FlowDiagram/index.tsx @@ -306,7 +306,7 @@ export function BIFlowDiagram(props: BIFlowDiagramProps) { }); console.log(">>> Refreshed embedding provider list", response); setCategories( - convertVectorKnowledgeBaseCategoriesToSidePanelCategories(response.categories as Category[]) + convertEmbeddingProviderCategoriesToSidePanelCategories(response.categories as Category[]) ); setSidePanelView(SidePanelView.EMBEDDING_PROVIDER_LIST); setShowSidePanel(true); From 278864e235c267924ab6ddb04ceb78c556769982 Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Mon, 28 Jul 2025 23:14:10 +0530 Subject: [PATCH 254/349] Uncomment the call to open all Ballerina files in the project during activation --- .../ballerina/ballerina-extension/src/features/bi/activator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/bi/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/bi/activator.ts index b58a0af51db..156b22c07b6 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/bi/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/bi/activator.ts @@ -111,7 +111,7 @@ export function activate(context: BallerinaExtension) { }); //HACK: Open all Ballerina files in the project - // openAllBallerinaFiles(context); + openAllBallerinaFiles(context); } function openAllBallerinaFiles(context: BallerinaExtension) { From bb24e95b8ed35c7e9e8ebd3c21e06abbcb2ab332 Mon Sep 17 00:00:00 2001 From: madushajg Date: Tue, 29 Jul 2025 00:29:25 +0530 Subject: [PATCH 255/349] Fix creating links from sub mappings --- .../src/components/DataMapper/DataMapper.tsx | 8 +++++--- .../src/components/Diagram/utils/node-utils.ts | 4 +++- .../src/components/Diagram/utils/port-utils.ts | 9 ++++++--- .../src/visitors/IONodeInitVisitor.ts | 11 +++++++++++ 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/DataMapper/DataMapper.tsx b/workspaces/ballerina/inline-data-mapper/src/components/DataMapper/DataMapper.tsx index 1dfb96476b4..689dc5d488d 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/DataMapper/DataMapper.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/DataMapper/DataMapper.tsx @@ -207,9 +207,10 @@ export function InlineDataMapper(props: InlineDataMapperProps) { const ioNodeInitVisitor = new IONodeInitVisitor(context); traverseNode(model, ioNodeInitVisitor); - const ioNodes = ioNodeInitVisitor.getNodes(); + const inputNodes = ioNodeInitVisitor.getInputNodes(); + const outputNode = ioNodeInitVisitor.getOutputNode(); - const hasInputNodes = !ioNodes.some(node => node instanceof EmptyInputsNode); + const hasInputNodes = !inputNodes.some(node => node instanceof EmptyInputsNode); let subMappingNode: DataMapperNodeModel; if (hasInputNodes) { const subMappingNodeInitVisitor = new SubMappingNodeInitVisitor(context); @@ -224,8 +225,9 @@ export function InlineDataMapper(props: InlineDataMapperProps) { traverseNode(model, intermediateNodeInitVisitor); setNodes([ - ...ioNodes, + ...inputNodes, ...(subMappingNode ? [subMappingNode] : []), + outputNode, ...intermediateNodeInitVisitor.getNodes() ]); } catch (error) { diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/node-utils.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/node-utils.ts index 132eedfd446..464895f4f01 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/node-utils.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/node-utils.ts @@ -16,7 +16,7 @@ * under the License. */ import { DataMapperNodeModel } from "../Node/commons/DataMapperNode"; -import { InputNode } from "../Node"; +import { InputNode, SubMappingNode } from "../Node"; export function findInputNode(field: string, outputNode: DataMapperNodeModel, focusedField?: string): InputNode { const nodes = outputNode.getModel().getNodes(); @@ -27,6 +27,8 @@ export function findInputNode(field: string, outputNode: DataMapperNodeModel, fo return nodes.find(node => { if (node instanceof InputNode) { return node.inputType.id === mappingStartsWith; + } else if (node instanceof SubMappingNode) { + return node.subMappings.some(subMapping => subMapping.name === mappingStartsWith); } }) as InputNode | undefined; }; diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/port-utils.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/port-utils.ts index 12b4f52e881..53e8a9e8186 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/port-utils.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/port-utils.ts @@ -17,14 +17,17 @@ */ import { NodeModel } from "@projectstorm/react-diagrams"; -import { InputNode, ObjectOutputNode, QueryOutputNode } from "../Node"; +import { InputNode, ObjectOutputNode, QueryOutputNode, SubMappingNode } from "../Node"; import { InputOutputPortModel } from "../Port"; -import { ARRAY_OUTPUT_TARGET_PORT_PREFIX, OBJECT_OUTPUT_TARGET_PORT_PREFIX, PRIMITIVE_OUTPUT_TARGET_PORT_PREFIX, QUERY_OUTPUT_TARGET_PORT_PREFIX } from "./constants"; +import { ARRAY_OUTPUT_TARGET_PORT_PREFIX, OBJECT_OUTPUT_TARGET_PORT_PREFIX, PRIMITIVE_OUTPUT_TARGET_PORT_PREFIX, QUERY_OUTPUT_TARGET_PORT_PREFIX, SUB_MAPPING_INPUT_SOURCE_PORT_PREFIX } from "./constants"; import { ArrayOutputNode } from "../Node/ArrayOutput/ArrayOutputNode"; import { PrimitiveOutputNode } from "../Node/PrimitiveOutput/PrimitiveOutputNode"; export function getInputPort(node: InputNode, inputField: string): InputOutputPortModel { - let port = node.getPort(`${inputField}.OUT`) as InputOutputPortModel; + const portId = node instanceof SubMappingNode + ? `${SUB_MAPPING_INPUT_SOURCE_PORT_PREFIX}.${inputField}.OUT` + : `${inputField}.OUT`; + let port = node.getPort(portId) as InputOutputPortModel; while (port && port.attributes.hidden) { port = port.attributes.parentModel; diff --git a/workspaces/ballerina/inline-data-mapper/src/visitors/IONodeInitVisitor.ts b/workspaces/ballerina/inline-data-mapper/src/visitors/IONodeInitVisitor.ts index d2d37003797..5d1282c4382 100644 --- a/workspaces/ballerina/inline-data-mapper/src/visitors/IONodeInitVisitor.ts +++ b/workspaces/ballerina/inline-data-mapper/src/visitors/IONodeInitVisitor.ts @@ -60,4 +60,15 @@ export class IONodeInitVisitor implements BaseVisitor { } return [...this.inputNodes, this.outputNode]; } + + getInputNodes() { + if (this.inputNodes.length === 0) { + this.inputNodes.push(new EmptyInputsNode()); + } + return this.inputNodes; + } + + getOutputNode() { + return this.outputNode; + } } From f02d9e3d8e5d556783f856a86a44f0668fcff376 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Tue, 29 Jul 2025 00:46:00 +0530 Subject: [PATCH 256/349] Refactor icon assignment logic in BI utility functions to handle cases with missing codedata. --- .../ballerina-visualizer/src/utils/bi.tsx | 19 ++++++++++++++----- .../Forms/VectorKnowledgeBaseForm/index.tsx | 3 --- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx index 08d9bcb8040..545f3bdc6b3 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx @@ -46,7 +46,6 @@ import { Item, FunctionKind, functionKinds, - TRIGGER_CHARACTERS, Diagnostic, FUNCTION_TYPE, FunctionNode, @@ -159,8 +158,13 @@ export function convertModelProviderCategoriesToSidePanelCategories(categories: const panelCategories = categories.map((category) => convertDiagramCategoryToSidePanelCategory(category)); panelCategories.forEach((category) => { category.items?.forEach((item) => { - const codedata = (item as PanelNode).metadata.codedata; - item.icon = ; + if ((item as PanelNode).metadata?.codedata) { + const codedata = (item as PanelNode).metadata.codedata; + item.icon = ; + } else if (((item as PanelCategory).items.at(0) as PanelNode)?.metadata?.codedata) { + const codedata = ((item as PanelCategory).items.at(0) as PanelNode)?.metadata.codedata; + item.icon = ; + } }); }); return panelCategories; @@ -170,8 +174,13 @@ export function convertVectorStoreCategoriesToSidePanelCategories(categories: Ca const panelCategories = categories.map((category) => convertDiagramCategoryToSidePanelCategory(category)); panelCategories.forEach((category) => { category.items?.forEach((item) => { - const codedata = (item as PanelNode).metadata.codedata; - item.icon = ; + if ((item as PanelNode).metadata?.codedata) { + const codedata = (item as PanelNode).metadata.codedata; + item.icon = ; + } else if (((item as PanelCategory).items.at(0) as PanelNode)?.metadata?.codedata) { + const codedata = ((item as PanelCategory).items.at(0) as PanelNode)?.metadata.codedata; + item.icon = ; + } }); }); return panelCategories; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/VectorKnowledgeBaseForm/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/VectorKnowledgeBaseForm/index.tsx index ee03e2d9aa0..c654935848a 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/VectorKnowledgeBaseForm/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/VectorKnowledgeBaseForm/index.tsx @@ -800,7 +800,6 @@ export function VectorKnowledgeBaseForm(props: VectorKnowledgeBaseFormProps) { nestedForm={true} compact={true} onChange={(fieldKey, value, allValues) => { - console.log(">>> Vector Store form change", { fieldKey, value, allValues }); setVectorStoreFormValues(allValues); }} /> @@ -837,7 +836,6 @@ export function VectorKnowledgeBaseForm(props: VectorKnowledgeBaseFormProps) { nestedForm={true} compact={true} onChange={(fieldKey, value, allValues) => { - console.log(">>> Embedding Provider form change", { fieldKey, value, allValues }); setEmbeddingProviderFormValues(allValues); }} /> @@ -863,7 +861,6 @@ export function VectorKnowledgeBaseForm(props: VectorKnowledgeBaseFormProps) { nestedForm={true} compact={true} onChange={(fieldKey, value, allValues) => { - console.log(">>> Knowledge Base form change", { fieldKey, value, allValues }); setKnowledgeBaseFormValues(allValues); }} /> From 634fa2814f2ba36a481009b53cde4d2586ae528b Mon Sep 17 00:00:00 2001 From: tharindulak Date: Tue, 29 Jul 2025 10:08:20 +0530 Subject: [PATCH 257/349] Add trivy git action --- .github/workflows/build.yml | 50 ++++++++----------------------------- 1 file changed, 10 insertions(+), 40 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f7e1b39345c..cbcddc64781 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -143,47 +143,7 @@ jobs: echo "MI Tests: ${{ steps.diff.outputs.hasMIDiff }}" echo "runMIExtTests=${{ steps.diff.outputs.hasMIDiff }}" >> $GITHUB_OUTPUT - - name: Install Trivy - run: | - sudo apt-get update - sudo apt-get install wget apt-transport-https gnupg lsb-release - wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo gpg --dearmor -o /usr/share/keyrings/trivy.gpg - echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list - sudo apt-get update - sudo apt-get install trivy - - - name: Security vulnerability scan - id: security-scan - run: | - echo "🔍 Running security vulnerability scan..." - trivy clean --all - echo "🔄 Downloading latest vulnerability database..." - trivy image --download-db-only alpine:latest || true - echo "🔍 Starting filesystem scan (matching local command exactly)..." - - # Run Trivy and capture output - TRIVY_OUTPUT=$(trivy fs . --timeout 10m --skip-dirs common/temp --format table) - echo "$TRIVY_OUTPUT" - - # Check if vulnerabilities were found (look for "Total:" line with non-zero counts) - if echo "$TRIVY_OUTPUT" | grep -q "Total:.*[1-9]"; then - echo "❌ Security vulnerabilities detected!" - echo "vulnerabilities_found=true" >> $GITHUB_OUTPUT - else - echo "✅ No security vulnerabilities found." - echo "vulnerabilities_found=false" >> $GITHUB_OUTPUT - fi - - - name: Security scan failure reporting - if: steps.security-scan.outputs.vulnerabilities_found == 'true' - run: | - echo "❌ Security vulnerabilities detected!" - echo "Please review the vulnerability report above and address the issues." - echo "Build failed due to security vulnerabilities." - exit 1 - - name: Build - if: steps.security-scan.outputs.vulnerabilities_found == 'false' uses: ./.github/actions/build with: isPreRelease: ${{ inputs.isPreRelease }} @@ -207,6 +167,16 @@ jobs: PLATFORM_DEV_GHAPP_CLIENT_ID: ${{ secrets.PLATFORM_DEV_GHAPP_CLIENT_ID }} PLATFORM_DEV_DEVANT_ASGARDEO_CLIENT_ID: ${{ secrets.PLATFORM_DEV_DEVANT_ASGARDEO_CLIENT_ID }} + - name: Run Trivy vulnerability scanner + uses: aquasecurity/trivy-action@0.28.0 + with: + scan-type: 'fs' + scan-ref: '.' + format: 'table' + exit-code: '1' + timeout: '10m' + skip-dirs: 'common/temp' + ExtTest_Ballerina: name: Run Ballerina extension tests needs: Build_Stage From b8fea39f166e565b95a535f041ab588af1b5e5b6 Mon Sep 17 00:00:00 2001 From: tharindulak Date: Tue, 29 Jul 2025 13:01:20 +0530 Subject: [PATCH 258/349] Fix @eslint/plugin-kit vulnerability --- .github/workflows/build.yml | 1 + common/config/rush/.pnpmfile.cjs | 4 +- common/config/rush/common-versions.json | 2 +- common/config/rush/pnpm-lock.yaml | 1607 ++++++++--------- common/config/rush/repo-state.json | 2 +- package.json | 2 +- pnpm-lock.yaml | 10 +- .../common-libs/ui-toolkit/package.json | 1 - 8 files changed, 808 insertions(+), 821 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cbcddc64781..4be0de7f815 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -173,6 +173,7 @@ jobs: scan-type: 'fs' scan-ref: '.' format: 'table' + ignore-unfixed: true exit-code: '1' timeout: '10m' skip-dirs: 'common/temp' diff --git a/common/config/rush/.pnpmfile.cjs b/common/config/rush/.pnpmfile.cjs index f83cfef864f..60edcb80b49 100644 --- a/common/config/rush/.pnpmfile.cjs +++ b/common/config/rush/.pnpmfile.cjs @@ -49,7 +49,7 @@ module.exports = { pkg.dependencies['xmldom'] = 'npm:@xmldom/xmldom@^0.8.10'; } if (pkg.dependencies['@eslint/plugin-kit']) { - pkg.dependencies['@eslint/plugin-kit'] = '^0.3.3'; + pkg.dependencies['@eslint/plugin-kit'] = '^0.3.4'; } if (pkg.dependencies['on-headers']) { pkg.dependencies['on-headers'] = '^1.1.0'; @@ -89,7 +89,7 @@ module.exports = { pkg.devDependencies['xmldom'] = 'npm:@xmldom/xmldom@^0.8.10'; } if (pkg.devDependencies['@eslint/plugin-kit']) { - pkg.devDependencies['@eslint/plugin-kit'] = '^0.3.3'; + pkg.devDependencies['@eslint/plugin-kit'] = '^0.3.4'; } if (pkg.devDependencies['on-headers']) { pkg.devDependencies['on-headers'] = '^1.1.0'; diff --git a/common/config/rush/common-versions.json b/common/config/rush/common-versions.json index 11be3b08058..e218fcd4819 100644 --- a/common/config/rush/common-versions.json +++ b/common/config/rush/common-versions.json @@ -25,7 +25,7 @@ */ // "some-library": "1.2.3" "webpack": "^5.56.0", - "@eslint/plugin-kit": "^0.3.3", + "@eslint/plugin-kit": "^0.3.4", "on-headers": "^1.1.0", "form-data": "^4.0.4" }, diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 01ab6efa226..caae29d7437 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -20,7 +20,7 @@ importers: version: 10.0.10 '@types/node': specifier: ^18.11.19 - version: 18.19.120 + version: 18.19.121 '@types/vscode': specifier: ^1.63.0 version: 1.102.0 @@ -253,7 +253,7 @@ importers: version: 10.0.10 '@types/node': specifier: ^18.18.7 - version: 18.19.120 + version: 18.19.121 '@types/tcp-port-used': specifier: ^1.0.3 version: 1.0.4 @@ -316,7 +316,7 @@ importers: version: 1.0.2 ts-loader: specifier: ^9.5.0 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) + version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) tslint: specifier: ^6.1.3 version: 6.1.3(typescript@5.8.3) @@ -331,13 +331,13 @@ importers: version: 5.10.0(mocha@10.8.2)(typescript@5.8.3) webpack: specifier: ^5.94.0 - version: 5.100.2(webpack-cli@6.0.1) + version: 5.101.0(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.100.2) + version: 6.0.1(webpack@5.101.0) webpack-merge-and-include-globally: specifier: ^2.3.4 - version: 2.3.4(webpack@5.100.2) + version: 2.3.4(webpack@5.101.0) yarn: specifier: ^1.22.19 version: 1.22.22 @@ -440,7 +440,7 @@ importers: 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(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(eslint@9.27.0(jiti@2.5.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.100.2) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(eslint@9.27.0(jiti@2.5.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.101.0) '@storybook/addon-links': specifier: ^6.5.16 version: 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -485,25 +485,25 @@ importers: version: 5.28.5(webpack-cli@6.0.1) babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.100.2) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.101.0) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.100.2) + version: 13.0.0(webpack@5.101.0) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.100.2) + version: 7.1.2(webpack@5.101.0) express: specifier: ^5.1.0 version: 5.1.0 file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.100.2) + version: 6.2.0(webpack@5.101.0) fork-ts-checker-webpack-plugin: specifier: ^9.1.0 - version: 9.1.0(typescript@5.8.3)(webpack@5.100.2) + version: 9.1.0(typescript@5.8.3)(webpack@5.101.0) glob: specifier: ^11.0.2 version: 11.0.3 @@ -512,7 +512,7 @@ importers: 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)(webpack-cli@6.0.1) react-test-renderer: specifier: ^19.1.0 - version: 19.1.0(react@18.2.0) + version: 19.1.1(react@18.2.0) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -542,13 +542,13 @@ importers: version: 1.89.2 sass-loader: specifier: ^16.0.5 - version: 16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.100.2) + version: 16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.101.0) storybook: specifier: ^8.6.14 version: 8.6.14(prettier@3.5.3) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.100.2) + version: 4.0.0(webpack@5.101.0) stylelint: specifier: ^16.19.1 version: 16.22.0(typescript@5.8.3) @@ -557,10 +557,10 @@ importers: version: 38.0.0(stylelint@16.22.0(typescript@5.8.3)) svg-url-loader: specifier: ^8.0.0 - version: 8.0.0(webpack@5.100.2) + version: 8.0.0(webpack@5.101.0) ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) + version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) tslib: specifier: ^2.8.1 version: 2.8.1 @@ -578,13 +578,13 @@ importers: version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.100.2(webpack-cli@6.0.1) + version: 5.101.0(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2) + version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.0) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) + version: 5.2.2(webpack-cli@6.0.1)(webpack@5.101.0) ../../workspaces/ballerina/ballerina-rpc-client: dependencies: @@ -679,7 +679,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.101.0))(webpack-hot-middleware@2.26.1) '@types/lodash': specifier: ~4.17.16 version: 4.17.17 @@ -869,7 +869,7 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.100.2) + version: 7.1.2(webpack@5.101.0) eslint: specifier: ^9.26.0 version: 9.27.0(jiti@2.5.1) @@ -881,25 +881,25 @@ importers: version: 0.4.20(eslint@9.27.0(jiti@2.5.1)) sass-loader: specifier: ^16.0.5 - version: 16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.100.2) + version: 16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.101.0) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.100.2) + version: 5.0.0(webpack@5.101.0) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.100.2) + version: 4.0.0(webpack@5.101.0) ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) + version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.100.2(webpack-cli@5.1.4) + version: 5.101.0(webpack-cli@5.1.4) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@5.1.4)(webpack@5.100.2) + version: 5.2.2(webpack-cli@5.1.4)(webpack@5.101.0) ../../workspaces/ballerina/bi-diagram: dependencies: @@ -951,7 +951,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.101.0))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -1021,7 +1021,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.101.0))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -1205,19 +1205,19 @@ importers: version: 4.7.0(vite@6.3.5(@types/node@22.15.35)(jiti@2.5.1)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.100.2) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.101.0) babel-plugin-transform-typescript-metadata: specifier: ^0.3.2 version: 0.3.2 copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.100.2) + version: 13.0.0(webpack@5.101.0) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.100.2) + version: 7.1.2(webpack@5.101.0) dagre: specifier: ^0.8.5 version: 0.8.5 @@ -1232,13 +1232,13 @@ importers: version: 0.4.20(eslint@9.27.0(jiti@2.5.1)) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.100.2) + version: 6.2.0(webpack@5.101.0) fork-ts-checker-webpack-plugin: specifier: ^9.1.0 - version: 9.1.0(typescript@5.8.3)(webpack@5.100.2) + version: 9.1.0(typescript@5.8.3)(webpack@5.101.0) monaco-editor-webpack-plugin: specifier: ^7.1.0 - version: 7.1.0(monaco-editor@0.52.2)(webpack@5.100.2) + version: 7.1.0(monaco-editor@0.52.2)(webpack@5.101.0) mousetrap: specifier: ^1.6.5 version: 1.6.5 @@ -1253,7 +1253,7 @@ importers: 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)(webpack-cli@6.0.1) react-test-renderer: specifier: ^19.1.0 - version: 19.1.0(react@18.2.0) + version: 19.1.1(react@18.2.0) rimraf: specifier: ^6.0.1 version: 6.0.1 @@ -1283,13 +1283,13 @@ importers: version: 1.89.2 sass-loader: specifier: ^16.0.5 - version: 16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.100.2) + version: 16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.101.0) storybook: specifier: ^8.6.14 version: 8.6.14(prettier@3.5.3) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.100.2) + version: 4.0.0(webpack@5.101.0) stylelint: specifier: ^16.19.1 version: 16.22.0(typescript@5.8.3) @@ -1298,10 +1298,10 @@ importers: version: 38.0.0(stylelint@16.22.0(typescript@5.8.3)) svg-url-loader: specifier: ^8.0.0 - version: 8.0.0(webpack@5.100.2) + version: 8.0.0(webpack@5.101.0) ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) + version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) tslib: specifier: ^2.8.1 version: 2.8.1 @@ -1325,13 +1325,13 @@ importers: version: 3.1.0 webpack: specifier: ^5.94.0 - version: 5.100.2(webpack-cli@6.0.1) + version: 5.101.0(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2) + version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.0) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) + version: 5.2.2(webpack-cli@6.0.1)(webpack@5.101.0) ../../workspaces/ballerina/graphql: dependencies: @@ -1359,7 +1359,7 @@ 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.5.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.5.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.100.2) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.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.5.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.101.0) '@storybook/addon-links': specifier: ^6.5.9 version: 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -1380,34 +1380,34 @@ importers: version: 18.2.0 babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.100.2) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.101.0) css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.100.2) + version: 7.1.2(webpack@5.101.0) graphql: specifier: ^16.11.0 version: 16.11.0 mini-css-extract-plugin: specifier: ^2.9.2 - version: 2.9.2(webpack@5.100.2) + version: 2.9.2(webpack@5.101.0) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.100.2) + version: 5.0.0(webpack@5.101.0) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.100.2) + version: 4.0.0(webpack@5.101.0) ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) + version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.100.2(webpack-cli@4.10.0) + version: 5.101.0(webpack-cli@4.10.0) webpack-cli: specifier: ^4.10.0 - version: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.100.2) + version: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.101.0) ../../workspaces/ballerina/graphql-design-diagram: dependencies: @@ -1589,7 +1589,7 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.100.2) + version: 7.1.2(webpack@5.101.0) eslint: specifier: ^9.26.0 version: 9.27.0(jiti@2.5.1) @@ -1601,13 +1601,13 @@ importers: version: 0.4.20(eslint@9.27.0(jiti@2.5.1)) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.100.2) + version: 6.2.0(webpack@5.101.0) react-hook-form: specifier: ~7.56.3 version: 7.56.4(react@18.2.0) ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) + version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) tslib: specifier: ^2.8.1 version: 2.8.1 @@ -1722,7 +1722,7 @@ importers: version: 0.8.5 file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.100.2) + version: 6.2.0(webpack@5.101.0) html-to-image: specifier: ^1.10.8 version: 1.11.11 @@ -1765,31 +1765,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.100.2) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.101.0) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.100.2) + version: 7.1.2(webpack@5.101.0) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.100.2) + version: 5.0.0(webpack@5.101.0) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.100.2) + version: 4.0.0(webpack@5.101.0) ts-loader: specifier: ^9.4.1 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) + version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) webpack: specifier: ^5.94.0 - version: 5.100.2(webpack-cli@6.0.1) + version: 5.101.0(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2) + version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.0) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) + version: 5.2.2(webpack-cli@6.0.1)(webpack@5.101.0) ../../workspaces/ballerina/record-creator: dependencies: @@ -1926,7 +1926,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.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.100.2))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.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.101.0))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -2026,7 +2026,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.5.9 - version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.101.0))(webpack-hot-middleware@2.26.1) '@types/classnames': specifier: ^2.2.9 version: 2.3.4 @@ -2134,7 +2134,7 @@ importers: version: 0.8.5 file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.100.2) + version: 6.2.0(webpack@5.101.0) html-to-image: specifier: ^1.11.11 version: 1.11.11 @@ -2183,31 +2183,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.100.2) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.101.0) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.100.2) + version: 7.1.2(webpack@5.101.0) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.100.2) + version: 5.0.0(webpack@5.101.0) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.100.2) + version: 4.0.0(webpack@5.101.0) ts-loader: specifier: ^9.4.1 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) + version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) webpack: specifier: ^5.94.0 - version: 5.100.2(webpack-cli@6.0.1) + version: 5.101.0(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2) + version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.0) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) + version: 5.2.2(webpack-cli@6.0.1)(webpack@5.101.0) ../../workspaces/ballerina/type-editor: dependencies: @@ -2338,7 +2338,7 @@ importers: version: link:../../common-libs/playwright-vscode-tester copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.100.2) + version: 13.0.0(webpack@5.101.0) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -2356,16 +2356,16 @@ importers: version: 0.5.21 ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) + version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.100.2(webpack-cli@6.0.1) + version: 5.101.0(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.100.2) + version: 6.0.1(webpack@5.101.0) webpack-permissions-plugin: specifier: ^1.0.9 version: 1.0.10 @@ -2487,7 +2487,7 @@ importers: version: 1.9.0 copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.100.2) + version: 13.0.0(webpack@5.101.0) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -2499,10 +2499,10 @@ importers: version: 11.7.1 terser-webpack-plugin: specifier: ^5.3.10 - version: 5.3.14(webpack@5.100.2) + version: 5.3.14(webpack@5.101.0) ts-loader: specifier: ~9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) + version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) typescript: specifier: 5.8.3 version: 5.8.3 @@ -2511,10 +2511,10 @@ importers: version: 8.14.1(mocha@11.7.1)(typescript@5.8.3) webpack: specifier: ^5.94.0 - version: 5.100.2(webpack-cli@6.0.1) + version: 5.101.0(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.100.2) + version: 6.0.1(webpack@5.101.0) webpack-permissions-plugin: specifier: ^1.0.9 version: 1.0.10 @@ -2629,10 +2629,10 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.100.2) + version: 7.1.2(webpack@5.101.0) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.100.2) + version: 6.2.0(webpack@5.101.0) node-sass: specifier: ^9.0.0 version: 9.0.0 @@ -2644,34 +2644,34 @@ importers: version: 8.5.6 postcss-loader: specifier: ^8.1.1 - version: 8.1.1(postcss@8.5.6)(typescript@5.8.3)(webpack@5.100.2) + version: 8.1.1(postcss@8.5.6)(typescript@5.8.3)(webpack@5.101.0) sass-loader: specifier: ^16.0.5 - version: 16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.100.2) + version: 16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.101.0) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.100.2) + version: 5.0.0(webpack@5.101.0) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.100.2) + version: 4.0.0(webpack@5.101.0) tailwindcss: specifier: ^3.4.3 version: 3.4.17 ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) + version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.100.2(webpack-cli@6.0.1) + version: 5.101.0(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2) + version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.0) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) + version: 5.2.2(webpack-cli@6.0.1)(webpack@5.101.0) ../../workspaces/common-libs/font-wso2-vscode: devDependencies: @@ -2781,7 +2781,7 @@ importers: 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.28.0)(@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-dev-server@5.2.2(webpack@5.100.2))(webpack-hot-middleware@2.26.1) + version: 7.4.6(@babel/core@7.28.0)(@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-dev-server@5.2.2(webpack@5.101.0))(webpack-hot-middleware@2.26.1) '@types/react': specifier: 18.2.0 version: 18.2.0 @@ -2851,9 +2851,6 @@ importers: '@wso2/font-wso2-vscode': specifier: workspace:* version: link:../font-wso2-vscode - axios: - specifier: 0.21.0 - version: 0.21.0 classnames: specifier: ^2.5.1 version: 2.5.1 @@ -2981,7 +2978,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.101.0))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -3142,7 +3139,7 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.100.2) + version: 7.1.2(webpack@5.101.0) eslint: specifier: ^9.27.0 version: 9.27.0(jiti@2.5.1) @@ -3154,13 +3151,13 @@ importers: version: 0.4.20(eslint@9.27.0(jiti@2.5.1)) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.100.2) + version: 6.2.0(webpack@5.101.0) react-hook-form: specifier: 7.56.4 version: 7.56.4(react@18.2.0) ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) + version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) ts-morph: specifier: ^22.0.0 version: 22.0.0 @@ -3379,7 +3376,7 @@ importers: version: 29.7.0 react-test-renderer: specifier: ~19.1.0 - version: 19.1.0(react@18.2.0) + version: 19.1.1(react@18.2.0) storybook: specifier: ^8.6.14 version: 8.6.14(prettier@3.5.3) @@ -3499,7 +3496,7 @@ importers: version: 3.3.2 node-loader: specifier: ~2.1.0 - version: 2.1.0(webpack@5.100.2) + version: 2.1.0(webpack@5.101.0) portfinder: specifier: ^1.0.37 version: 1.0.37 @@ -3602,7 +3599,7 @@ importers: version: 6.0.1 ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) + version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) ts-morph: specifier: ^26.0.0 version: 26.0.0 @@ -3611,10 +3608,10 @@ importers: version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.100.2(webpack-cli@4.10.0) + version: 5.101.0(webpack-cli@4.10.0) webpack-cli: specifier: ^4.10.0 - version: 4.10.0(webpack@5.100.2) + version: 4.10.0(webpack@5.101.0) yaml: specifier: ~2.8.0 version: 2.8.0 @@ -3690,7 +3687,7 @@ importers: version: 1.52.0 '@pmmmwh/react-refresh-webpack-plugin': specifier: ~0.6.0 - version: 0.6.1(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.17.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.100.2) + version: 0.6.1(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.17.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.101.0) '@tanstack/query-core': specifier: ^5.76.0 version: 5.83.0 @@ -3847,19 +3844,19 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.100.2) + version: 7.1.2(webpack@5.101.0) sass-loader: specifier: ^16.0.5 - version: 16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.100.2) + version: 16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.101.0) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.100.2) + version: 5.0.0(webpack@5.101.0) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.100.2) + version: 4.0.0(webpack@5.101.0) ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) + version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) typescript: specifier: 5.8.3 version: 5.8.3 @@ -3868,13 +3865,13 @@ importers: version: 3.17.5 webpack: specifier: ^5.94.0 - version: 5.100.2(webpack-cli@5.1.4) + version: 5.101.0(webpack-cli@5.1.4) webpack-cli: specifier: ~5.1.4 - version: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.100.2) + version: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.101.0) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@5.1.4)(webpack@5.100.2) + version: 5.2.2(webpack-cli@5.1.4)(webpack@5.101.0) yaml: specifier: ~2.8.0 version: 2.8.0 @@ -3948,7 +3945,7 @@ importers: dependencies: '@aws-sdk/client-s3': specifier: ^3.817.0 - version: 3.850.0 + version: 3.855.0 '@vscode-logging/logger': specifier: ^2.0.0 version: 2.0.0 @@ -4045,7 +4042,7 @@ importers: version: 1.9.0 copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.0(webpack@5.100.2) + version: 13.0.0(webpack@5.101.0) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -4057,10 +4054,10 @@ importers: version: 11.7.1 terser-webpack-plugin: specifier: ^5.3.14 - version: 5.3.14(webpack@5.100.2) + version: 5.3.14(webpack@5.101.0) ts-loader: specifier: ~9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) + version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -4069,10 +4066,10 @@ importers: version: 8.14.1(mocha@11.7.1)(typescript@5.8.3) webpack: specifier: ^5.94.0 - version: 5.100.2(webpack-cli@6.0.1) + version: 5.101.0(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.100.2) + version: 6.0.1(webpack@5.101.0) webpack-permissions-plugin: specifier: ^1.0.10 version: 1.0.10 @@ -4184,10 +4181,10 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.100.2) + version: 7.1.2(webpack@5.101.0) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.100.2) + version: 6.2.0(webpack@5.101.0) node-sass: specifier: ^9.0.0 version: 9.0.0 @@ -4199,34 +4196,34 @@ importers: version: 8.5.6 postcss-loader: specifier: ^8.1.1 - version: 8.1.1(postcss@8.5.6)(typescript@5.8.3)(webpack@5.100.2) + version: 8.1.1(postcss@8.5.6)(typescript@5.8.3)(webpack@5.101.0) sass-loader: specifier: ^16.0.5 - version: 16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.100.2) + version: 16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.101.0) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.100.2) + version: 5.0.0(webpack@5.101.0) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.100.2) + version: 4.0.0(webpack@5.101.0) tailwindcss: specifier: ^4.1.7 version: 4.1.11 ts-loader: specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) + version: 9.5.2(typescript@5.8.3)(webpack@5.101.0) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.100.2(webpack-cli@6.0.1) + version: 5.101.0(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2) + version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.0) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) + version: 5.2.2(webpack-cli@6.0.1)(webpack@5.101.0) packages: @@ -4310,44 +4307,44 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.850.0': - resolution: {integrity: sha512-tX5bUfqiLOh6jtAlaiAuOUKFYh8KDG9k9zFLUdgGplC5TP47AYTreUEg+deCTHo4DD3YCvrLuyZ8tIDgKu7neQ==} + '@aws-sdk/client-s3@3.855.0': + resolution: {integrity: sha512-f8EP7ia+5LwrCLT/Etsw0LmZZMcz5kyBBK+96IJAKj3JNTB9zViGMDzasAwt/Vdo3eDnca7r4+XJ3U/Lw2TC3w==} engines: {node: '>=18.0.0'} - '@aws-sdk/client-sso@3.848.0': - resolution: {integrity: sha512-mD+gOwoeZQvbecVLGoCmY6pS7kg02BHesbtIxUj+PeBqYoZV5uLvjUOmuGfw1SfoSobKvS11urxC9S7zxU/Maw==} + '@aws-sdk/client-sso@3.855.0': + resolution: {integrity: sha512-4gFvnn8oL9DeJp4fc5KoOB/v20eUuoYkElMCegnGA2AG1nPkf6igib16+Dt2xhoCmkA3cX5FET9gKI2hY7RiQw==} engines: {node: '>=18.0.0'} - '@aws-sdk/core@3.846.0': - resolution: {integrity: sha512-7CX0pM906r4WSS68fCTNMTtBCSkTtf3Wggssmx13gD40gcWEZXsU00KzPp1bYheNRyPlAq3rE22xt4wLPXbuxA==} + '@aws-sdk/core@3.855.0': + resolution: {integrity: sha512-viFAe3IB64xEFjl/OMw0af+tD+v8Ei09+0Fn69y+HoF5ESSJyNIZnj/U69OhpzdSCO65aathBNdYhG+AMbMLhw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-env@3.846.0': - resolution: {integrity: sha512-QuCQZET9enja7AWVISY+mpFrEIeHzvkx/JEEbHYzHhUkxcnC2Kq2c0bB7hDihGD0AZd3Xsm653hk1O97qu69zg==} + '@aws-sdk/credential-provider-env@3.855.0': + resolution: {integrity: sha512-2hKTkrb4RG+eXE+OpKW0ST75ti32ExtJlzK5TEDd+STVJBWTf6W6bxhP6GzfeyYQ5XGSUSI94X5eXhBOLdAJ6A==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-http@3.846.0': - resolution: {integrity: sha512-Jh1iKUuepdmtreMYozV2ePsPcOF5W9p3U4tWhi3v6nDvz0GsBjzjAROW+BW8XMz9vAD3I9R+8VC3/aq63p5nlw==} + '@aws-sdk/credential-provider-http@3.855.0': + resolution: {integrity: sha512-JxZ6VBpU9z6YQLhIDIC9wYojsgAGKmYaFQt0fBvwaeUF/P65kN8q+y/35tMFDPSiJ9XXu6tsJrgFvIldYt6+Zw==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-ini@3.848.0': - resolution: {integrity: sha512-r6KWOG+En2xujuMhgZu7dzOZV3/M5U/5+PXrG8dLQ3rdPRB3vgp5tc56KMqLwm/EXKRzAOSuw/UE4HfNOAB8Hw==} + '@aws-sdk/credential-provider-ini@3.855.0': + resolution: {integrity: sha512-wbdQI1N9xU3bnFDzU9Iq4fqpJbgNq4sVvxdhx0YgBMir+cmAuHgjmAuNZIBKHbH3+23snySzDfY6hTAZeBkPag==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-node@3.848.0': - resolution: {integrity: sha512-AblNesOqdzrfyASBCo1xW3uweiSro4Kft9/htdxLeCVU1KVOnFWA5P937MNahViRmIQm2sPBCqL8ZG0u9lnh5g==} + '@aws-sdk/credential-provider-node@3.855.0': + resolution: {integrity: sha512-n6IH1wLrAJYb2JSN/hKzNU1h7UiqnxpI4m3ScTNZJmkpCub9Q+TVugnnWGdyRmszz5gsKim5n9AiNVXddtA/UQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-process@3.846.0': - resolution: {integrity: sha512-mEpwDYarJSH+CIXnnHN0QOe0MXI+HuPStD6gsv3z/7Q6ESl8KRWon3weFZCDnqpiJMUVavlDR0PPlAFg2MQoPg==} + '@aws-sdk/credential-provider-process@3.855.0': + resolution: {integrity: sha512-GmJ6eCB7TYicXKPIq+hxq9ZBJDn6fGPdH/ptgSj0MNKzmie8zqWKRYDri9cy3zLmz7+b7JHy1t158Z8kp7RsXQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-sso@3.848.0': - resolution: {integrity: sha512-pozlDXOwJZL0e7w+dqXLgzVDB7oCx4WvtY0sk6l4i07uFliWF/exupb6pIehFWvTUcOvn5aFTTqcQaEzAD5Wsg==} + '@aws-sdk/credential-provider-sso@3.855.0': + resolution: {integrity: sha512-oXI/YQdTj/9unzyOQM/OxAtd85U3oACleyVoldawl/n5NdY215sEGW94uEw1Jg20jIoRFYt++Fw0UDXMQhhNow==} engines: {node: '>=18.0.0'} - '@aws-sdk/credential-provider-web-identity@3.848.0': - resolution: {integrity: sha512-D1fRpwPxtVDhcSc/D71exa2gYweV+ocp4D3brF0PgFd//JR3XahZ9W24rVnTQwYEcK9auiBZB89Ltv+WbWN8qw==} + '@aws-sdk/credential-provider-web-identity@3.855.0': + resolution: {integrity: sha512-x4BqqvqFc5aUxT9jNSm3yUiRkrQuXbdTMtshmG5/zzErASuLIixOmaPreqdb5MMqoyqdrNJSoL+u6YEfvOeB1Q==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-bucket-endpoint@3.840.0': @@ -4358,8 +4355,8 @@ packages: resolution: {integrity: sha512-iJg2r6FKsKKvdiU4oCOuCf7Ro/YE0Q2BT/QyEZN3/Rt8Nr4SAZiQOlcBXOCpGvuIKOEAhvDOUnW3aDHL01PdVw==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.846.0': - resolution: {integrity: sha512-CdkeVfkwt3+bDLhmOwBxvkUf6oY9iUhvosaUnqkoPsOqIiUEN54yTGOnO8A0wLz6mMsZ6aBlfFrQhFnxt3c+yw==} + '@aws-sdk/middleware-flexible-checksums@3.855.0': + resolution: {integrity: sha512-IoLYv0rpOX7if/ecHXQkMV+cexW03DP6lm9j763j/3vGdUvs+gHaPs2q8LXC9UCsjEDCincEC/GKbCWMOPtTDA==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-host-header@3.840.0': @@ -4378,32 +4375,32 @@ packages: resolution: {integrity: sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-sdk-s3@3.846.0': - resolution: {integrity: sha512-jP9x+2Q87J5l8FOP+jlAd7vGLn0cC6G9QGmf386e5OslBPqxXKcl3RjqGLIOKKos2mVItY3ApP5xdXQx7jGTVA==} + '@aws-sdk/middleware-sdk-s3@3.855.0': + resolution: {integrity: sha512-X7HsCCaTQcbBGR78gUSYTUFbPoDvWE4tq54WKn+ZFQPFFHIA1/EsVlQc0svWvhLFe4/DG4dySuyRRUFlu+Zd5w==} engines: {node: '>=18.0.0'} '@aws-sdk/middleware-ssec@3.840.0': resolution: {integrity: sha512-CBZP9t1QbjDFGOrtnUEHL1oAvmnCUUm7p0aPNbIdSzNtH42TNKjPRN3TuEIJDGjkrqpL3MXyDSmNayDcw/XW7Q==} engines: {node: '>=18.0.0'} - '@aws-sdk/middleware-user-agent@3.848.0': - resolution: {integrity: sha512-rjMuqSWJEf169/ByxvBqfdei1iaduAnfolTshsZxwcmLIUtbYrFUmts0HrLQqsAG8feGPpDLHA272oPl+NTCCA==} + '@aws-sdk/middleware-user-agent@3.855.0': + resolution: {integrity: sha512-jYi5ZI+xy0/Xj7fCeSFMNWab2APnwqYhMbZEb71P5YTyYFgIGhPUOXkSxGRX5Y+aSifG3Kw+/OYVE0AKJioPbQ==} engines: {node: '>=18.0.0'} - '@aws-sdk/nested-clients@3.848.0': - resolution: {integrity: sha512-joLsyyo9u61jnZuyYzo1z7kmS7VgWRAkzSGESVzQHfOA1H2PYeUFek6vLT4+c9xMGrX/Z6B0tkRdzfdOPiatLg==} + '@aws-sdk/nested-clients@3.855.0': + resolution: {integrity: sha512-l/ZpcSCYQ+cJsY9NgsEZjn1RR71JQwOMCGJUqAz+dxg7qovmy2ckuHzknBr3W5N6rNcVESbhjzcZKCmu2UaeFQ==} engines: {node: '>=18.0.0'} '@aws-sdk/region-config-resolver@3.840.0': resolution: {integrity: sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==} engines: {node: '>=18.0.0'} - '@aws-sdk/signature-v4-multi-region@3.846.0': - resolution: {integrity: sha512-ZMfIMxUljqZzPJGOcraC6erwq/z1puNMU35cO1a/WdhB+LdYknMn1lr7SJuH754QwNzzIlZbEgg4hoHw50+DpQ==} + '@aws-sdk/signature-v4-multi-region@3.855.0': + resolution: {integrity: sha512-Vj7QfuGUZGLM4kQ5dVodNAo3HXlPk53Ff9UPaRaGF8BQQM8j00W2ydnraUKeHvjt/yzRdG4o/giWukqH7wCiTw==} engines: {node: '>=18.0.0'} - '@aws-sdk/token-providers@3.848.0': - resolution: {integrity: sha512-oNPyM4+Di2Umu0JJRFSxDcKQ35+Chl/rAwD47/bS0cDPI8yrao83mLXLeDqpRPHyQW4sXlP763FZcuAibC0+mg==} + '@aws-sdk/token-providers@3.855.0': + resolution: {integrity: sha512-Ieh86MA+lOtvLAuCsT/gX5PSHkfmE7AnItT2ZFZddvu+s4LWWjDfAF0ktsR0H6166P7yAWTovfbEtORB3XzoTQ==} engines: {node: '>=18.0.0'} '@aws-sdk/types@3.840.0': @@ -4425,8 +4422,8 @@ packages: '@aws-sdk/util-user-agent-browser@3.840.0': resolution: {integrity: sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==} - '@aws-sdk/util-user-agent-node@3.848.0': - resolution: {integrity: sha512-Zz1ft9NiLqbzNj/M0jVNxaoxI2F4tGXN0ZbZIj+KJ+PbJo+w5+Jo6d0UDAtbj3AEd79pjcCaP4OA9NTVzItUdw==} + '@aws-sdk/util-user-agent-node@3.855.0': + resolution: {integrity: sha512-leDOlnChk+0qRYtc70X1KZCe/TAFNHUGtvqLE6bqdr08V446hYhmtHT9LXnZtflzbIb9zpgrzSXXigWz3GH6uA==} engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -8582,68 +8579,68 @@ packages: resolution: {integrity: sha512-qMx1nOrzoB+PF+pzb26Q4Tc2sOlrx9Ba2UBNX9hB31Omrq+QoZ2Gly0KLrQWw4Of1AQ4J9lnD+XOdwOdcdXqqw==} engines: {node: '>=12.20.0'} - '@swc/core-darwin-arm64@1.13.2': - resolution: {integrity: sha512-44p7ivuLSGFJ15Vly4ivLJjg3ARo4879LtEBAabcHhSZygpmkP8eyjyWxrH3OxkY1eRZSIJe8yRZPFw4kPXFPw==} + '@swc/core-darwin-arm64@1.13.3': + resolution: {integrity: sha512-ux0Ws4pSpBTqbDS9GlVP354MekB1DwYlbxXU3VhnDr4GBcCOimpocx62x7cFJkSpEBF8bmX8+/TTCGKh4PbyXw==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.13.2': - resolution: {integrity: sha512-Lb9EZi7X2XDAVmuUlBm2UvVAgSCbD3qKqDCxSI4jEOddzVOpNCnyZ/xEampdngUIyDDhhJLYU9duC+Mcsv5Y+A==} + '@swc/core-darwin-x64@1.13.3': + resolution: {integrity: sha512-p0X6yhxmNUOMZrbeZ3ZNsPige8lSlSe1llllXvpCLkKKxN/k5vZt1sULoq6Nj4eQ7KeHQVm81/+AwKZyf/e0TA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.13.2': - resolution: {integrity: sha512-9TDe/92ee1x57x+0OqL1huG4BeljVx0nWW4QOOxp8CCK67Rpc/HHl2wciJ0Kl9Dxf2NvpNtkPvqj9+BUmM9WVA==} + '@swc/core-linux-arm-gnueabihf@1.13.3': + resolution: {integrity: sha512-OmDoiexL2fVWvQTCtoh0xHMyEkZweQAlh4dRyvl8ugqIPEVARSYtaj55TBMUJIP44mSUOJ5tytjzhn2KFxFcBA==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.13.2': - resolution: {integrity: sha512-KJUSl56DBk7AWMAIEcU83zl5mg3vlQYhLELhjwRFkGFMvghQvdqQ3zFOYa4TexKA7noBZa3C8fb24rI5sw9Exg==} + '@swc/core-linux-arm64-gnu@1.13.3': + resolution: {integrity: sha512-STfKku3QfnuUj6k3g9ld4vwhtgCGYIFQmsGPPgT9MK/dI3Lwnpe5Gs5t1inoUIoGNP8sIOLlBB4HV4MmBjQuhw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.13.2': - resolution: {integrity: sha512-teU27iG1oyWpNh9CzcGQ48ClDRt/RCem7mYO7ehd2FY102UeTws2+OzLESS1TS1tEZipq/5xwx3FzbVgiolCiQ==} + '@swc/core-linux-arm64-musl@1.13.3': + resolution: {integrity: sha512-bc+CXYlFc1t8pv9yZJGus372ldzOVscBl7encUBlU1m/Sig0+NDJLz6cXXRcFyl6ABNOApWeR4Yl7iUWx6C8og==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.13.2': - resolution: {integrity: sha512-dRPsyPyqpLD0HMRCRpYALIh4kdOir8pPg4AhNQZLehKowigRd30RcLXGNVZcc31Ua8CiPI4QSgjOIxK+EQe4LQ==} + '@swc/core-linux-x64-gnu@1.13.3': + resolution: {integrity: sha512-dFXoa0TEhohrKcxn/54YKs1iwNeW6tUkHJgXW33H381SvjKFUV53WR231jh1sWVJETjA3vsAwxKwR23s7UCmUA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.13.2': - resolution: {integrity: sha512-CCxETW+KkYEQDqz1SYC15YIWYheqFC+PJVOW76Maa/8yu8Biw+HTAcblKf2isrlUtK8RvrQN94v3UXkC2NzCEw==} + '@swc/core-linux-x64-musl@1.13.3': + resolution: {integrity: sha512-ieyjisLB+ldexiE/yD8uomaZuZIbTc8tjquYln9Quh5ykOBY7LpJJYBWvWtm1g3pHv6AXlBI8Jay7Fffb6aLfA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.13.2': - resolution: {integrity: sha512-Wv/QTA6PjyRLlmKcN6AmSI4jwSMRl0VTLGs57PHTqYRwwfwd7y4s2fIPJVBNbAlXd795dOEP6d/bGSQSyhOX3A==} + '@swc/core-win32-arm64-msvc@1.13.3': + resolution: {integrity: sha512-elTQpnaX5vESSbhCEgcwXjpMsnUbqqHfEpB7ewpkAsLzKEXZaK67ihSRYAuAx6ewRQTo7DS5iTT6X5aQD3MzMw==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.13.2': - resolution: {integrity: sha512-PuCdtNynEkUNbUXX/wsyUC+t4mamIU5y00lT5vJcAvco3/r16Iaxl5UCzhXYaWZSNVZMzPp9qN8NlSL8M5pPxw==} + '@swc/core-win32-ia32-msvc@1.13.3': + resolution: {integrity: sha512-nvehQVEOdI1BleJpuUgPLrclJ0TzbEMc+MarXDmmiRFwEUGqj+pnfkTSb7RZyS1puU74IXdK/YhTirHurtbI9w==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.13.2': - resolution: {integrity: sha512-qlmMkFZJus8cYuBURx1a3YAG2G7IW44i+FEYV5/32ylKkzGNAr9tDJSA53XNnNXkAB5EXSPsOz7bn5C3JlEtdQ==} + '@swc/core-win32-x64-msvc@1.13.3': + resolution: {integrity: sha512-A+JSKGkRbPLVV2Kwx8TaDAV0yXIXm/gc8m98hSkVDGlPBBmydgzNdWy3X7HTUBM7IDk7YlWE7w2+RUGjdgpTmg==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.13.2': - resolution: {integrity: sha512-YWqn+0IKXDhqVLKoac4v2tV6hJqB/wOh8/Br8zjqeqBkKa77Qb0Kw2i7LOFzjFNZbZaPH6AlMGlBwNrxaauaAg==} + '@swc/core@1.13.3': + resolution: {integrity: sha512-ZaDETVWnm6FE0fc+c2UE8MHYVS3Fe91o5vkmGfgwGXFbxYvAjKSqxM/j4cRc9T7VZNSJjriXq58XkfCp3Y6f+w==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -9085,8 +9082,8 @@ packages: '@types/node@16.18.126': resolution: {integrity: sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==} - '@types/node@18.19.120': - resolution: {integrity: sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA==} + '@types/node@18.19.121': + resolution: {integrity: sha512-bHOrbyztmyYIi4f1R0s17QsPs1uyyYnGcXeZoGEd227oZjry0q6XQBQxd82X1I57zEfwO8h9Xo+Kl5gX1d9MwQ==} '@types/node@22.15.18': resolution: {integrity: sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==} @@ -10488,10 +10485,6 @@ packages: resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} engines: {node: '>=4'} - axios@0.21.0: - resolution: {integrity: sha512-fmkJBknJKoZwem3/IKSSLpkdNXZeBu5Q7GA/aRsr2btgrptmSCxi2oFjZHqGdK9DoTil9PIHlPIZw2EcRJXRvw==} - deprecated: Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410 - axios@1.9.0: resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} @@ -10837,10 +10830,10 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - babel-preset-current-node-syntax@1.1.0: - resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + babel-preset-current-node-syntax@1.1.1: + resolution: {integrity: sha512-23fWKohMTvS5s0wwJKycOe0dBdCwQ6+iiLaNR9zy8P13mtFRFM9qLLX6HJX5DL2pi/FNDf3fCQHM4FIMoHH/7w==} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0 || ^8.0.0-0 babel-preset-env@1.6.1: resolution: {integrity: sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==} @@ -11240,11 +11233,11 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-db@1.0.30001727: - resolution: {integrity: sha512-1o0BfNPo5JXbPYWHL83+9AcElT+bVjXt19goeoB2U6qkNZNChq5B4/BHR+RmLyf8TlTZplTFqOhJQygNWLBX6Q==} + caniuse-db@1.0.30001731: + resolution: {integrity: sha512-IbYSXiOfvIJmCRLkrE/hMSsTZTu48NBddgIgC027NnuPwu/V14PnO3UtHxoQGSA16b09zZJkCsaoLbwMSllZrA==} - caniuse-lite@1.0.30001727: - resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + caniuse-lite@1.0.30001731: + resolution: {integrity: sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==} capture-exit@2.0.0: resolution: {integrity: sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==} @@ -12515,8 +12508,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.191: - resolution: {integrity: sha512-xcwe9ELcuxYLUFqZZxL19Z6HVKcvNkIwhbHUz7L3us6u12yR+7uY89dSl570f/IqNthx8dAw3tojG7i4Ni4tDA==} + electron-to-chromium@1.5.192: + resolution: {integrity: sha512-rP8Ez0w7UNw/9j5eSXCe10o1g/8B1P5SM90PCCMVkIRQn2R0LEHWz4Eh9RnxkniuDe1W0cTSOB3MLlkTGDcuCg==} email-addresses@5.0.0: resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} @@ -18370,8 +18363,8 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-is@19.1.0: - resolution: {integrity: sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==} + react-is@19.1.1: + resolution: {integrity: sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA==} react-json-view-lite@2.4.1: resolution: {integrity: sha512-fwFYknRIBxjbFm0kBDrzgBy1xa5tDg2LyXXBepC5f1b+MY3BUClMCsvanMPn089JbV1Eg3nZcrp0VCuH43aXnA==} @@ -18493,10 +18486,10 @@ packages: peerDependencies: react: '>= 0.14.0' - react-test-renderer@19.1.0: - resolution: {integrity: sha512-jXkSl3CpvPYEF+p/eGDLB4sPoDX8pKkYvRl9+rR8HxLY0X04vW7hCm1/0zHoUSjPZ3bDa+wXWNTDVIw/R8aDVw==} + react-test-renderer@19.1.1: + resolution: {integrity: sha512-aGRXI+zcBTtg0diHofc7+Vy97nomBs9WHHFY1Csl3iV0x6xucjNYZZAkiVKGiNYUv23ecOex5jE67t8ZzqYObA==} peerDependencies: - react: ^19.1.0 + react: ^19.1.1 react-textarea-autosize@8.5.9: resolution: {integrity: sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==} @@ -21512,8 +21505,8 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - webpack@5.100.2: - resolution: {integrity: sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw==} + webpack@5.101.0: + resolution: {integrity: sha512-B4t+nJqytPeuZlHuIKTbalhljIFXeNRqrUGAQgTGlfOl2lXXKXw+yZu6bicycP+PUlM44CxBjCFD6aciKFT3LQ==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -22051,29 +22044,29 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.850.0': + '@aws-sdk/client-s3@3.855.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.846.0 - '@aws-sdk/credential-provider-node': 3.848.0 + '@aws-sdk/core': 3.855.0 + '@aws-sdk/credential-provider-node': 3.855.0 '@aws-sdk/middleware-bucket-endpoint': 3.840.0 '@aws-sdk/middleware-expect-continue': 3.840.0 - '@aws-sdk/middleware-flexible-checksums': 3.846.0 + '@aws-sdk/middleware-flexible-checksums': 3.855.0 '@aws-sdk/middleware-host-header': 3.840.0 '@aws-sdk/middleware-location-constraint': 3.840.0 '@aws-sdk/middleware-logger': 3.840.0 '@aws-sdk/middleware-recursion-detection': 3.840.0 - '@aws-sdk/middleware-sdk-s3': 3.846.0 + '@aws-sdk/middleware-sdk-s3': 3.855.0 '@aws-sdk/middleware-ssec': 3.840.0 - '@aws-sdk/middleware-user-agent': 3.848.0 + '@aws-sdk/middleware-user-agent': 3.855.0 '@aws-sdk/region-config-resolver': 3.840.0 - '@aws-sdk/signature-v4-multi-region': 3.846.0 + '@aws-sdk/signature-v4-multi-region': 3.855.0 '@aws-sdk/types': 3.840.0 '@aws-sdk/util-endpoints': 3.848.0 '@aws-sdk/util-user-agent-browser': 3.840.0 - '@aws-sdk/util-user-agent-node': 3.848.0 + '@aws-sdk/util-user-agent-node': 3.855.0 '@aws-sdk/xml-builder': 3.821.0 '@smithy/config-resolver': 4.1.4 '@smithy/core': 3.7.2 @@ -22114,20 +22107,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.848.0': + '@aws-sdk/client-sso@3.855.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.846.0 + '@aws-sdk/core': 3.855.0 '@aws-sdk/middleware-host-header': 3.840.0 '@aws-sdk/middleware-logger': 3.840.0 '@aws-sdk/middleware-recursion-detection': 3.840.0 - '@aws-sdk/middleware-user-agent': 3.848.0 + '@aws-sdk/middleware-user-agent': 3.855.0 '@aws-sdk/region-config-resolver': 3.840.0 '@aws-sdk/types': 3.840.0 '@aws-sdk/util-endpoints': 3.848.0 '@aws-sdk/util-user-agent-browser': 3.840.0 - '@aws-sdk/util-user-agent-node': 3.848.0 + '@aws-sdk/util-user-agent-node': 3.855.0 '@smithy/config-resolver': 4.1.4 '@smithy/core': 3.7.2 '@smithy/fetch-http-handler': 5.1.0 @@ -22157,7 +22150,7 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.846.0': + '@aws-sdk/core@3.855.0': dependencies: '@aws-sdk/types': 3.840.0 '@aws-sdk/xml-builder': 3.821.0 @@ -22175,17 +22168,17 @@ snapshots: fast-xml-parser: 5.2.5 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.846.0': + '@aws-sdk/credential-provider-env@3.855.0': dependencies: - '@aws-sdk/core': 3.846.0 + '@aws-sdk/core': 3.855.0 '@aws-sdk/types': 3.840.0 '@smithy/property-provider': 4.0.4 '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.846.0': + '@aws-sdk/credential-provider-http@3.855.0': dependencies: - '@aws-sdk/core': 3.846.0 + '@aws-sdk/core': 3.855.0 '@aws-sdk/types': 3.840.0 '@smithy/fetch-http-handler': 5.1.0 '@smithy/node-http-handler': 4.1.0 @@ -22196,15 +22189,15 @@ snapshots: '@smithy/util-stream': 4.2.3 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.848.0': + '@aws-sdk/credential-provider-ini@3.855.0': dependencies: - '@aws-sdk/core': 3.846.0 - '@aws-sdk/credential-provider-env': 3.846.0 - '@aws-sdk/credential-provider-http': 3.846.0 - '@aws-sdk/credential-provider-process': 3.846.0 - '@aws-sdk/credential-provider-sso': 3.848.0 - '@aws-sdk/credential-provider-web-identity': 3.848.0 - '@aws-sdk/nested-clients': 3.848.0 + '@aws-sdk/core': 3.855.0 + '@aws-sdk/credential-provider-env': 3.855.0 + '@aws-sdk/credential-provider-http': 3.855.0 + '@aws-sdk/credential-provider-process': 3.855.0 + '@aws-sdk/credential-provider-sso': 3.855.0 + '@aws-sdk/credential-provider-web-identity': 3.855.0 + '@aws-sdk/nested-clients': 3.855.0 '@aws-sdk/types': 3.840.0 '@smithy/credential-provider-imds': 4.0.6 '@smithy/property-provider': 4.0.4 @@ -22214,14 +22207,14 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.848.0': + '@aws-sdk/credential-provider-node@3.855.0': dependencies: - '@aws-sdk/credential-provider-env': 3.846.0 - '@aws-sdk/credential-provider-http': 3.846.0 - '@aws-sdk/credential-provider-ini': 3.848.0 - '@aws-sdk/credential-provider-process': 3.846.0 - '@aws-sdk/credential-provider-sso': 3.848.0 - '@aws-sdk/credential-provider-web-identity': 3.848.0 + '@aws-sdk/credential-provider-env': 3.855.0 + '@aws-sdk/credential-provider-http': 3.855.0 + '@aws-sdk/credential-provider-ini': 3.855.0 + '@aws-sdk/credential-provider-process': 3.855.0 + '@aws-sdk/credential-provider-sso': 3.855.0 + '@aws-sdk/credential-provider-web-identity': 3.855.0 '@aws-sdk/types': 3.840.0 '@smithy/credential-provider-imds': 4.0.6 '@smithy/property-provider': 4.0.4 @@ -22231,20 +22224,20 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.846.0': + '@aws-sdk/credential-provider-process@3.855.0': dependencies: - '@aws-sdk/core': 3.846.0 + '@aws-sdk/core': 3.855.0 '@aws-sdk/types': 3.840.0 '@smithy/property-provider': 4.0.4 '@smithy/shared-ini-file-loader': 4.0.4 '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.848.0': + '@aws-sdk/credential-provider-sso@3.855.0': dependencies: - '@aws-sdk/client-sso': 3.848.0 - '@aws-sdk/core': 3.846.0 - '@aws-sdk/token-providers': 3.848.0 + '@aws-sdk/client-sso': 3.855.0 + '@aws-sdk/core': 3.855.0 + '@aws-sdk/token-providers': 3.855.0 '@aws-sdk/types': 3.840.0 '@smithy/property-provider': 4.0.4 '@smithy/shared-ini-file-loader': 4.0.4 @@ -22253,10 +22246,10 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.848.0': + '@aws-sdk/credential-provider-web-identity@3.855.0': dependencies: - '@aws-sdk/core': 3.846.0 - '@aws-sdk/nested-clients': 3.848.0 + '@aws-sdk/core': 3.855.0 + '@aws-sdk/nested-clients': 3.855.0 '@aws-sdk/types': 3.840.0 '@smithy/property-provider': 4.0.4 '@smithy/types': 4.3.1 @@ -22281,12 +22274,12 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.846.0': + '@aws-sdk/middleware-flexible-checksums@3.855.0': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.846.0 + '@aws-sdk/core': 3.855.0 '@aws-sdk/types': 3.840.0 '@smithy/is-array-buffer': 4.0.0 '@smithy/node-config-provider': 4.1.3 @@ -22323,9 +22316,9 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.846.0': + '@aws-sdk/middleware-sdk-s3@3.855.0': dependencies: - '@aws-sdk/core': 3.846.0 + '@aws-sdk/core': 3.855.0 '@aws-sdk/types': 3.840.0 '@aws-sdk/util-arn-parser': 3.804.0 '@smithy/core': 3.7.2 @@ -22346,9 +22339,9 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.848.0': + '@aws-sdk/middleware-user-agent@3.855.0': dependencies: - '@aws-sdk/core': 3.846.0 + '@aws-sdk/core': 3.855.0 '@aws-sdk/types': 3.840.0 '@aws-sdk/util-endpoints': 3.848.0 '@smithy/core': 3.7.2 @@ -22356,20 +22349,20 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.848.0': + '@aws-sdk/nested-clients@3.855.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.846.0 + '@aws-sdk/core': 3.855.0 '@aws-sdk/middleware-host-header': 3.840.0 '@aws-sdk/middleware-logger': 3.840.0 '@aws-sdk/middleware-recursion-detection': 3.840.0 - '@aws-sdk/middleware-user-agent': 3.848.0 + '@aws-sdk/middleware-user-agent': 3.855.0 '@aws-sdk/region-config-resolver': 3.840.0 '@aws-sdk/types': 3.840.0 '@aws-sdk/util-endpoints': 3.848.0 '@aws-sdk/util-user-agent-browser': 3.840.0 - '@aws-sdk/util-user-agent-node': 3.848.0 + '@aws-sdk/util-user-agent-node': 3.855.0 '@smithy/config-resolver': 4.1.4 '@smithy/core': 3.7.2 '@smithy/fetch-http-handler': 5.1.0 @@ -22408,19 +22401,19 @@ snapshots: '@smithy/util-middleware': 4.0.4 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.846.0': + '@aws-sdk/signature-v4-multi-region@3.855.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.846.0 + '@aws-sdk/middleware-sdk-s3': 3.855.0 '@aws-sdk/types': 3.840.0 '@smithy/protocol-http': 5.1.2 '@smithy/signature-v4': 5.1.2 '@smithy/types': 4.3.1 tslib: 2.8.1 - '@aws-sdk/token-providers@3.848.0': + '@aws-sdk/token-providers@3.855.0': dependencies: - '@aws-sdk/core': 3.846.0 - '@aws-sdk/nested-clients': 3.848.0 + '@aws-sdk/core': 3.855.0 + '@aws-sdk/nested-clients': 3.855.0 '@aws-sdk/types': 3.840.0 '@smithy/property-provider': 4.0.4 '@smithy/shared-ini-file-loader': 4.0.4 @@ -22457,9 +22450,9 @@ snapshots: bowser: 2.11.0 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.848.0': + '@aws-sdk/util-user-agent-node@3.855.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.848.0 + '@aws-sdk/middleware-user-agent': 3.855.0 '@aws-sdk/types': 3.840.0 '@smithy/node-config-provider': 4.1.3 '@smithy/types': 4.3.1 @@ -25680,7 +25673,7 @@ snapshots: dependencies: playwright: 1.52.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.2)(webpack-hot-middleware@2.26.1)(webpack@5.100.2)': + '@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.101.0)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.44.0 @@ -25690,14 +25683,14 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.2 source-map: 0.7.6 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.101.0(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.100.2) + webpack-dev-server: 5.2.2(webpack-cli@4.10.0)(webpack@5.101.0) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(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.100.2)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(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.101.0)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.44.0 @@ -25707,14 +25700,14 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.2 source-map: 0.7.6 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) optionalDependencies: '@types/webpack': 5.28.5(webpack-cli@6.0.1) type-fest: 4.41.0 - webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) + webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.101.0) 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.100.2))(webpack-hot-middleware@2.26.1)(webpack@5.100.2)': + '@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.101.0))(webpack-hot-middleware@2.26.1)(webpack@5.101.0)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.44.0 @@ -25724,14 +25717,14 @@ snapshots: react-refresh: 0.11.0 schema-utils: 4.3.2 source-map: 0.7.6 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) optionalDependencies: '@types/webpack': 5.28.5 type-fest: 4.41.0 - webpack-dev-server: 5.2.2(webpack@5.100.2) + webpack-dev-server: 5.2.2(webpack@5.101.0) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.6.1(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.17.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.100.2)': + '@pmmmwh/react-refresh-webpack-plugin@0.6.1(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.17.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.101.0)': dependencies: anser: 2.3.2 core-js-pure: 3.44.0 @@ -25740,11 +25733,11 @@ snapshots: react-refresh: 0.17.0 schema-utils: 4.3.2 source-map: 0.7.6 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(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.100.2) + webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.101.0) webpack-hot-middleware: 2.26.1 '@projectstorm/geometry@6.7.4': {} @@ -27526,7 +27519,7 @@ snapshots: storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(eslint@9.27.0(jiti@2.5.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.100.2)': + '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(eslint@9.27.0(jiti@2.5.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.101.0)': dependencies: '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) @@ -27546,7 +27539,7 @@ 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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) core-js: 3.44.0 fast-deep-equal: 3.1.3 global: 4.4.0 @@ -27571,7 +27564,7 @@ snapshots: - webpack - webpack-cli - '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(eslint@9.27.0(jiti@2.5.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.100.2)': + '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(eslint@9.27.0(jiti@2.5.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.101.0)': dependencies: '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) @@ -27591,7 +27584,7 @@ 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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) core-js: 3.44.0 fast-deep-equal: 3.1.3 global: 4.4.0 @@ -27684,13 +27677,13 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.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.5.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.100.2)': + '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.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.5.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.101.0)': 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.5.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.5.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.100.2) + '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(eslint@9.27.0(jiti@2.5.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.101.0) '@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) @@ -27706,7 +27699,7 @@ snapshots: '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.5.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.100.2(webpack-cli@4.10.0) + webpack: 5.101.0(webpack-cli@4.10.0) transitivePeerDependencies: - '@storybook/mdx2-csf' - '@swc/core' @@ -27718,13 +27711,13 @@ 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.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(eslint@9.27.0(jiti@2.5.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.100.2)': + '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(eslint@9.27.0(jiti@2.5.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.101.0)': 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.5.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)(eslint@9.27.0(jiti@2.5.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.100.2) + '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(eslint@9.27.0(jiti@2.5.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.101.0) '@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) @@ -27740,7 +27733,7 @@ snapshots: '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.5.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.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) transitivePeerDependencies: - '@storybook/mdx2-csf' - '@swc/core' @@ -28250,33 +28243,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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.44.0 - css-loader: 3.6.0(webpack@5.100.2) - file-loader: 6.2.0(webpack@5.100.2) + css-loader: 3.6.0(webpack@5.101.0) + file-loader: 6.2.0(webpack@5.101.0) 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.100.2) + html-webpack-plugin: 4.5.2(webpack@5.101.0) 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.100.2) - raw-loader: 4.0.2(webpack@5.100.2) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.101.0) + raw-loader: 4.0.2(webpack@5.101.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.100.2) - terser-webpack-plugin: 4.2.3(webpack@5.100.2) + style-loader: 1.3.0(webpack@5.101.0) + terser-webpack-plugin: 4.2.3(webpack@5.101.0) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.100.2) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.101.0) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.101.0) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -28312,33 +28305,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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.44.0 - css-loader: 3.6.0(webpack@5.100.2) - file-loader: 6.2.0(webpack@5.100.2) + css-loader: 3.6.0(webpack@5.101.0) + file-loader: 6.2.0(webpack@5.101.0) 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.100.2) + html-webpack-plugin: 4.5.2(webpack@5.101.0) 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.100.2) - raw-loader: 4.0.2(webpack@5.100.2) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.101.0) + raw-loader: 4.0.2(webpack@5.101.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.100.2) - terser-webpack-plugin: 4.2.3(webpack@5.100.2) + style-loader: 1.3.0(webpack@5.101.0) + terser-webpack-plugin: 4.2.3(webpack@5.101.0) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.100.2) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.101.0) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.101.0) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -28374,33 +28367,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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.44.0 - css-loader: 3.6.0(webpack@5.100.2) - file-loader: 6.2.0(webpack@5.100.2) + css-loader: 3.6.0(webpack@5.101.0) + file-loader: 6.2.0(webpack@5.101.0) 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.100.2) + html-webpack-plugin: 4.5.2(webpack@5.101.0) 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.100.2) - raw-loader: 4.0.2(webpack@5.100.2) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.101.0) + raw-loader: 4.0.2(webpack@5.101.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.100.2) - terser-webpack-plugin: 4.2.3(webpack@5.100.2) + style-loader: 1.3.0(webpack@5.101.0) + terser-webpack-plugin: 4.2.3(webpack@5.101.0) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.100.2) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@4.10.0) + webpack-dev-middleware: 3.7.3(webpack@5.101.0) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.101.0) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -28436,33 +28429,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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.44.0 - css-loader: 3.6.0(webpack@5.100.2) - file-loader: 6.2.0(webpack@5.100.2) + css-loader: 3.6.0(webpack@5.101.0) + file-loader: 6.2.0(webpack@5.101.0) 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.100.2) + html-webpack-plugin: 4.5.2(webpack@5.101.0) 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.100.2) - raw-loader: 4.0.2(webpack@5.100.2) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.101.0) + raw-loader: 4.0.2(webpack@5.101.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.100.2) - terser-webpack-plugin: 4.2.3(webpack@5.100.2) + style-loader: 1.3.0(webpack@5.101.0) + terser-webpack-plugin: 4.2.3(webpack@5.101.0) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@6.0.1) - webpack-dev-middleware: 3.7.3(webpack@5.100.2) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@6.0.1) + webpack-dev-middleware: 3.7.3(webpack@5.101.0) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.101.0) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -28498,33 +28491,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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.44.0 - css-loader: 3.6.0(webpack@5.100.2) - file-loader: 6.2.0(webpack@5.100.2) + css-loader: 3.6.0(webpack@5.101.0) + file-loader: 6.2.0(webpack@5.101.0) 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.100.2) + html-webpack-plugin: 4.5.2(webpack@5.101.0) 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.100.2) - raw-loader: 4.0.2(webpack@5.100.2) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.101.0) + raw-loader: 4.0.2(webpack@5.101.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.100.2) - terser-webpack-plugin: 4.2.3(webpack@5.100.2) + style-loader: 1.3.0(webpack@5.101.0) + terser-webpack-plugin: 4.2.3(webpack@5.101.0) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.100.2) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.101.0) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.101.0) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -28557,27 +28550,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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.44.0 - css-loader: 5.2.7(webpack@5.100.2) - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.100.2) + css-loader: 5.2.7(webpack@5.101.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.101.0) glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) - html-webpack-plugin: 5.6.3(webpack@5.100.2) + html-webpack-plugin: 5.6.3(webpack@5.101.0) 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.100.2) - terser-webpack-plugin: 5.3.14(webpack@5.100.2) + style-loader: 2.0.0(webpack@5.101.0) + terser-webpack-plugin: 5.3.14(webpack@5.101.0) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-dev-middleware: 4.3.0(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@4.10.0) + webpack-dev-middleware: 4.3.0(webpack@5.101.0) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.4.6 optionalDependencies: @@ -28611,27 +28604,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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.44.0 - css-loader: 5.2.7(webpack@5.100.2) - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.100.2) + css-loader: 5.2.7(webpack@5.101.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.101.0) glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) - html-webpack-plugin: 5.6.3(webpack@5.100.2) + html-webpack-plugin: 5.6.3(webpack@5.101.0) 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.100.2) - terser-webpack-plugin: 5.3.14(webpack@5.100.2) + style-loader: 2.0.0(webpack@5.101.0) + terser-webpack-plugin: 5.3.14(webpack@5.101.0) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@6.0.1) - webpack-dev-middleware: 4.3.0(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@6.0.1) + webpack-dev-middleware: 4.3.0(webpack@5.101.0) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.4.6 optionalDependencies: @@ -28665,33 +28658,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.13.2(@swc/helpers@0.5.17) + '@swc/core': 1.13.3(@swc/helpers@0.5.17) '@types/node': 16.18.126 '@types/semver': 7.7.0 - babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.100.2) + babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.101.0) 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.100.2) + css-loader: 6.11.0(webpack@5.101.0) express: 4.21.2 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.100.2) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.101.0) fs-extra: 11.3.0 - html-webpack-plugin: 5.6.3(webpack@5.100.2) + html-webpack-plugin: 5.6.3(webpack@5.101.0) 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.2 - style-loader: 3.3.4(webpack@5.100.2) - swc-loader: 0.2.6(@swc/core@1.13.2(@swc/helpers@0.5.17))(webpack@5.100.2) - terser-webpack-plugin: 5.3.14(@swc/core@1.13.2(@swc/helpers@0.5.17))(webpack@5.100.2) + style-loader: 3.3.4(webpack@5.101.0) + swc-loader: 0.2.6(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0) + terser-webpack-plugin: 5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.100.2(@swc/core@1.13.2(@swc/helpers@0.5.17)) - webpack-dev-middleware: 6.1.3(webpack@5.100.2) + webpack: 5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)) + webpack-dev-middleware: 6.1.3(webpack@5.101.0) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.5.0 optionalDependencies: @@ -28715,23 +28708,23 @@ snapshots: 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.100.2) + css-loader: 6.11.0(webpack@5.101.0) es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.100.2) - html-webpack-plugin: 5.6.3(webpack@5.100.2) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.101.0) + html-webpack-plugin: 5.6.3(webpack@5.101.0) magic-string: 0.30.17 path-browserify: 1.0.1 process: 0.11.10 semver: 7.7.2 storybook: 8.6.14(prettier@3.5.3) - style-loader: 3.3.4(webpack@5.100.2) - terser-webpack-plugin: 5.3.14(webpack@5.100.2) + style-loader: 3.3.4(webpack@5.101.0) + terser-webpack-plugin: 5.3.14(webpack@5.101.0) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-dev-middleware: 6.1.3(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@5.1.4) + webpack-dev-middleware: 6.1.3(webpack@5.101.0) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -28751,23 +28744,23 @@ snapshots: 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.100.2) + css-loader: 6.11.0(webpack@5.101.0) es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.100.2) - html-webpack-plugin: 5.6.3(webpack@5.100.2) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.101.0) + html-webpack-plugin: 5.6.3(webpack@5.101.0) magic-string: 0.30.17 path-browserify: 1.0.1 process: 0.11.10 semver: 7.7.2 storybook: 8.6.14(prettier@3.5.3) - style-loader: 3.3.4(webpack@5.100.2) - terser-webpack-plugin: 5.3.14(webpack@5.100.2) + style-loader: 3.3.4(webpack@5.101.0) + terser-webpack-plugin: 5.3.14(webpack@5.101.0) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@6.0.1) - webpack-dev-middleware: 6.1.3(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@6.0.1) + webpack-dev-middleware: 6.1.3(webpack@5.101.0) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -28787,23 +28780,23 @@ snapshots: 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.100.2) + css-loader: 6.11.0(webpack@5.101.0) es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.100.2) - html-webpack-plugin: 5.6.3(webpack@5.100.2) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.101.0) + html-webpack-plugin: 5.6.3(webpack@5.101.0) magic-string: 0.30.17 path-browserify: 1.0.1 process: 0.11.10 semver: 7.7.2 storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) - style-loader: 3.3.4(webpack@5.100.2) - terser-webpack-plugin: 5.3.14(webpack@5.100.2) + style-loader: 3.3.4(webpack@5.101.0) + terser-webpack-plugin: 5.3.14(webpack@5.101.0) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-dev-middleware: 6.1.3(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@5.1.4) + webpack-dev-middleware: 6.1.3(webpack@5.101.0) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -29079,7 +29072,7 @@ snapshots: dependencies: storybook: 9.0.18(@testing-library/dom@10.4.1)(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.100.2)': + '@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.101.0)': 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 @@ -29103,11 +29096,11 @@ snapshots: ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(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.100.2)': + '@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.101.0)': 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 @@ -29131,7 +29124,7 @@ snapshots: ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) optionalDependencies: typescript: 4.9.5 @@ -29168,7 +29161,7 @@ snapshots: '@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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 @@ -29176,7 +29169,7 @@ snapshots: express: 4.21.2 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.5.1))(typescript@5.8.3)(webpack@5.100.2) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.101.0) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -29193,7 +29186,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -29233,7 +29226,7 @@ snapshots: '@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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 @@ -29241,7 +29234,7 @@ snapshots: express: 4.21.2 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.5.1))(typescript@5.8.3)(webpack@5.100.2) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.101.0) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -29258,7 +29251,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -29298,7 +29291,7 @@ snapshots: '@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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 @@ -29306,7 +29299,7 @@ snapshots: express: 4.21.2 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.5.1))(typescript@5.8.3)(webpack@5.100.2) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.101.0) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -29323,7 +29316,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.101.0(webpack-cli@4.10.0) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -29363,7 +29356,7 @@ snapshots: '@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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 @@ -29371,7 +29364,7 @@ snapshots: express: 4.21.2 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.5.1))(typescript@5.8.3)(webpack@5.100.2) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.101.0) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -29388,7 +29381,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -29428,7 +29421,7 @@ snapshots: '@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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 @@ -29436,7 +29429,7 @@ snapshots: express: 4.21.2 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.5.1))(typescript@4.9.5)(webpack@5.100.2) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@4.9.5)(webpack@5.101.0) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -29453,7 +29446,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -29500,7 +29493,7 @@ snapshots: '@storybook/node-logger': 7.6.20 '@storybook/types': 7.6.20 '@types/find-cache-dir': 3.2.1 - '@types/node': 18.19.120 + '@types/node': 18.19.121 '@types/node-fetch': 2.6.12 '@types/pretty-hrtime': 1.0.3 chalk: 4.1.2 @@ -29539,7 +29532,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 '@storybook/builder-webpack4': 6.5.16(eslint@9.27.0(jiti@2.5.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.100.2) + '@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.101.0) '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.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 @@ -29581,7 +29574,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.4.4 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.101.0(webpack-cli@4.10.0) ws: 8.18.3 x-default-browser: 0.4.0 optionalDependencies: @@ -29605,7 +29598,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 '@storybook/builder-webpack4': 6.5.16(eslint@9.27.0(jiti@2.5.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.100.2) + '@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.101.0) '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.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 @@ -29647,7 +29640,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.4.4 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) ws: 8.18.3 x-default-browser: 0.4.0 optionalDependencies: @@ -29671,7 +29664,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 '@storybook/builder-webpack4': 6.5.16(eslint@9.26.0(jiti@2.5.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.100.2) + '@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.101.0) '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.5.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 @@ -29713,7 +29706,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.4.4 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) ws: 8.18.3 x-default-browser: 0.4.0 optionalDependencies: @@ -29735,7 +29728,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 '@storybook/builder-webpack4': 6.5.16(eslint@9.27.0(jiti@2.5.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.100.2) + '@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.101.0) '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.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 @@ -29777,7 +29770,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.4.4 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) ws: 8.18.3 x-default-browser: 0.4.0 optionalDependencies: @@ -29799,7 +29792,7 @@ snapshots: dependencies: '@discoveryjs/json-ext': 0.5.7 '@storybook/builder-webpack4': 6.5.16(eslint@9.27.0(jiti@2.5.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.100.2) + '@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.101.0) '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.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 @@ -29841,7 +29834,7 @@ snapshots: ts-dedent: 2.2.0 util-deprecate: 1.0.2 watchpack: 2.4.4 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) ws: 8.18.3 x-default-browser: 0.4.0 optionalDependencies: @@ -29877,7 +29870,7 @@ snapshots: '@storybook/telemetry': 7.6.20(encoding@0.1.13) '@storybook/types': 7.6.20 '@types/detect-port': 1.3.5 - '@types/node': 18.19.120 + '@types/node': 18.19.121 '@types/pretty-hrtime': 1.0.3 '@types/semver': 7.7.0 better-opn: 3.0.2 @@ -29928,13 +29921,13 @@ snapshots: storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.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.5.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.5.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.100.2)': + '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.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.5.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.5.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.101.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.100.2) + '@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.101.0) '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.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.5.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.5.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.100.2(webpack-cli@4.10.0) + webpack: 5.101.0(webpack-cli@4.10.0) optionalDependencies: '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.5.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.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) @@ -29952,13 +29945,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2)': + '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.101.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.100.2) + '@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.101.0) '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) optionalDependencies: '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.5.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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) @@ -29976,13 +29969,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.100.2)': + '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.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.100.2) + '@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.101.0) '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.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.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -29998,13 +29991,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.100.2)': + '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.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.100.2) + '@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.101.0) '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -30020,13 +30013,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.100.2)': + '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.101.0)': 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.100.2) + '@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.101.0) '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -30241,23 +30234,23 @@ snapshots: '@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.100.2) + '@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.101.0) '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.5.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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.44.0 - css-loader: 3.6.0(webpack@5.100.2) + css-loader: 3.6.0(webpack@5.101.0) express: 4.21.2 - file-loader: 6.2.0(webpack@5.100.2) + file-loader: 6.2.0(webpack@5.101.0) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.100.2) + html-webpack-plugin: 4.5.2(webpack@5.101.0) node-fetch: 2.7.0(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -30265,14 +30258,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.100.2) + style-loader: 1.3.0(webpack@5.101.0) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.100.2) + terser-webpack-plugin: 4.2.3(webpack@5.101.0) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.101.0) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -30292,23 +30285,23 @@ snapshots: '@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.100.2) + '@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.101.0) '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.44.0 - css-loader: 3.6.0(webpack@5.100.2) + css-loader: 3.6.0(webpack@5.101.0) express: 4.21.2 - file-loader: 6.2.0(webpack@5.100.2) + file-loader: 6.2.0(webpack@5.101.0) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.100.2) + html-webpack-plugin: 4.5.2(webpack@5.101.0) node-fetch: 2.7.0(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -30316,14 +30309,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.100.2) + style-loader: 1.3.0(webpack@5.101.0) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.100.2) + terser-webpack-plugin: 4.2.3(webpack@5.101.0) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.101.0) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -30343,23 +30336,23 @@ snapshots: '@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.100.2) + '@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.101.0) '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.44.0 - css-loader: 3.6.0(webpack@5.100.2) + css-loader: 3.6.0(webpack@5.101.0) express: 4.21.2 - file-loader: 6.2.0(webpack@5.100.2) + file-loader: 6.2.0(webpack@5.101.0) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.100.2) + html-webpack-plugin: 4.5.2(webpack@5.101.0) node-fetch: 2.7.0(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -30367,14 +30360,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.100.2) + style-loader: 1.3.0(webpack@5.101.0) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.100.2) + terser-webpack-plugin: 4.2.3(webpack@5.101.0) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@4.10.0) + webpack-dev-middleware: 3.7.3(webpack@5.101.0) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -30394,23 +30387,23 @@ snapshots: '@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.100.2) + '@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.101.0) '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.44.0 - css-loader: 3.6.0(webpack@5.100.2) + css-loader: 3.6.0(webpack@5.101.0) express: 4.21.2 - file-loader: 6.2.0(webpack@5.100.2) + file-loader: 6.2.0(webpack@5.101.0) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.100.2) + html-webpack-plugin: 4.5.2(webpack@5.101.0) node-fetch: 2.7.0(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -30418,14 +30411,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.100.2) + style-loader: 1.3.0(webpack@5.101.0) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.100.2) + terser-webpack-plugin: 4.2.3(webpack@5.101.0) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@6.0.1) - webpack-dev-middleware: 3.7.3(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@6.0.1) + webpack-dev-middleware: 3.7.3(webpack@5.101.0) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -30445,23 +30438,23 @@ snapshots: '@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.100.2) + '@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.101.0) '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.44.0 - css-loader: 3.6.0(webpack@5.100.2) + css-loader: 3.6.0(webpack@5.101.0) express: 4.21.2 - file-loader: 6.2.0(webpack@5.100.2) + file-loader: 6.2.0(webpack@5.101.0) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.100.2) + html-webpack-plugin: 4.5.2(webpack@5.101.0) node-fetch: 2.7.0(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@4.9.5) react: 19.1.0 @@ -30469,14 +30462,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.100.2) + style-loader: 1.3.0(webpack@5.101.0) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.100.2) + terser-webpack-plugin: 4.2.3(webpack@5.101.0) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0) util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.101.0) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 4.9.5 @@ -30496,21 +30489,21 @@ snapshots: '@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.100.2) + '@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.101.0) '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.44.0 - css-loader: 5.2.7(webpack@5.100.2) + css-loader: 5.2.7(webpack@5.101.0) express: 4.21.2 find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 5.6.3(webpack@5.100.2) + html-webpack-plugin: 5.6.3(webpack@5.101.0) node-fetch: 2.7.0(encoding@0.1.13) process: 0.11.10 react: 18.2.0 @@ -30518,13 +30511,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.100.2) + style-loader: 2.0.0(webpack@5.101.0) telejson: 6.0.8 - terser-webpack-plugin: 5.3.14(webpack@5.100.2) + terser-webpack-plugin: 5.3.14(webpack@5.101.0) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-dev-middleware: 4.3.0(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@4.10.0) + webpack-dev-middleware: 4.3.0(webpack@5.101.0) webpack-virtual-modules: 0.4.6 optionalDependencies: typescript: 5.8.3 @@ -30545,21 +30538,21 @@ snapshots: '@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.100.2) + '@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.101.0) '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.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.100.2) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.101.0) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.44.0 - css-loader: 5.2.7(webpack@5.100.2) + css-loader: 5.2.7(webpack@5.101.0) express: 4.21.2 find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 5.6.3(webpack@5.100.2) + html-webpack-plugin: 5.6.3(webpack@5.101.0) node-fetch: 2.7.0(encoding@0.1.13) process: 0.11.10 react: 18.2.0 @@ -30567,13 +30560,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.100.2) + style-loader: 2.0.0(webpack@5.101.0) telejson: 6.0.8 - terser-webpack-plugin: 5.3.14(webpack@5.100.2) + terser-webpack-plugin: 5.3.14(webpack@5.101.0) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@6.0.1) - webpack-dev-middleware: 4.3.0(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@6.0.1) + webpack-dev-middleware: 4.3.0(webpack@5.101.0) webpack-virtual-modules: 0.4.6 optionalDependencies: typescript: 5.8.3 @@ -30627,16 +30620,16 @@ snapshots: '@storybook/postinstall@7.4.6': {} - '@storybook/preset-react-webpack@7.4.6(@babel/core@7.28.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-dev-server@5.2.2(webpack@5.100.2))(webpack-hot-middleware@2.26.1)': + '@storybook/preset-react-webpack@7.4.6(@babel/core@7.28.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-dev-server@5.2.2(webpack@5.101.0))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.28.0) '@babel/preset-react': 7.27.1(@babel/core@7.28.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.2(webpack@5.100.2))(webpack-hot-middleware@2.26.1)(webpack@5.100.2) + '@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.101.0))(webpack-hot-middleware@2.26.1)(webpack@5.101.0) '@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.100.2) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.101.0) '@types/node': 16.18.126 '@types/semver': 7.7.0 babel-plugin-add-react-displayname: 0.0.5 @@ -30646,7 +30639,7 @@ snapshots: react-dom: 19.1.0(react@19.1.0) react-refresh: 0.11.0 semver: 7.7.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.28.0 typescript: 5.8.3 @@ -30668,7 +30661,7 @@ snapshots: 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.100.2) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.101.0) '@types/semver': 7.7.0 find-up: 5.0.0 magic-string: 0.30.17 @@ -30679,7 +30672,7 @@ snapshots: semver: 7.7.2 storybook: 8.6.14(prettier@3.5.3) tsconfig-paths: 4.2.0 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -30694,7 +30687,7 @@ snapshots: dependencies: '@storybook/core-webpack': 8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)) '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.18(@testing-library/dom@10.4.1)(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.100.2) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.101.0) '@types/semver': 7.7.0 find-up: 5.0.0 magic-string: 0.30.17 @@ -30705,7 +30698,7 @@ snapshots: semver: 7.7.2 storybook: 9.0.18(@testing-library/dom@10.4.1)(prettier@3.5.3) tsconfig-paths: 4.2.0 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -30802,7 +30795,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.100.2)': + '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.5)(webpack@5.101.0)': dependencies: debug: 4.4.1(supports-color@8.1.1) endent: 2.1.0 @@ -30812,11 +30805,11 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@4.9.5) tslib: 2.8.1 typescript: 4.9.5 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(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.100.2)': + '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.101.0)': dependencies: debug: 4.4.1(supports-color@8.1.1) endent: 2.1.0 @@ -30826,11 +30819,11 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(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.100.2)': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.101.0)': dependencies: debug: 4.4.1(supports-color@8.1.1) endent: 2.1.0 @@ -30840,7 +30833,7 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) transitivePeerDependencies: - supports-color @@ -30899,10 +30892,10 @@ snapshots: - supports-color - typescript - '@storybook/react-webpack5@7.4.6(@babel/core@7.28.0)(@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-dev-server@5.2.2(webpack@5.100.2))(webpack-hot-middleware@2.26.1)': + '@storybook/react-webpack5@7.4.6(@babel/core@7.28.0)(@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-dev-server@5.2.2(webpack@5.101.0))(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/preset-react-webpack': 7.4.6(@babel/core@7.28.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-dev-server@5.2.2(webpack@5.100.2))(webpack-hot-middleware@2.26.1) + '@storybook/preset-react-webpack': 7.4.6(@babel/core@7.28.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-dev-server@5.2.2(webpack@5.101.0))(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 react: 19.1.0 @@ -30970,15 +30963,15 @@ 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(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.100.2) + '@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.101.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(eslint@9.27.0(jiti@2.5.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.5.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.5.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.100.2) + '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.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.5.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.5.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.101.0) '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.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.100.2) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.101.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 @@ -31005,7 +30998,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.101.0(webpack-cli@4.10.0) optionalDependencies: '@babel/core': 7.27.7 '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) @@ -31034,15 +31027,15 @@ 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(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.100.2) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(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.101.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(eslint@9.27.0(jiti@2.5.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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2) + '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.5.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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.101.0) '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.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.100.2) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.101.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 @@ -31069,7 +31062,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) optionalDependencies: '@babel/core': 7.27.7 '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) @@ -31094,19 +31087,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.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.100.2))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.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.101.0))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.28.0) '@babel/preset-react': 7.27.1(@babel/core@7.28.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.2(webpack@5.100.2))(webpack-hot-middleware@2.26.1)(webpack@5.100.2) + '@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.101.0))(webpack-hot-middleware@2.26.1)(webpack@5.101.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(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.100.2) + '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0) '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.5.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.100.2) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.101.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 @@ -31133,7 +31126,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.28.0 typescript: 5.8.3 @@ -31156,19 +31149,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.101.0))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.28.0) '@babel/preset-react': 7.27.1(@babel/core@7.28.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.2(webpack@5.100.2))(webpack-hot-middleware@2.26.1)(webpack@5.100.2) + '@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.101.0))(webpack-hot-middleware@2.26.1)(webpack@5.101.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(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.100.2) + '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.101.0) '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.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.100.2) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.101.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 @@ -31195,7 +31188,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.28.0 typescript: 5.8.3 @@ -31218,19 +31211,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.100.2))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.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.101.0))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.28.0) '@babel/preset-react': 7.27.1(@babel/core@7.28.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.2(webpack@5.100.2))(webpack-hot-middleware@2.26.1)(webpack@5.100.2) + '@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.101.0))(webpack-hot-middleware@2.26.1)(webpack@5.101.0) '@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.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.100.2) + '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.5.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.101.0) '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.5.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.100.2) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.5)(webpack@5.101.0) '@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 @@ -31257,7 +31250,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.28.0 typescript: 4.9.5 @@ -32062,51 +32055,51 @@ snapshots: dependencies: apg-lite: 1.0.5 - '@swc/core-darwin-arm64@1.13.2': + '@swc/core-darwin-arm64@1.13.3': optional: true - '@swc/core-darwin-x64@1.13.2': + '@swc/core-darwin-x64@1.13.3': optional: true - '@swc/core-linux-arm-gnueabihf@1.13.2': + '@swc/core-linux-arm-gnueabihf@1.13.3': optional: true - '@swc/core-linux-arm64-gnu@1.13.2': + '@swc/core-linux-arm64-gnu@1.13.3': optional: true - '@swc/core-linux-arm64-musl@1.13.2': + '@swc/core-linux-arm64-musl@1.13.3': optional: true - '@swc/core-linux-x64-gnu@1.13.2': + '@swc/core-linux-x64-gnu@1.13.3': optional: true - '@swc/core-linux-x64-musl@1.13.2': + '@swc/core-linux-x64-musl@1.13.3': optional: true - '@swc/core-win32-arm64-msvc@1.13.2': + '@swc/core-win32-arm64-msvc@1.13.3': optional: true - '@swc/core-win32-ia32-msvc@1.13.2': + '@swc/core-win32-ia32-msvc@1.13.3': optional: true - '@swc/core-win32-x64-msvc@1.13.2': + '@swc/core-win32-x64-msvc@1.13.3': optional: true - '@swc/core@1.13.2(@swc/helpers@0.5.17)': + '@swc/core@1.13.3(@swc/helpers@0.5.17)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.23 optionalDependencies: - '@swc/core-darwin-arm64': 1.13.2 - '@swc/core-darwin-x64': 1.13.2 - '@swc/core-linux-arm-gnueabihf': 1.13.2 - '@swc/core-linux-arm64-gnu': 1.13.2 - '@swc/core-linux-arm64-musl': 1.13.2 - '@swc/core-linux-x64-gnu': 1.13.2 - '@swc/core-linux-x64-musl': 1.13.2 - '@swc/core-win32-arm64-msvc': 1.13.2 - '@swc/core-win32-ia32-msvc': 1.13.2 - '@swc/core-win32-x64-msvc': 1.13.2 + '@swc/core-darwin-arm64': 1.13.3 + '@swc/core-darwin-x64': 1.13.3 + '@swc/core-linux-arm-gnueabihf': 1.13.3 + '@swc/core-linux-arm64-gnu': 1.13.3 + '@swc/core-linux-arm64-musl': 1.13.3 + '@swc/core-linux-x64-gnu': 1.13.3 + '@swc/core-linux-x64-musl': 1.13.3 + '@swc/core-win32-arm64-msvc': 1.13.3 + '@swc/core-win32-ia32-msvc': 1.13.3 + '@swc/core-win32-x64-msvc': 1.13.3 '@swc/helpers': 0.5.17 '@swc/counter@0.1.3': {} @@ -32591,7 +32584,7 @@ snapshots: '@types/node@16.18.126': {} - '@types/node@18.19.120': + '@types/node@18.19.121': dependencies: undici-types: 5.26.5 @@ -32798,7 +32791,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.2.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -32810,7 +32803,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.2.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.101.0(webpack-cli@4.10.0) transitivePeerDependencies: - '@swc/core' - esbuild @@ -32822,7 +32815,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.2.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -32833,7 +32826,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.2.2 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -33826,64 +33819,64 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.100.2)': + '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.101.0)': dependencies: - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@4.10.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.101.0) - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.100.2)': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.101.0)': dependencies: - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.101.0) - '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.100.2)': + '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.101.0)': dependencies: - webpack: 5.100.2(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.101.0) '@webpack-cli/info@1.5.0(webpack-cli@4.10.0)': dependencies: envinfo: 7.14.0 - webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.100.2) + webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.101.0) - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.100.2)': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.101.0)': dependencies: - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.101.0) - '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.100.2)': + '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.101.0)': dependencies: - webpack: 5.100.2(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.101.0) '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)': dependencies: - webpack-cli: 4.10.0(webpack@5.100.2) + webpack-cli: 4.10.0(webpack@5.101.0) '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)(webpack-dev-server@5.2.2)': dependencies: - webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.100.2) + webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.101.0) optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@4.10.0)(webpack@5.100.2) + webpack-dev-server: 5.2.2(webpack-cli@4.10.0)(webpack@5.101.0) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack@5.100.2)': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack@5.101.0)': dependencies: - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.101.0) optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.100.2) + webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.101.0) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.100.2)': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.101.0)': dependencies: - webpack: 5.100.2(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.0) optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) + webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.101.0) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack@5.100.2)': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack@5.101.0)': dependencies: - webpack: 5.100.2(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.101.0) '@xmldom/xmldom@0.7.13': {} @@ -34410,7 +34403,7 @@ snapshots: autoprefixer@10.4.21(postcss@8.5.6): dependencies: browserslist: 4.25.1 - caniuse-lite: 1.0.30001727 + caniuse-lite: 1.0.30001731 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -34420,7 +34413,7 @@ snapshots: autoprefixer@6.7.7: dependencies: browserslist: 1.7.7 - caniuse-db: 1.0.30001727 + caniuse-db: 1.0.30001731 normalize-range: 0.1.2 num2fraction: 1.2.2 postcss: 5.2.18 @@ -34429,7 +34422,7 @@ snapshots: autoprefixer@7.1.6: dependencies: browserslist: 2.11.3 - caniuse-lite: 1.0.30001727 + caniuse-lite: 1.0.30001731 normalize-range: 0.1.2 num2fraction: 1.2.2 postcss: 6.0.23 @@ -34438,7 +34431,7 @@ snapshots: autoprefixer@9.8.8: dependencies: browserslist: 4.25.1 - caniuse-lite: 1.0.30001727 + caniuse-lite: 1.0.30001731 normalize-range: 0.1.2 num2fraction: 1.2.2 picocolors: 0.2.1 @@ -34457,12 +34450,6 @@ snapshots: axe-core@4.10.3: {} - axios@0.21.0: - dependencies: - follow-redirects: 1.15.9 - transitivePeerDependencies: - - debug - axios@1.9.0: dependencies: follow-redirects: 1.15.9 @@ -34658,43 +34645,43 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@10.0.0(@babel/core@7.27.7)(webpack@5.100.2): + babel-loader@10.0.0(@babel/core@7.27.7)(webpack@5.101.0): dependencies: '@babel/core': 7.27.7 find-up: 5.0.0 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) - babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.100.2): + babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.101.0): 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.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) - babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.28.0))(webpack@5.100.2): + babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.28.0))(webpack@5.101.0): dependencies: babel-core: 7.0.0-bridge.0(@babel/core@7.28.0) find-cache-dir: 1.0.0 loader-utils: 1.4.2 mkdirp: 0.5.6 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) - babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.100.2): + babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.101.0): 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.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) - babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.100.2): + babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.101.0): dependencies: '@babel/core': 7.27.7 find-cache-dir: 4.0.0 schema-utils: 4.3.2 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) babel-messages@6.23.0: dependencies: @@ -35079,7 +35066,7 @@ snapshots: '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.7) '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.7) - babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.7): + babel-preset-current-node-syntax@1.1.1(@babel/core@7.27.7): dependencies: '@babel/core': 7.27.7 '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.7) @@ -35154,7 +35141,7 @@ snapshots: dependencies: '@babel/core': 7.27.7 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.7) + babel-preset-current-node-syntax: 1.1.1(@babel/core@7.27.7) babel-preset-react-app@3.1.2(babel-runtime@6.26.0): dependencies: @@ -35396,18 +35383,18 @@ snapshots: browserslist@1.7.7: dependencies: - caniuse-db: 1.0.30001727 - electron-to-chromium: 1.5.191 + caniuse-db: 1.0.30001731 + electron-to-chromium: 1.5.192 browserslist@2.11.3: dependencies: - caniuse-lite: 1.0.30001727 - electron-to-chromium: 1.5.191 + caniuse-lite: 1.0.30001731 + electron-to-chromium: 1.5.192 browserslist@4.25.1: dependencies: - caniuse-lite: 1.0.30001727 - electron-to-chromium: 1.5.191 + caniuse-lite: 1.0.30001731 + electron-to-chromium: 1.5.192 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.1) @@ -35656,20 +35643,20 @@ snapshots: caniuse-api@1.6.1: dependencies: browserslist: 1.7.7 - caniuse-db: 1.0.30001727 + caniuse-db: 1.0.30001731 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 caniuse-api@3.0.0: dependencies: browserslist: 4.25.1 - caniuse-lite: 1.0.30001727 + caniuse-lite: 1.0.30001731 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-db@1.0.30001727: {} + caniuse-db@1.0.30001731: {} - caniuse-lite@1.0.30001727: {} + caniuse-lite@1.0.30001731: {} capture-exit@2.0.0: dependencies: @@ -36179,14 +36166,14 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@13.0.0(webpack@5.100.2): + copy-webpack-plugin@13.0.0(webpack@5.101.0): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 schema-utils: 4.3.2 serialize-javascript: 6.0.2 tinyglobby: 0.2.14 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) copyfiles@2.4.1: dependencies: @@ -36397,7 +36384,7 @@ snapshots: postcss-value-parser: 3.3.1 source-list-map: 2.0.1 - css-loader@3.6.0(webpack@5.100.2): + css-loader@3.6.0(webpack@5.101.0): dependencies: camelcase: 5.3.1 cssesc: 3.0.0 @@ -36412,9 +36399,9 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.1 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) - css-loader@5.2.7(webpack@5.100.2): + css-loader@5.2.7(webpack@5.101.0): dependencies: icss-utils: 5.1.0(postcss@8.5.6) loader-utils: 2.0.4 @@ -36426,9 +36413,9 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 3.3.0 semver: 7.7.2 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) - css-loader@6.11.0(webpack@5.100.2): + css-loader@6.11.0(webpack@5.101.0): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -36439,9 +36426,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.2 optionalDependencies: - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) - css-loader@7.1.2(webpack@5.100.2): + css-loader@7.1.2(webpack@5.101.0): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -36452,7 +36439,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.2 optionalDependencies: - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) css-select@4.3.0: dependencies: @@ -37081,7 +37068,7 @@ snapshots: dependencies: jake: 10.9.2 - electron-to-chromium@1.5.191: {} + electron-to-chromium@1.5.192: {} email-addresses@5.0.0: {} @@ -38087,12 +38074,12 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - extract-text-webpack-plugin@3.0.2(webpack@5.100.2): + extract-text-webpack-plugin@3.0.2(webpack@5.101.0): dependencies: async: 2.6.4 loader-utils: 1.4.2 schema-utils: 0.3.0 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) webpack-sources: 1.4.3 extract-zip@1.7.0: @@ -38250,17 +38237,17 @@ snapshots: minimatch: 3.1.2 proper-lockfile: 1.2.0 - file-loader@1.1.5(webpack@5.100.2): + file-loader@1.1.5(webpack@5.101.0): dependencies: loader-utils: 1.4.2 schema-utils: 0.3.0 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) - file-loader@6.2.0(webpack@5.100.2): + file-loader@6.2.0(webpack@5.101.0): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) file-system-cache@1.1.0: dependencies: @@ -38468,7 +38455,7 @@ snapshots: forever-agent@0.6.1: {} - fork-ts-checker-webpack-plugin@0.2.10(typescript@5.8.3)(webpack@5.100.2): + fork-ts-checker-webpack-plugin@0.2.10(typescript@5.8.3)(webpack@5.101.0): dependencies: babel-code-frame: 6.26.0 chalk: 1.1.3 @@ -38479,7 +38466,7 @@ snapshots: lodash.startswith: 4.2.1 minimatch: 3.1.2 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) fork-ts-checker-webpack-plugin@4.1.6: dependencies: @@ -38491,7 +38478,7 @@ snapshots: tapable: 1.1.3 worker-rpc: 0.1.1 - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.100.2): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.26.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.101.0): dependencies: '@babel/code-frame': 7.27.1 '@types/json-schema': 7.0.15 @@ -38507,11 +38494,11 @@ snapshots: semver: 7.7.2 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) optionalDependencies: eslint: 9.26.0(jiti@2.5.1) - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@4.9.5)(webpack@5.100.2): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@4.9.5)(webpack@5.101.0): dependencies: '@babel/code-frame': 7.27.1 '@types/json-schema': 7.0.15 @@ -38527,11 +38514,11 @@ snapshots: semver: 7.7.2 tapable: 1.1.3 typescript: 4.9.5 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) optionalDependencies: eslint: 9.27.0(jiti@2.5.1) - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.100.2): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.5.1))(typescript@5.8.3)(webpack@5.101.0): dependencies: '@babel/code-frame': 7.27.1 '@types/json-schema': 7.0.15 @@ -38547,11 +38534,11 @@ snapshots: semver: 7.7.2 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) optionalDependencies: eslint: 9.27.0(jiti@2.5.1) - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.100.2): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.101.0): dependencies: '@babel/code-frame': 7.27.1 chalk: 4.1.2 @@ -38566,9 +38553,9 @@ snapshots: semver: 7.7.2 tapable: 2.2.2 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.8.3)(webpack@5.100.2): + fork-ts-checker-webpack-plugin@9.1.0(typescript@5.8.3)(webpack@5.101.0): dependencies: '@babel/code-frame': 7.27.1 chalk: 4.1.2 @@ -38583,7 +38570,7 @@ snapshots: semver: 7.7.2 tapable: 2.2.2 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) form-data-encoder@2.1.4: {} @@ -39499,7 +39486,7 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@2.29.0(webpack@5.100.2): + html-webpack-plugin@2.29.0(webpack@5.101.0): dependencies: bluebird: 3.7.2 html-minifier: 3.5.21 @@ -39507,9 +39494,9 @@ snapshots: lodash: 4.17.21 pretty-error: 2.1.2 toposort: 1.0.7 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) - html-webpack-plugin@4.5.2(webpack@5.100.2): + html-webpack-plugin@4.5.2(webpack@5.101.0): dependencies: '@types/html-minifier-terser': 5.1.2 '@types/tapable': 1.0.12 @@ -39520,9 +39507,9 @@ snapshots: pretty-error: 2.1.2 tapable: 1.1.3 util.promisify: 1.0.0 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) - html-webpack-plugin@5.6.3(webpack@5.100.2): + html-webpack-plugin@5.6.3(webpack@5.101.0): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -39530,7 +39517,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.2 optionalDependencies: - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) htmlparser2@10.0.0: dependencies: @@ -41159,7 +41146,7 @@ snapshots: '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.7) + babel-preset-current-node-syntax: 1.1.1(@babel/core@7.27.7) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -42856,11 +42843,11 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.9.2(webpack@5.100.2): + mini-css-extract-plugin@2.9.2(webpack@5.101.0): dependencies: schema-utils: 4.3.2 tapable: 2.2.2 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.101.0(webpack-cli@4.10.0) minim@0.23.8: dependencies: @@ -43035,11 +43022,11 @@ snapshots: moment@2.30.1: {} - monaco-editor-webpack-plugin@7.1.0(monaco-editor@0.52.2)(webpack@5.100.2): + monaco-editor-webpack-plugin@7.1.0(monaco-editor@0.52.2)(webpack@5.101.0): dependencies: loader-utils: 2.0.4 monaco-editor: 0.52.2 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) monaco-editor@0.44.0: {} @@ -43240,10 +43227,10 @@ snapshots: node-int64@0.4.0: {} - node-loader@2.1.0(webpack@5.100.2): + node-loader@2.1.0(webpack@5.101.0): dependencies: loader-utils: 2.0.4 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.101.0(webpack-cli@4.10.0) node-notifier@5.4.5: dependencies: @@ -44152,7 +44139,7 @@ snapshots: postcss-load-config: 1.2.0 schema-utils: 0.3.0 - postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.100.2): + postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.101.0): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 @@ -44160,16 +44147,16 @@ snapshots: postcss: 7.0.39 schema-utils: 3.3.0 semver: 7.7.2 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) - postcss-loader@8.1.1(postcss@8.5.6)(typescript@5.8.3)(webpack@5.100.2): + postcss-loader@8.1.1(postcss@8.5.6)(typescript@5.8.3)(webpack@5.101.0): dependencies: cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 1.21.7 postcss: 8.5.6 semver: 7.7.2 optionalDependencies: - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) transitivePeerDependencies: - typescript @@ -44798,11 +44785,11 @@ snapshots: iconv-lite: 0.6.3 unpipe: 1.0.0 - raw-loader@4.0.2(webpack@5.100.2): + raw-loader@4.0.2(webpack@5.101.0): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) rc-config-loader@4.1.3: dependencies: @@ -45070,7 +45057,7 @@ snapshots: react-is@18.3.1: {} - react-is@19.1.0: {} + react-is@19.1.1: {} react-json-view-lite@2.4.1(react@18.2.0): dependencies: @@ -45204,18 +45191,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.100.2) + babel-loader: 7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.101.0) 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.100.2) - file-loader: 1.1.5(webpack@5.100.2) - fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.100.2) + extract-text-webpack-plugin: 3.0.2(webpack@5.101.0) + file-loader: 1.1.5(webpack@5.101.0) + fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.101.0) fs-extra: 3.0.1 - html-webpack-plugin: 2.29.0(webpack@5.100.2) + html-webpack-plugin: 2.29.0(webpack@5.101.0) jest: 20.0.4 object-assign: 4.1.1 postcss-flexbugs-fixes: 3.2.0 @@ -45226,7 +45213,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.100.2) + sw-precache-webpack-plugin: 0.11.4(webpack@5.101.0) 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 @@ -45234,11 +45221,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.100.2) - url-loader: 0.6.2(file-loader@1.1.5(webpack@5.100.2)) - webpack: 5.100.2(webpack-cli@6.0.1) - webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) - webpack-manifest-plugin: 1.3.2(webpack@5.100.2) + uglifyjs-webpack-plugin: 1.2.5(webpack@5.101.0) + url-loader: 0.6.2(file-loader@1.1.5(webpack@5.101.0)) + webpack: 5.101.0(webpack-cli@6.0.1) + webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.101.0) + webpack-manifest-plugin: 1.3.2(webpack@5.101.0) whatwg-fetch: 2.0.3 optionalDependencies: fsevents: 1.2.13 @@ -45258,18 +45245,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.28.0))(webpack@5.100.2) + babel-loader: 7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.28.0))(webpack@5.101.0) 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.100.2) - file-loader: 1.1.5(webpack@5.100.2) - fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.100.2) + extract-text-webpack-plugin: 3.0.2(webpack@5.101.0) + file-loader: 1.1.5(webpack@5.101.0) + fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.101.0) fs-extra: 3.0.1 - html-webpack-plugin: 2.29.0(webpack@5.100.2) + html-webpack-plugin: 2.29.0(webpack@5.101.0) jest: 20.0.4 object-assign: 4.1.1 postcss-flexbugs-fixes: 3.2.0 @@ -45280,7 +45267,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.100.2) + sw-precache-webpack-plugin: 0.11.4(webpack@5.101.0) 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 @@ -45288,11 +45275,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.100.2) - url-loader: 0.6.2(file-loader@1.1.5(webpack@5.100.2)) - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-dev-server: 5.2.2(webpack@5.100.2) - webpack-manifest-plugin: 1.3.2(webpack@5.100.2) + uglifyjs-webpack-plugin: 1.2.5(webpack@5.101.0) + url-loader: 0.6.2(file-loader@1.1.5(webpack@5.101.0)) + webpack: 5.101.0(webpack-cli@5.1.4) + webpack-dev-server: 5.2.2(webpack@5.101.0) + webpack-manifest-plugin: 1.3.2(webpack@5.101.0) whatwg-fetch: 2.0.3 optionalDependencies: fsevents: 1.2.13 @@ -45346,10 +45333,10 @@ snapshots: react: 18.2.0 refractor: 3.6.0 - react-test-renderer@19.1.0(react@18.2.0): + react-test-renderer@19.1.1(react@18.2.0): dependencies: react: 18.2.0 - react-is: 19.1.0 + react-is: 19.1.1 scheduler: 0.26.0 react-textarea-autosize@8.5.9(@types/react@18.2.0)(react@18.2.0): @@ -46144,13 +46131,13 @@ snapshots: scss-tokenizer: 0.4.3 yargs: 17.7.2 - sass-loader@16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.100.2): + sass-loader@16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.101.0): dependencies: neo-async: 2.6.2 optionalDependencies: node-sass: 9.0.0 sass: 1.89.2 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) sass@1.89.2: dependencies: @@ -46573,11 +46560,11 @@ snapshots: async: 2.6.4 loader-utils: 1.4.2 - source-map-loader@5.0.0(webpack@5.100.2): + source-map-loader@5.0.0(webpack@5.101.0): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) source-map-resolve@0.6.0: dependencies: @@ -46993,25 +46980,25 @@ snapshots: loader-utils: 1.4.2 schema-utils: 0.3.0 - style-loader@1.3.0(webpack@5.100.2): + style-loader@1.3.0(webpack@5.101.0): dependencies: loader-utils: 2.0.4 schema-utils: 2.7.1 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) - style-loader@2.0.0(webpack@5.100.2): + style-loader@2.0.0(webpack@5.101.0): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) - style-loader@3.3.4(webpack@5.100.2): + style-loader@3.3.4(webpack@5.101.0): dependencies: - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) - style-loader@4.0.0(webpack@5.100.2): + style-loader@4.0.0(webpack@5.101.0): dependencies: - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) style-mod@4.1.2: {} @@ -47149,10 +47136,10 @@ snapshots: svg-tags@1.0.0: {} - svg-url-loader@8.0.0(webpack@5.100.2): + svg-url-loader@8.0.0(webpack@5.101.0): dependencies: - file-loader: 6.2.0(webpack@5.100.2) - webpack: 5.100.2(webpack-cli@6.0.1) + file-loader: 6.2.0(webpack@5.101.0) + webpack: 5.101.0(webpack-cli@6.0.1) svg2ttf@4.3.0: dependencies: @@ -47211,12 +47198,12 @@ snapshots: svgpath@2.6.0: {} - sw-precache-webpack-plugin@0.11.4(webpack@5.100.2): + sw-precache-webpack-plugin@0.11.4(webpack@5.101.0): dependencies: del: 2.2.2 sw-precache: 5.2.1 uglify-js: 3.19.3 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) sw-precache@5.2.1: dependencies: @@ -47341,11 +47328,11 @@ snapshots: - '@types/react' - debug - swc-loader@0.2.6(@swc/core@1.13.2(@swc/helpers@0.5.17))(webpack@5.100.2): + swc-loader@0.2.6(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0): dependencies: - '@swc/core': 1.13.2(@swc/helpers@0.5.17) + '@swc/core': 1.13.3(@swc/helpers@0.5.17) '@swc/counter': 0.1.3 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) swr@2.3.4(react@18.2.0): dependencies: @@ -47525,7 +47512,7 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@4.2.3(webpack@5.100.2): + terser-webpack-plugin@4.2.3(webpack@5.101.0): dependencies: cacache: 15.3.0 find-cache-dir: 3.3.2 @@ -47535,28 +47522,28 @@ snapshots: serialize-javascript: 5.0.1 source-map: 0.6.1 terser: 5.43.1 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) webpack-sources: 1.4.3 - terser-webpack-plugin@5.3.14(@swc/core@1.13.2(@swc/helpers@0.5.17))(webpack@5.100.2): + terser-webpack-plugin@5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0): dependencies: '@jridgewell/trace-mapping': 0.3.29 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.43.1 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) optionalDependencies: - '@swc/core': 1.13.2(@swc/helpers@0.5.17) + '@swc/core': 1.13.3(@swc/helpers@0.5.17) - terser-webpack-plugin@5.3.14(webpack@5.100.2): + terser-webpack-plugin@5.3.14(webpack@5.101.0): dependencies: '@jridgewell/trace-mapping': 0.3.29 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.43.1 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) terser@4.8.1: dependencies: @@ -47869,7 +47856,7 @@ snapshots: loader-utils: 1.4.2 semver: 5.7.2 - ts-loader@9.5.2(typescript@5.8.3)(webpack@5.100.2): + ts-loader@9.5.2(typescript@5.8.3)(webpack@5.101.0): dependencies: chalk: 4.1.2 enhanced-resolve: 5.18.2 @@ -47877,7 +47864,7 @@ snapshots: semver: 7.7.2 source-map: 0.7.6 typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) ts-mixer@6.0.4: {} @@ -48271,7 +48258,7 @@ snapshots: commander: 2.19.0 source-map: 0.6.1 - uglifyjs-webpack-plugin@1.2.5(webpack@5.100.2): + uglifyjs-webpack-plugin@1.2.5(webpack@5.101.0): dependencies: cacache: 10.0.4 find-cache-dir: 1.0.0 @@ -48279,7 +48266,7 @@ snapshots: serialize-javascript: 1.9.1 source-map: 0.6.1 uglify-es: 3.3.9 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) webpack-sources: 1.4.3 worker-farm: 1.7.0 @@ -48542,21 +48529,21 @@ snapshots: url-join@4.0.1: {} - url-loader@0.6.2(file-loader@1.1.5(webpack@5.100.2)): + url-loader@0.6.2(file-loader@1.1.5(webpack@5.101.0)): dependencies: - file-loader: 1.1.5(webpack@5.100.2) + file-loader: 1.1.5(webpack@5.101.0) 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.100.2))(webpack@5.100.2): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.101.0))(webpack@5.101.0): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) optionalDependencies: - file-loader: 6.2.0(webpack@5.100.2) + file-loader: 6.2.0(webpack@5.101.0) url-parse-lax@1.0.0: dependencies: @@ -48987,10 +48974,10 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-cli@4.10.0(webpack-dev-server@5.2.2)(webpack@5.100.2): + webpack-cli@4.10.0(webpack-dev-server@5.2.2)(webpack@5.101.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.100.2) + '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.101.0) '@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) colorette: 2.0.20 @@ -49000,15 +48987,15 @@ snapshots: import-local: 3.2.0 interpret: 2.2.0 rechoir: 0.7.1 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.101.0(webpack-cli@4.10.0) webpack-merge: 5.10.0 optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@4.10.0)(webpack@5.100.2) + webpack-dev-server: 5.2.2(webpack-cli@4.10.0)(webpack@5.101.0) - webpack-cli@4.10.0(webpack@5.100.2): + webpack-cli@4.10.0(webpack@5.101.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.100.2) + '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.101.0) '@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 @@ -49018,15 +49005,15 @@ snapshots: import-local: 3.2.0 interpret: 2.2.0 rechoir: 0.7.1 - webpack: 5.100.2(webpack-cli@4.10.0) + webpack: 5.101.0(webpack-cli@4.10.0) webpack-merge: 5.10.0 - webpack-cli@5.1.4(webpack-dev-server@5.2.2)(webpack@5.100.2): + webpack-cli@5.1.4(webpack-dev-server@5.2.2)(webpack@5.101.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.100.2) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.100.2) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack@5.100.2) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.101.0) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.101.0) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack@5.101.0) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.6 @@ -49035,17 +49022,17 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) webpack-merge: 5.10.0 optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.100.2) + webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.101.0) - webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2): + webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.0): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.100.2) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.100.2) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.100.2) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.0) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.0) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.101.0) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -49054,17 +49041,17 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) webpack-merge: 6.0.1 optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) + webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.101.0) - webpack-cli@6.0.1(webpack@5.100.2): + webpack-cli@6.0.1(webpack@5.101.0): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.100.2) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.100.2) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack@5.100.2) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.0) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.0) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.0) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -49073,19 +49060,19 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) webpack-merge: 6.0.1 - webpack-dev-middleware@3.7.3(webpack@5.100.2): + webpack-dev-middleware@3.7.3(webpack@5.101.0): dependencies: memory-fs: 0.4.1 mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) webpack-log: 2.0.0 - webpack-dev-middleware@4.3.0(webpack@5.100.2): + webpack-dev-middleware@4.3.0(webpack@5.101.0): dependencies: colorette: 1.4.0 mem: 8.1.1 @@ -49093,9 +49080,9 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 3.3.0 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) - webpack-dev-middleware@6.1.3(webpack@5.100.2): + webpack-dev-middleware@6.1.3(webpack@5.101.0): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -49103,9 +49090,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.2 optionalDependencies: - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) - webpack-dev-middleware@7.4.2(webpack@5.100.2): + webpack-dev-middleware@7.4.2(webpack@5.101.0): dependencies: colorette: 2.0.20 memfs: 4.23.0 @@ -49114,9 +49101,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.2 optionalDependencies: - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) - webpack-dev-server@5.2.2(webpack-cli@4.10.0)(webpack@5.100.2): + webpack-dev-server@5.2.2(webpack-cli@4.10.0)(webpack@5.101.0): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -49144,11 +49131,11 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.100.2) + webpack-dev-middleware: 7.4.2(webpack@5.101.0) ws: 8.18.3 optionalDependencies: - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@4.10.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.101.0) transitivePeerDependencies: - bufferutil - debug @@ -49156,7 +49143,7 @@ snapshots: - utf-8-validate optional: true - webpack-dev-server@5.2.2(webpack-cli@5.1.4)(webpack@5.100.2): + webpack-dev-server@5.2.2(webpack-cli@5.1.4)(webpack@5.101.0): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -49184,18 +49171,18 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.100.2) + webpack-dev-middleware: 7.4.2(webpack@5.101.0) ws: 8.18.3 optionalDependencies: - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.101.0) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-dev-server@5.2.2(webpack-cli@6.0.1)(webpack@5.100.2): + webpack-dev-server@5.2.2(webpack-cli@6.0.1)(webpack@5.101.0): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -49223,18 +49210,18 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.100.2) + webpack-dev-middleware: 7.4.2(webpack@5.101.0) ws: 8.18.3 optionalDependencies: - webpack: 5.100.2(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2) + webpack: 5.101.0(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.101.0) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-dev-server@5.2.2(webpack@5.100.2): + webpack-dev-server@5.2.2(webpack@5.101.0): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -49262,19 +49249,19 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.100.2) + webpack-dev-middleware: 7.4.2(webpack@5.101.0) ws: 8.18.3 optionalDependencies: - webpack: 5.100.2(webpack-cli@5.1.4) + webpack: 5.101.0(webpack-cli@5.1.4) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-filter-warnings-plugin@1.2.1(webpack@5.100.2): + webpack-filter-warnings-plugin@1.2.1(webpack@5.101.0): dependencies: - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) webpack-hot-middleware@2.26.1: dependencies: @@ -49287,18 +49274,18 @@ snapshots: ansi-colors: 3.2.4 uuid: 3.4.0 - webpack-manifest-plugin@1.3.2(webpack@5.100.2): + webpack-manifest-plugin@1.3.2(webpack@5.101.0): dependencies: fs-extra: 0.30.0 lodash: 4.17.21 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) - webpack-merge-and-include-globally@2.3.4(webpack@5.100.2): + webpack-merge-and-include-globally@2.3.4(webpack@5.101.0): dependencies: es6-promisify: 6.1.1 glob: 7.2.3 rev-hash: 3.0.0 - webpack: 5.100.2(webpack-cli@6.0.1) + webpack: 5.101.0(webpack-cli@6.0.1) webpack-merge@5.10.0: dependencies: @@ -49333,7 +49320,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.100.2(@swc/core@1.13.2(@swc/helpers@0.5.17)): + webpack@5.101.0(@swc/core@1.13.3(@swc/helpers@0.5.17)): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -49357,7 +49344,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.2 tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(@swc/core@1.13.2(@swc/helpers@0.5.17))(webpack@5.100.2) + terser-webpack-plugin: 5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.101.0) watchpack: 2.4.4 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -49365,7 +49352,7 @@ snapshots: - esbuild - uglify-js - webpack@5.100.2(webpack-cli@4.10.0): + webpack@5.101.0(webpack-cli@4.10.0): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -49389,17 +49376,17 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.2 tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(webpack@5.100.2) + terser-webpack-plugin: 5.3.14(webpack@5.101.0) watchpack: 2.4.4 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.100.2) + webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.101.0) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.100.2(webpack-cli@5.1.4): + webpack@5.101.0(webpack-cli@5.1.4): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -49423,17 +49410,17 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.2 tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(webpack@5.100.2) + terser-webpack-plugin: 5.3.14(webpack@5.101.0) watchpack: 2.4.4 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.100.2) + webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.101.0) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.100.2(webpack-cli@6.0.1): + webpack@5.101.0(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -49457,11 +49444,11 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.2 tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(webpack@5.100.2) + terser-webpack-plugin: 5.3.14(webpack@5.101.0) watchpack: 2.4.4 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 6.0.1(webpack@5.100.2) + webpack-cli: 6.0.1(webpack@5.101.0) transitivePeerDependencies: - '@swc/core' - esbuild diff --git a/common/config/rush/repo-state.json b/common/config/rush/repo-state.json index 663f3645412..845b7df44f6 100644 --- a/common/config/rush/repo-state.json +++ b/common/config/rush/repo-state.json @@ -1,4 +1,4 @@ // DO NOT MODIFY THIS FILE MANUALLY BUT DO COMMIT IT. It is generated and used by Rush. { - "preferredVersionsHash": "c351cbadf9c7c5170fa3cda955a26147a9053fcd" + "preferredVersionsHash": "545aa5567807e638a49c81c678391b3af8a46865" } diff --git a/package.json b/package.json index 3cdf1ca4b8f..224a80c7e6e 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "micromatch": "^4.0.8", "esbuild": "^0.25.0", "xmldom": "npm:@xmldom/xmldom@^0.8.10", - "@eslint/plugin-kit": "^0.3.3", + "@eslint/plugin-kit": "^0.3.4", "on-headers": "^1.1.0", "form-data": "^4.0.4" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 14cfcd65e87..5d46a147143 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,7 +14,7 @@ overrides: micromatch: ^4.0.8 esbuild: ^0.25.0 xmldom: npm:@xmldom/xmldom@^0.8.10 - '@eslint/plugin-kit': ^0.3.3 + '@eslint/plugin-kit': ^0.3.4 on-headers: ^1.1.0 form-data: ^4.0.4 @@ -5844,7 +5844,7 @@ packages: resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.3': + '@eslint/plugin-kit@0.3.4': resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -24997,7 +24997,7 @@ snapshots: '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.3.3': + '@eslint/plugin-kit@0.3.4': dependencies: '@eslint/core': 0.15.1 levn: 0.4.1 @@ -38162,7 +38162,7 @@ snapshots: '@eslint/core': 0.13.0 '@eslint/eslintrc': 3.3.1 '@eslint/js': 9.26.0 - '@eslint/plugin-kit': 0.3.3 + '@eslint/plugin-kit': 0.3.4 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -38206,7 +38206,7 @@ snapshots: '@eslint/core': 0.14.0 '@eslint/eslintrc': 3.3.1 '@eslint/js': 9.27.0 - '@eslint/plugin-kit': 0.3.3 + '@eslint/plugin-kit': 0.3.4 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 diff --git a/workspaces/common-libs/ui-toolkit/package.json b/workspaces/common-libs/ui-toolkit/package.json index 0151a5fb2bd..d221f13b2d3 100644 --- a/workspaces/common-libs/ui-toolkit/package.json +++ b/workspaces/common-libs/ui-toolkit/package.json @@ -33,7 +33,6 @@ "@vscode/codicons": "0.0.36", "@vscode/webview-ui-toolkit": "~1.4.0", "@wso2/font-wso2-vscode": "workspace:*", - "axios": "0.21.0", "classnames": "^2.5.1", "lodash": "~4.17.21", "monaco-editor": "~0.52.2", From 44dc9822bbacfe01d2c7a9afe5e22e917e2f7037 Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Wed, 30 Jul 2025 09:48:49 +0530 Subject: [PATCH 259/349] Add resource view navigation --- .../src/components/TitleBar/index.tsx | 2 +- .../ServiceClassDesigner.tsx | 2 +- .../api-services/graphql-service.spec.ts | 125 +++++------ .../api-services/graphqlUtils.ts | 202 +++++++----------- .../test/e2e-playwright-tests/test.list.ts | 62 +++--- 5 files changed, 159 insertions(+), 234 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/components/TitleBar/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/components/TitleBar/index.tsx index 3521ba23e30..9e900f6ca1d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/components/TitleBar/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/components/TitleBar/index.tsx @@ -123,7 +123,7 @@ export function TitleBar(props: TitleBarProps) { {!hideBack && ( - + )} diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceClassEditor/ServiceClassDesigner.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceClassEditor/ServiceClassDesigner.tsx index 359122803a7..f29f0508e34 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceClassEditor/ServiceClassDesigner.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/ServiceClassEditor/ServiceClassDesigner.tsx @@ -499,7 +499,7 @@ export function ServiceClassDesigner(props: ServiceClassDesignerProps) {
Class Variables - handleAddVariable()}> + handleAddVariable()}> Variable diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts index b7de97a3611..a8fc138c8d4 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts @@ -15,11 +15,13 @@ * specific language governing permissions and limitations * under the License. */ -import { test } from '@playwright/test'; +import { Frame, test } from '@playwright/test'; import { addArtifact, initTest, page } from '../utils'; import { Form, switchToIFrame } from '@wso2/playwright-vscode-tester'; import { ProjectExplorer } from '../ProjectExplorer'; import { TEST_DATA, GraphQLServiceUtils} from './graphqlUtils'; +import { TypeEditorUtils } from '../type/TypeEditorUtils'; +import { t } from 'xstate'; export default function createTests() { @@ -27,36 +29,35 @@ export default function createTests() { tag: '@group1', }, async () => { initTest(); + + // Global utility instances for all tests + let graphqlServiceUtils: GraphQLServiceUtils; + let typeEditorUtils: TypeEditorUtils; + let artifactWebView: Frame; + + // Setup utilities before each test + test.beforeEach(async () => { + artifactWebView = await switchToIFrame('WSO2 Integrator: BI', page.page); + if (!artifactWebView) { + throw new Error('WSO2 Integrator: BI webview not found'); + } + graphqlServiceUtils = new GraphQLServiceUtils(page.page, artifactWebView); + typeEditorUtils = new TypeEditorUtils(page.page, artifactWebView); + }); + test('Create GraphQL Service', async ({ }, testInfo) => { const testAttempt = testInfo.retry + 1; console.log('Creating a new service in test attempt: ', testAttempt); // Creating a HTTP Service await addArtifact('GraphQL Service', 'graphql-service-card'); - const artifactWebView = await switchToIFrame('WSO2 Integrator: BI', page.page); - if (!artifactWebView) { - throw new Error('WSO2 Integrator: BI webview not found'); - } - const sampleName = TEST_DATA.service.basePath(testAttempt); const form = new Form(page.page, 'WSO2 Integrator: BI', artifactWebView); await form.switchToFormView(false, artifactWebView); - await form.fill({ - values: { - 'Service Base Path*': { - type: 'input', - value: sampleName, - } - } - }); await form.submit('Create'); // Check if the type diagram canvas is visible const typeDiagram = artifactWebView.locator('[data-testid="type-diagram"]'); await typeDiagram.waitFor(); - // Check if the service name is visible - const context = artifactWebView.locator(`text=${sampleName}`).first(); - await context.waitFor(); - // Check if the AI Chat Agent is created in the project explorer const projectExplorer = new ProjectExplorer(page.page); await projectExplorer.findItem(['sample', `GraphQL Service`], true); @@ -70,16 +71,12 @@ export default function createTests() { test('Editing GraphQL Service', async ({ }, testInfo) => { const testAttempt = testInfo.retry + 1; console.log('Editing a service in test attempt: ', testAttempt); - const artifactWebView = await switchToIFrame('WSO2 Integrator: BI', page.page); - if (!artifactWebView) { - throw new Error('WSO2 Integrator: BI webview not found'); - } const editBtn = artifactWebView.locator('[data-testid="edit-service-btn"]'); await editBtn.waitFor(); await editBtn.click({ force: true }); const form = new Form(page.page, 'WSO2 Integrator: BI', artifactWebView); await form.switchToFormView(false, artifactWebView); - const sampleName = TEST_DATA.service.editedBasePath(testAttempt); + const sampleName = TEST_DATA.editedBasePath(testAttempt); await form.fill({ values: { 'Service Base Path*': { @@ -102,56 +99,42 @@ export default function createTests() { test('Create Operations in GraphQL Service', async ({ }, testInfo) => { const testAttempt = testInfo.retry + 1; console.log('Creating operations in test attempt: ', testAttempt); - const artifactWebView = await switchToIFrame('WSO2 Integrator: BI', page.page); - if (!artifactWebView) { - throw new Error('WSO2 Integrator: BI webview not found'); - } - - const graphqlServiceUtils = new GraphQLServiceUtils(page.page,artifactWebView); - - await graphqlServiceUtils.clickButtonByTestId( 'create-operation-button'); - await graphqlServiceUtils.addGraphQLOperation( 'query', TEST_DATA.query.name, TEST_DATA.query.fieldType); - await graphqlServiceUtils.addGraphQLOperation( 'mutation', TEST_DATA.mutation[0].name, TEST_DATA.mutation[0].fieldType); - await graphqlServiceUtils.addGraphQLOperation( 'subscription', TEST_DATA.subscription.name, TEST_DATA.subscription.fieldType); - await graphqlServiceUtils.clickButtonByTestId( 'close-panel-btn'); + await graphqlServiceUtils.clickButtonByTestId('create-operation-button'); + await graphqlServiceUtils.addGraphQLOperation('query', TEST_DATA.query.name, TEST_DATA.query.fieldType); + await graphqlServiceUtils.addGraphQLOperation('mutation', TEST_DATA.mutation[0].name, TEST_DATA.mutation[0].fieldType); + await graphqlServiceUtils.addGraphQLOperation('subscription', TEST_DATA.subscription.name, TEST_DATA.subscription.fieldType); }); test('Add types and arguments to GraphQL Service', async ({ }, testInfo) => { const testAttempt = testInfo.retry + 1; console.log('Adding types and arguments in test attempt: ', testAttempt); - const artifactWebView = await switchToIFrame('WSO2 Integrator: BI', page.page); - if (!artifactWebView) { - throw new Error('WSO2 Integrator: BI webview not found'); - } - - const graphqlServiceUtils = new GraphQLServiceUtils(page.page, artifactWebView); - await graphqlServiceUtils.clickButtonByTestId( 'graphql-add-mutation-btn'); + await graphqlServiceUtils.clickButtonByTestId('graphql-add-mutation-btn'); await graphqlServiceUtils.addArgumentToGraphQLService(); await graphqlServiceUtils.createInputObjectFromScratch(); await graphqlServiceUtils.addOutputObject(); await artifactWebView.getByRole('textbox', { name: 'Field Name*The name of the' }).fill(TEST_DATA.mutation[1].name); - await artifactWebView.waitForTimeout(5000); // Wait for the field name to be set - const saveButton = artifactWebView.getByRole('button', { name: 'Save' }); - await saveButton.click(); + await artifactWebView.getByRole('button', { name: 'Save' }).click(); - // if the the button is not showing saving then again click on the save button - while (await saveButton.isVisible()) { - await saveButton.click(); - } - }); + await artifactWebView.getByTestId('close-panel-btn').click({ force: true }); + const outputName = TEST_DATA.mutation[1].outputType; + await typeEditorUtils.verifyTypeLink(TEST_DATA.editedBasePath(testAttempt), TEST_DATA.mutation[1].name, outputName); + await typeEditorUtils.verifyTypeNodeExists(outputName); - test('Edit and Delete Operations in GraphQL Service', async ({ }, testInfo) => { + await artifactWebView.getByTestId(`type-node-${outputName}`).getByText(`${outputName}`).click(); + await artifactWebView.getByTestId('side-panel').getByText('function1').click(); + await artifactWebView.getByTestId('back-button').click(); + await graphqlServiceUtils.addFunction("function1", "string"); + }); + + test('Edit and Delete Operations in GraphQL Service', async ({ }, testInfo) => { const testAttempt = testInfo.retry + 1; console.log('Adding types and arguments in test attempt: ', testAttempt); - const artifactWebView = await switchToIFrame('WSO2 Integrator: BI', page.page); - if (!artifactWebView) { - throw new Error('WSO2 Integrator: BI webview not found'); - } - const saveButton = artifactWebView.getByRole('button', { name: 'Save' }); + const editedBasePath = TEST_DATA.editedBasePath(testAttempt); + await artifactWebView.getByTestId(`type-node-${editedBasePath}`).getByText(`${editedBasePath}`).click({ force: true }); const editButton = await artifactWebView.getByTestId(`edit-button-${TEST_DATA.mutation[0].name}`); await editButton.click(); @@ -159,29 +142,19 @@ export default function createTests() { const mutationNameInput = artifactWebView.getByRole('textbox', { name: 'Mutation Name*The name of the mutation' }); await mutationNameInput.waitFor({ state: 'visible', timeout: 10000 }); await mutationNameInput.fill(TEST_DATA.mutation[0].editedName); - await saveButton.click(); + await artifactWebView.getByRole('button', { name: 'Save' }).click(); // Delete the mutation await artifactWebView.getByTestId(`delete-button-${TEST_DATA.mutation[0].editedName}`).click(); - await artifactWebView.waitForTimeout(5000); // Wait for the delete confirmation dialog to appear await artifactWebView.getByRole('button', { name: 'Okay' }).click(); - await artifactWebView.waitForTimeout(5000); // Wait for the delete confirmation dialog to close - }); - - test('Navigate to respective flow diagram', async ({ }, testInfo) => { - const artifactWebView = await switchToIFrame('WSO2 Integrator: BI', page.page); - if (!artifactWebView) { - throw new Error('WSO2 Integrator: BI webview not found'); - } - - const saveButton = artifactWebView.getByRole('button', { name: 'Save' }); + }); - await artifactWebView.getByTestId('side-panel').getByText(TEST_DATA.mutation[1].name).click(); - await artifactWebView.getByTestId('link-add-button-undefined').click(); - await artifactWebView.getByText('Return').click(); - await artifactWebView.getByRole('textbox', { name: 'Expression' }).fill(TEST_DATA.mutation[1].expression); - await saveButton.click(); - await artifactWebView.getByText('GraphQL Diagram').click(); + test('Navigate to respective flow diagram', async ({ }, testInfo) => { + await artifactWebView.getByTestId('side-panel').getByText(TEST_DATA.mutation[1].name).click(); + await artifactWebView.getByTestId('link-add-button-undefined').click(); + await artifactWebView.getByText('Return').click(); + await artifactWebView.getByRole('textbox', { name: 'Expression' }).fill(TEST_DATA.mutation[1].expression); + await artifactWebView.getByRole('button', { name: 'Save' }).click(); + }); }); -}); -} +} \ No newline at end of file diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts index 79ccf816ee6..2e7b110c259 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts @@ -16,14 +16,12 @@ * under the License. */ import { Frame,Page } from '@playwright/test'; -// import { page } from '../utils'; +import { TypeEditorUtils } from '../type/TypeEditorUtils'; +import { Form } from '@wso2/playwright-vscode-tester'; // Centralized test data for all GraphQL service E2E tests export const TEST_DATA = { - service: { - basePath: (attempt: number) => `/sample${attempt}`, - editedBasePath: (attempt: number) => `/editedSample${attempt}`, - }, + editedBasePath: (attempt: number) => `/editedSample${attempt}`, query: { name: 'query1', fieldType: 'string', @@ -32,15 +30,15 @@ export const TEST_DATA = { name: 'mutation1', editedName: 'editedMutation1', fieldType: 'boolean', + },{ + name: 'mutation2', + fieldType: 'float', + expression: '"Hello World!"', arguments: [ { name: 'arg1', type: 'string' }, { name: 'arg2', type: 'mytype1' }, ], outputType: 'outputtype1', - },{ - name: 'mutation2', - fieldType: 'float', - expression: '"Hello World!"', }], subscription: { name: 'subscription1', @@ -61,28 +59,52 @@ export class GraphQLServiceUtils { const addBtn = this.webView.getByTestId(addBtnTestId); await addBtn.click(); - const fieldNameBox = this.webView.getByRole('textbox', { name: /Field Name/i }); + await this.setSidePanel({ + fieldName: { value: name, label: 'Field Name' }, + fieldType: { value: fieldType, label: 'Field Type' } + }); + } + + async addFunction(name: string, returnType: string) { + await this.webView.getByTestId('type-node-outputtype1').getByText('outputtype1').click(); + await this.webView.getByRole('button', { name: '   Implement' }).click(); + await this.webView.getByTestId('add-variable-button').click({ force: true }); + await this.setSidePanel({ + fieldName: { value: TEST_DATA.mutation[1].arguments[0].name, label: 'Variable Name' }, + fieldType: { value: TEST_DATA.mutation[1].arguments[0].type, label: 'Variable Type' } + }); + await this.webView.getByTestId('back-button').click(); + } + + private async setSidePanel(params: { + fieldName: { value: string; label: string }; + fieldType: { value: string; label: string }; + }) { + const { fieldName, fieldType } = params; + + const fieldNameBox = this.webView.getByRole('textbox', { name: fieldName.label }); await fieldNameBox.waitFor({ state: 'visible', timeout: 10000 }); - await fieldNameBox.fill(name); + await fieldNameBox.fill(fieldName.value); - const fieldTypeBox = this.webView.getByRole('textbox', { name: /Field Type/i }); + const fieldTypeBox = this.webView.getByRole('textbox', { name: fieldType.label }); await fieldTypeBox.waitFor({ state: 'visible', timeout: 10000 }); - // await fieldTypeBox.click(); - await fieldTypeBox.fill(fieldType); + await fieldTypeBox.fill(fieldType.value); // Wait a short moment to allow UI to register the value - await this.page.waitForTimeout(5000); + await this.page.waitForTimeout(10000); const fieldDefaultCompletion = this.webView.getByTestId('add-type-completion'); await fieldDefaultCompletion.waitFor({ state: 'visible', timeout: 10000 }); - if (fieldDefaultCompletion.isVisible()) { + if (await fieldDefaultCompletion.isVisible()) { await fieldTypeBox.press('Escape'); } - const saveBtn = this.webView.getByRole('button', { name: /Save/i }); + const saveBtn = this.webView.getByRole('button', { name: 'Save' }); await saveBtn.waitFor({ state: 'visible', timeout: 10000 }); await saveBtn.click(); - } + await this.page.waitForTimeout(2000); + await this.page.waitForLoadState('domcontentloaded'); + } async clickButtonByTestId(testId: string) { const button = this.webView.getByTestId(testId); @@ -94,24 +116,46 @@ export class GraphQLServiceUtils { const createFromScratchTab = this.webView.getByTestId('create-from-scratch-tab'); await this.webView.getByRole('textbox', { name: 'Field Type' }).click(); await this.webView.getByText('Create New Type').click(); - await this.webView.getByTestId('type-kind-dropdown').locator('svg').click(); - await this.webView.getByRole('option', { name: 'Object' }).click(); - await createFromScratchTab.getByRole('textbox', { name: 'Name' }).fill(TEST_DATA.mutation[0].outputType); + + const form = new Form(this.page, 'WSO2 Integrator: BI', this.webView); + await form.switchToFormView(false, this.webView); + await form.fill({ + values: { + 'Name': { + type: 'input', + value: TEST_DATA.mutation[1].outputType, + }, + 'Kind': { + type: 'dropdown', + value: 'Object', + } + } + }); + const typeEditorUtils = new TypeEditorUtils(this.page, this.webView); + await typeEditorUtils.addFunction("function1", "string"); await this.webView.getByTestId('type-create-save').getByRole('button', { name: 'Save' }).click(); } async createInputObjectFromScratch() { + const form = new Form(this.page, 'WSO2 Integrator: BI', this.webView); await this.webView.getByText('Add Argument').click(); await this.webView.getByRole('textbox', { name: 'Argument Type' }).click(); await this.webView.getByText('Create New Type').click(); - await this.webView.locator('slot', { hasText: /^Input Object$/ }).click(); - await this.webView.getByRole('option', { name: 'Input Object' }).click(); + await form.fill({ + values: { + 'Name': { + type: 'input', + value: TEST_DATA.mutation[1].arguments[1].type, + }, + 'Kind': { + type: 'dropdown', + value: 'Input Object', + } + } + }); - // Fill name for the new input object type - const createFromScratchTab = this.webView.getByTestId('create-from-scratch-tab'); - await createFromScratchTab.getByRole('textbox', { name: 'Name' }).fill(TEST_DATA.mutation[0].arguments[1].type); await this.webView.getByTestId('type-create-save').getByRole('button', { name: 'Save' }).click(); - await this.webView.getByRole('textbox', { name: 'Argument Name*The name of the' }).fill(TEST_DATA.mutation[0].arguments[1].name); + await this.webView.getByRole('textbox', { name: 'Argument Name*The name of the' }).fill(TEST_DATA.mutation[1].arguments[1].name); await this.webView.getByRole('button', { name: 'Add' }).click(); } @@ -119,103 +163,11 @@ export class GraphQLServiceUtils { await this.webView.getByText('Add Argument').click(); await this.webView.getByRole('textbox', { name: 'Argument Type' }).click(); await this.webView.getByTitle('string', { exact: true }).click(); - await this.webView.getByRole('textbox', { name: 'Argument Name*The name of the' }).fill(TEST_DATA.mutation[0].arguments[0].name); + await this.webView.getByRole('textbox', { name: 'Argument Name*The name of the' }).fill(TEST_DATA.mutation[1].arguments[0].name); await this.webView.getByRole('button', { name: 'Add' }).click(); } -} -// /** -// * Utility to add a GraphQL operation (mutation, subscription, etc.) -// * @param artifactWebView - The Playwright frame/locator for the webview -// * @param operationType - 'mutation' | 'subscription' | 'query' -// * @param name - The name to use for the operation -// * @param fieldType - The type to use for the field (e.g., 'boolean', 'float', etc.) -// */ -// export async function addGraphQLOperation(artifactWebView: Frame, operationType: string, name: string, fieldType: string) { -// const addBtnTestId = `graphql-add-${operationType}-btn`; -// await artifactWebView.getByTestId(addBtnTestId).waitFor({ state: 'visible', timeout: 10000 }); -// const addBtn = artifactWebView.getByTestId(addBtnTestId); -// await addBtn.click(); - -// const fieldNameBox = artifactWebView.getByRole('textbox', { name: /Field Name/i }); -// await fieldNameBox.waitFor({ state: 'visible', timeout: 10000 }); -// await fieldNameBox.fill(name); - -// const fieldTypeBox = artifactWebView.getByRole('textbox', { name: /Field Type/i }); -// await fieldTypeBox.waitFor({ state: 'visible', timeout: 10000 }); -// // await fieldTypeBox.click(); -// await fieldTypeBox.fill(fieldType); - -// // Wait a short moment to allow UI to register the value -// await page.page.waitForTimeout(5000); -// const fieldDefaultCompletion = artifactWebView.getByTestId('add-type-completion'); -// await fieldDefaultCompletion.waitFor({ state: 'visible', timeout: 10000 }); - -// if (fieldDefaultCompletion.isVisible()) { -// await fieldTypeBox.press('Escape'); -// } - -// const saveBtn = artifactWebView.getByRole('button', { name: /Save/i }); -// await saveBtn.waitFor({ state: 'visible', timeout: 10000 }); -// await saveBtn.click(); -// } - -// /** -// * Click a button in the artifact webview by test id -// * @param artifactWebView - The Playwright frame/locator for the webview -// * @param testId - The test id of the button to click -// */ -// export async function clickButtonByTestId(artifactWebView: Frame, testId: string) { -// const button = artifactWebView.getByTestId(testId); -// await button.waitFor({ state: 'visible', timeout: 10000 }); -// await button.click(); -// } - -// /** -// * Create an output object type in the GraphQL service -// * @param artifactWebView - The Playwright frame/locator for the webview -// */ -// export async function addOutputObject(artifactWebView: Frame) { -// const createFromScratchTab = artifactWebView.getByTestId('create-from-scratch-tab'); -// await artifactWebView.getByRole('textbox', { name: 'Field Type' }).click(); -// await artifactWebView.getByText('Create New Type').click(); -// await artifactWebView.getByTestId('type-kind-dropdown').locator('svg').click(); -// await artifactWebView.getByRole('option', { name: 'Object' }).click(); -// await createFromScratchTab.getByRole('textbox', { name: 'Name' }).fill(TEST_DATA.mutation[0].outputType); -// await artifactWebView.getByTestId('type-create-save').getByRole('button', { name: 'Save' }).click(); -// } - -// /** -// * Create an input object type from scratch in the GraphQL service -// * @param artifactWebView - The Playwright frame/locator for the webview -// */ -// export async function createInputObjectFromScratch(artifactWebView: Frame) { -// await artifactWebView.getByText('Add Argument').click(); -// await artifactWebView.getByRole('textbox', { name: 'Argument Type' }).click(); -// await artifactWebView.getByText('Create New Type').click(); -// await artifactWebView.locator('slot', { hasText: /^Input Object$/ }).click(); -// await artifactWebView.getByRole('option', { name: 'Input Object' }).click(); - -// // Fill name for the new input object type -// const createFromScratchTab = artifactWebView.getByTestId('create-from-scratch-tab'); -// await createFromScratchTab.getByRole('textbox', { name: 'Name' }).fill(TEST_DATA.mutation[0].arguments[1].type); -// await artifactWebView.getByTestId('type-create-save').getByRole('button', { name: 'Save' }).click(); -// await artifactWebView.getByRole('textbox', { name: 'Argument Name*The name of the' }).fill(TEST_DATA.mutation[0].arguments[1].name); -// await artifactWebView.getByRole('button', { name: 'Add' }).click(); -// } - -// /** -// * Add an argument to a GraphQL service -// * @param artifactWebView - The Playwright frame/locator for the webview -// */ -// export async function addArgumentToGraphQLService(artifactWebView: Frame) { -// await artifactWebView.getByText('Add Argument').click(); -// await artifactWebView.getByRole('textbox', { name: 'Argument Type' }).click(); -// await artifactWebView.getByTitle('string', { exact: true }).click(); -// await artifactWebView.getByRole('textbox', { name: 'Argument Name*The name of the' }).fill(TEST_DATA.mutation[0].arguments[0].name); -// await artifactWebView.getByRole('button', { name: 'Add' }).click(); -// } - - - - - \ No newline at end of file + + async waitForElement(locator: any, timeout = 10000) { + await locator.waitFor({ state: 'visible', timeout }); + } +} \ No newline at end of file diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test.list.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test.list.ts index 8059d7fb925..d4d64a2b899 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test.list.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test.list.ts @@ -58,40 +58,40 @@ test.beforeAll(async () => { console.log('>>> Starting test suite'); }); -// // <----Automation Test----> -// test.describe(automation); +// <----Automation Test----> +test.describe(automation); -// // <----AI Chat Service Test----> -// test.describe(aiChatService); +// <----AI Chat Service Test----> +test.describe(aiChatService); -// // <----Integration as API Test----> -// test.describe(httpService); +// <----Integration as API Test----> +test.describe(httpService); test.describe(graphqlService); -// test.describe(tcpService); - -// // <----Event Integration Test----> -// test.describe(kafkaIntegration); -// test.describe(rabbitmqIntegration); -// test.describe(mqttIntegration); -// test.describe(azureIntegration); -// test.describe(salesforceIntegration); -// test.describe(twillioIntegration); -// test.describe(githubIntegration); - -// // <----File Integration Test----> -// test.describe(ftpIntegration); -// test.describe(directoryIntegration); - -// // <----Other Artifacts Test----> -// test.describe(functionArtifact); -// test.describe(naturalFunctionArtifact); -// test.describe(dataMapperArtifact); // TODO: Fix this test -// test.describe(typeDiagramArtifact); // TODO: Fix this test -// test.describe(connectionArtifact); -// test.describe(configuration); // TODO: Fix this test - -// test.describe(configuration); -// test.describe(typeTest); +test.describe(tcpService); + +// <----Event Integration Test----> +test.describe(kafkaIntegration); +test.describe(rabbitmqIntegration); +test.describe(mqttIntegration); +test.describe(azureIntegration); +test.describe(salesforceIntegration); +test.describe(twillioIntegration); +test.describe(githubIntegration); + +// <----File Integration Test----> +test.describe(ftpIntegration); +test.describe(directoryIntegration); + +// <----Other Artifacts Test----> +test.describe(functionArtifact); +test.describe(naturalFunctionArtifact); +test.describe(dataMapperArtifact); // TODO: Fix this test +test.describe(typeDiagramArtifact); // TODO: Fix this test +test.describe(connectionArtifact); +test.describe(configuration); // TODO: Fix this test + +test.describe(configuration); +test.describe(typeTest); test.afterAll(async () => { console.log(`>>> Finished test suite`); From 56ea17aa82207c5d89d734a094c5237038f0ec7f Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Wed, 30 Jul 2025 10:14:46 +0530 Subject: [PATCH 260/349] add group4 to mi ui tests --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cfa48d64021..8b988bd7edf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -401,7 +401,7 @@ jobs: strategy: fail-fast: false matrix: - group: [group1, group2, group3] + group: [group1, group2, group3, group4] steps: - name: Restore build uses: actions/download-artifact@v4 From 01259772e68aea2846e5db322e82ed6eb765e714 Mon Sep 17 00:00:00 2001 From: samithkavishke Date: Wed, 30 Jul 2025 11:11:03 +0530 Subject: [PATCH 261/349] Add consistent waiting for e2e tests --- .../api-services/graphql-service.spec.ts | 8 +-- .../api-services/graphqlUtils.ts | 11 ++-- .../test/e2e-playwright-tests/test.list.ts | 62 +++++++++---------- 3 files changed, 41 insertions(+), 40 deletions(-) diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts index a8fc138c8d4..98409b0c1a7 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts @@ -21,8 +21,6 @@ import { Form, switchToIFrame } from '@wso2/playwright-vscode-tester'; import { ProjectExplorer } from '../ProjectExplorer'; import { TEST_DATA, GraphQLServiceUtils} from './graphqlUtils'; import { TypeEditorUtils } from '../type/TypeEditorUtils'; -import { t } from 'xstate'; - export default function createTests() { test.describe('GraphQL Service Tests', { @@ -89,7 +87,7 @@ export default function createTests() { // Check if the type diagram canvas is visible const typeDiagram = artifactWebView.locator('[data-testid="type-diagram"]'); - await typeDiagram.waitFor({ state: 'visible', timeout: 30000 }); + await typeEditorUtils.waitForElement(typeDiagram); // Check if the service name is visible const context = artifactWebView.locator(`text=${sampleName}`).first(); @@ -122,6 +120,8 @@ export default function createTests() { const outputName = TEST_DATA.mutation[1].outputType; await typeEditorUtils.verifyTypeLink(TEST_DATA.editedBasePath(testAttempt), TEST_DATA.mutation[1].name, outputName); await typeEditorUtils.verifyTypeNodeExists(outputName); + // TODO: Verify the argument type node exists + // await typeEditorUtils.verifyTypeNodeExists(TEST_DATA.mutation[1].arguments[1].name); await artifactWebView.getByTestId(`type-node-${outputName}`).getByText(`${outputName}`).click(); await artifactWebView.getByTestId('side-panel').getByText('function1').click(); @@ -140,7 +140,7 @@ export default function createTests() { // Fill mutation name const mutationNameInput = artifactWebView.getByRole('textbox', { name: 'Mutation Name*The name of the mutation' }); - await mutationNameInput.waitFor({ state: 'visible', timeout: 10000 }); + await typeEditorUtils.waitForElement(mutationNameInput); await mutationNameInput.fill(TEST_DATA.mutation[0].editedName); await artifactWebView.getByRole('button', { name: 'Save' }).click(); diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts index 2e7b110c259..a0473096f95 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts @@ -83,24 +83,25 @@ export class GraphQLServiceUtils { const { fieldName, fieldType } = params; const fieldNameBox = this.webView.getByRole('textbox', { name: fieldName.label }); - await fieldNameBox.waitFor({ state: 'visible', timeout: 10000 }); + await this.waitForElement(fieldNameBox); await fieldNameBox.fill(fieldName.value); const fieldTypeBox = this.webView.getByRole('textbox', { name: fieldType.label }); - await fieldTypeBox.waitFor({ state: 'visible', timeout: 10000 }); + await this.waitForElement(fieldTypeBox); await fieldTypeBox.fill(fieldType.value); // Wait a short moment to allow UI to register the value await this.page.waitForTimeout(10000); const fieldDefaultCompletion = this.webView.getByTestId('add-type-completion'); - await fieldDefaultCompletion.waitFor({ state: 'visible', timeout: 10000 }); + await this.waitForElement(fieldDefaultCompletion); + // TODO: https://github.com/wso2/product-ballerina-integrator/issues/917 if (await fieldDefaultCompletion.isVisible()) { await fieldTypeBox.press('Escape'); } const saveBtn = this.webView.getByRole('button', { name: 'Save' }); - await saveBtn.waitFor({ state: 'visible', timeout: 10000 }); + await this.waitForElement(saveBtn); await saveBtn.click(); await this.page.waitForTimeout(2000); await this.page.waitForLoadState('domcontentloaded'); @@ -108,7 +109,7 @@ export class GraphQLServiceUtils { async clickButtonByTestId(testId: string) { const button = this.webView.getByTestId(testId); - await button.waitFor({ state: 'visible', timeout: 10000 }); + await this.waitForElement(button); await button.click(); } diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test.list.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test.list.ts index d4d64a2b899..8059d7fb925 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test.list.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test.list.ts @@ -58,40 +58,40 @@ test.beforeAll(async () => { console.log('>>> Starting test suite'); }); -// <----Automation Test----> -test.describe(automation); +// // <----Automation Test----> +// test.describe(automation); -// <----AI Chat Service Test----> -test.describe(aiChatService); +// // <----AI Chat Service Test----> +// test.describe(aiChatService); -// <----Integration as API Test----> -test.describe(httpService); +// // <----Integration as API Test----> +// test.describe(httpService); test.describe(graphqlService); -test.describe(tcpService); - -// <----Event Integration Test----> -test.describe(kafkaIntegration); -test.describe(rabbitmqIntegration); -test.describe(mqttIntegration); -test.describe(azureIntegration); -test.describe(salesforceIntegration); -test.describe(twillioIntegration); -test.describe(githubIntegration); - -// <----File Integration Test----> -test.describe(ftpIntegration); -test.describe(directoryIntegration); - -// <----Other Artifacts Test----> -test.describe(functionArtifact); -test.describe(naturalFunctionArtifact); -test.describe(dataMapperArtifact); // TODO: Fix this test -test.describe(typeDiagramArtifact); // TODO: Fix this test -test.describe(connectionArtifact); -test.describe(configuration); // TODO: Fix this test - -test.describe(configuration); -test.describe(typeTest); +// test.describe(tcpService); + +// // <----Event Integration Test----> +// test.describe(kafkaIntegration); +// test.describe(rabbitmqIntegration); +// test.describe(mqttIntegration); +// test.describe(azureIntegration); +// test.describe(salesforceIntegration); +// test.describe(twillioIntegration); +// test.describe(githubIntegration); + +// // <----File Integration Test----> +// test.describe(ftpIntegration); +// test.describe(directoryIntegration); + +// // <----Other Artifacts Test----> +// test.describe(functionArtifact); +// test.describe(naturalFunctionArtifact); +// test.describe(dataMapperArtifact); // TODO: Fix this test +// test.describe(typeDiagramArtifact); // TODO: Fix this test +// test.describe(connectionArtifact); +// test.describe(configuration); // TODO: Fix this test + +// test.describe(configuration); +// test.describe(typeTest); test.afterAll(async () => { console.log(`>>> Finished test suite`); From 85890cbc4444fbce486de412df3680a9defc4abe Mon Sep 17 00:00:00 2001 From: Chinthaka Jayatilake <37581983+ChinthakaJ98@users.noreply.github.com> Date: Wed, 30 Jul 2025 11:30:51 +0530 Subject: [PATCH 262/349] Add open project option to the welcome page --- .../projectTests/createProject.spec.ts | 3 ++ .../mi-extension/src/visualizer/activate.ts | 28 ++++++++++++++++-- .../mi/mi-visualizer/src/constants/index.ts | 1 + .../src/views/WelcomeView/index.tsx | 29 +++++++++++-------- 4 files changed, 47 insertions(+), 14 deletions(-) diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/projectTests/createProject.spec.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/projectTests/createProject.spec.ts index ff5f32e5760..63044138314 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/projectTests/createProject.spec.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/projectTests/createProject.spec.ts @@ -68,6 +68,9 @@ export default function createTests() { await textInput?.fill(newProjectPath + '/newProject/'); const openBtn = await fileInput?.waitForSelector('a.monaco-button:has-text("Open MI Project")'); await openBtn?.click(); + const newWindowButton = page.page.getByRole('button', { name: 'New Window' }); + await newWindowButton.waitFor({ timeout: 10000 }); + await newWindowButton.click(); const addArtifactSelector = '.tab-label:has-text("Add Artifact")'; await page.page.waitForSelector(addArtifactSelector, { state: 'visible' }); await page.page.waitForSelector(addArtifactSelector, { state: 'attached' }); diff --git a/workspaces/mi/mi-extension/src/visualizer/activate.ts b/workspaces/mi/mi-extension/src/visualizer/activate.ts index 2345c343192..fee9bd6c8ed 100644 --- a/workspaces/mi/mi-extension/src/visualizer/activate.ts +++ b/workspaces/mi/mi-extension/src/visualizer/activate.ts @@ -17,7 +17,7 @@ */ import * as vscode from 'vscode'; -import { commands, window } from 'vscode'; +import { commands, window, workspace } from 'vscode'; import { getStateMachine, navigate, openView, refreshUI } from '../stateMachine'; import { COMMANDS, REFRESH_ENABLED_DOCUMENTS, SWAGGER_LANG_ID, SWAGGER_REL_DIR } from '../constants'; import { EVENT_TYPE, MACHINE_VIEW, onDocumentSave } from '@wso2/mi-core'; @@ -42,6 +42,22 @@ export function activateVisualizer(context: vscode.ExtensionContext, firstProjec window.showOpenDialog({ canSelectFolders: true, canSelectFiles: true, filters: { 'CAPP': ['car', 'zip'] }, openLabel: 'Open MI Project' }) .then(uri => { if (uri && uri[0]) { + const handleOpenProject = (folderUri: vscode.Uri) => { + window.showInformationMessage('Where would you like to open the project?', + { modal: true }, + 'Current Window', + 'New Window' + ).then(selection => { + if (selection === "Current Window") { + const workspaceFolders = workspace.workspaceFolders || []; + if (!workspaceFolders.some(folder => folder.uri.fsPath === folderUri.fsPath)) { + workspace.updateWorkspaceFolders(workspaceFolders.length, 0, { uri: folderUri }); + } + } else if (selection === "New Window") { + commands.executeCommand('vscode.openFolder', folderUri); + } + }); + }; if (uri[0].fsPath.endsWith('.car') || uri[0].fsPath.endsWith('.zip')) { window.showInformationMessage('A car file (CAPP) is selected.\n Do you want to extract it?', { modal: true }, 'Extract') .then(option => { @@ -50,12 +66,20 @@ export function activateVisualizer(context: vscode.ExtensionContext, firstProjec .then(extractUri => { if (extractUri && extractUri[0]) { importCapp({ source: uri[0].fsPath, directory: extractUri[0].fsPath, open: false }); + handleOpenProject(extractUri[0]); } }); } }); } else { - commands.executeCommand('vscode.openFolder', uri[0]); + const webview = [...webviews.values()].find(webview => webview.getWebview()?.active) || [...webviews.values()][0]; + const projectUri = webview ? webview.getProjectUri() : firstProject; + const projectOpened = getStateMachine(projectUri).context().projectOpened; + if (projectOpened) { + handleOpenProject(uri[0]); + } else { + commands.executeCommand('vscode.openFolder', uri[0]); + } } } }); diff --git a/workspaces/mi/mi-visualizer/src/constants/index.ts b/workspaces/mi/mi-visualizer/src/constants/index.ts index 52c4795d5b5..998837ad6ca 100644 --- a/workspaces/mi/mi-visualizer/src/constants/index.ts +++ b/workspaces/mi/mi-visualizer/src/constants/index.ts @@ -54,6 +54,7 @@ export const gitIssueUrl = "https://github.com/wso2/mi-vscode/issues"; export const COMMANDS = { MIGRATE_PROJECT: "MI.migrateProject", + OPEN_PROJECT: "MI.openProject" } // Actions for service designer diff --git a/workspaces/mi/mi-visualizer/src/views/WelcomeView/index.tsx b/workspaces/mi/mi-visualizer/src/views/WelcomeView/index.tsx index 75c1a2d2bf5..09e63d3523e 100644 --- a/workspaces/mi/mi-visualizer/src/views/WelcomeView/index.tsx +++ b/workspaces/mi/mi-visualizer/src/views/WelcomeView/index.tsx @@ -25,6 +25,7 @@ import { Button, Codicon, ComponentCard } from "@wso2/ui-toolkit"; import { ProjectWizard } from "../Forms/ProjectForm"; import { VSCodeButton, VSCodeLink } from "@vscode/webview-ui-toolkit/react"; import { ImportProjectWizard } from "../Forms/ImportProjectForm"; +import { COMMANDS } from "../../constants"; const TextWrapper = styled.div` display: flex; @@ -142,6 +143,10 @@ export function WelcomeView() { }); } + const goToOpenProject = async () => { + await rpcClient.getMiDiagramRpcClient().executeCommand({ commands: [COMMANDS.OPEN_PROJECT] }); + } + const handleMoreSamples = () => { rpcClient.getMiVisualizerRpcClient().openView({ type: EVENT_TYPE.OPEN_VIEW, @@ -195,18 +200,18 @@ export function WelcomeView() {
- {/* this has to be given in the activity for an old project - Import - Import an existing project. - - */} + + Open Project + Open an existing integration project. + + Troubleshooting Experiencing problems? Start with our Troubleshooting Guide. From c79011440cf5d6b1a652afc0856f3b760d010f90 Mon Sep 17 00:00:00 2001 From: kaumini Date: Wed, 30 Jul 2025 11:44:43 +0530 Subject: [PATCH 263/349] fix componentTitle in node list being multilined --- .../ballerina-side-panel/src/components/NodeList/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 44d68a0de11..4cfe3773c16 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx @@ -367,7 +367,7 @@ export function NodeList(props: NodeListProps) { if (el && el.scrollWidth > el.clientWidth) { el.style.fontSize = "13px"; el.style.wordBreak = "break-word"; - el.style.whiteSpace = "normal"; + el.style.whiteSpace = "nowrap"; } }} > From bc73fd63be7ea18dc7c0f2bd6d4cc3a2aac08ff8 Mon Sep 17 00:00:00 2001 From: tharindulak Date: Wed, 30 Jul 2025 15:13:12 +0530 Subject: [PATCH 264/349] Fix intermittent issue in API delete --- .../e2e-playwright-tests/components/ArtifactTest/APITests.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/ArtifactTest/APITests.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/ArtifactTest/APITests.ts index 100d36926ea..ca0539c994e 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/ArtifactTest/APITests.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/ArtifactTest/APITests.ts @@ -240,9 +240,12 @@ export class API { console.log("Clicked on open project overview"); const vscodeButton = webview.locator('vscode-button > svg').nth(1); await vscodeButton.waitFor(); + // 2ms wait to avoid the intermittent issue of the button not being clickable + console.log("Waiting for 2s before clicking on delete API button"); + await page.page.waitForTimeout(2000); await vscodeButton.click({force: true}); const deleteBtn = webview.getByText('Delete'); - console.log("Clicked on delete API"); + console.log("Clicked on delete API from overview"); await deleteBtn.waitFor(); await deleteBtn.click(); console.log("Clicked on delete"); From 31ec0ae0e508584036c378bba6dc2174a67ea3cd Mon Sep 17 00:00:00 2001 From: Tharindu Jayathilake Date: Wed, 30 Jul 2025 15:17:39 +0530 Subject: [PATCH 265/349] Fix comment Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../e2e-playwright-tests/components/ArtifactTest/APITests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/ArtifactTest/APITests.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/ArtifactTest/APITests.ts index ca0539c994e..bf009ff0d15 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/ArtifactTest/APITests.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/ArtifactTest/APITests.ts @@ -240,7 +240,7 @@ export class API { console.log("Clicked on open project overview"); const vscodeButton = webview.locator('vscode-button > svg').nth(1); await vscodeButton.waitFor(); - // 2ms wait to avoid the intermittent issue of the button not being clickable + // 2s wait (2000ms) to avoid the intermittent issue of the button not being clickable console.log("Waiting for 2s before clicking on delete API button"); await page.page.waitForTimeout(2000); await vscodeButton.click({force: true}); From 1f47bafd8bd5b7c6e37da2efb0f2f7670791ea78 Mon Sep 17 00:00:00 2001 From: tharindulak Date: Wed, 30 Jul 2025 16:34:13 +0530 Subject: [PATCH 266/349] Remove readme --- .../README-profiles.md | 98 ------------------- 1 file changed, 98 deletions(-) delete mode 100644 workspaces/common-libs/playwright-vscode-tester/README-profiles.md diff --git a/workspaces/common-libs/playwright-vscode-tester/README-profiles.md b/workspaces/common-libs/playwright-vscode-tester/README-profiles.md deleted file mode 100644 index 1710200a207..00000000000 --- a/workspaces/common-libs/playwright-vscode-tester/README-profiles.md +++ /dev/null @@ -1,98 +0,0 @@ -# Using Custom VSCode Profiles with Playwright VSCode Tester - -The `playwright-vscode-tester` module now supports creating isolated VSCode profiles for testing, ensuring that your tests don't interfere with your development VSCode settings and extensions. - -## What Changed - -Previously, the module used a shared `settings/Code` directory which could inherit settings and extensions from your development VSCode. Now you can specify a custom profile name to create completely isolated test environments. - -## Usage Examples - -### Basic Usage with Custom Profile - -```typescript -import { startVSCode, ReleaseQuality } from '@wso2/playwright-vscode-tester'; - -// Start VSCode with a custom profile named "my-test-profile" -const vscode = await startVSCode( - './test-resources', // resources folder - 'latest', // VSCode version - ReleaseQuality.Stable, // release type - false, // enable recorder - undefined, // extensions folder - './my-project', // project path - 'my-test-profile' // custom profile name -); -``` - -### Using getBrowser with Custom Profile - -```typescript -import { getBrowser, ReleaseQuality } from '@wso2/playwright-vscode-tester'; - -const browser = await getBrowser( - './test-resources', - 'latest', - ReleaseQuality.Stable, - './extensions', // extensions folder - 'isolated-test-profile' // custom profile name -); -``` - -### Using getBrowserLaunchOptions with Custom Profile - -```typescript -import { getBrowserLaunchOptions, ReleaseQuality } from '@wso2/playwright-vscode-tester'; - -const options = await getBrowserLaunchOptions( - './test-resources', - 'latest', - ReleaseQuality.Stable, - './my-project', // project path - './extensions', // extensions folder - 'clean-test-profile' // custom profile name -); -``` - -## Profile Directory Structure - -When you specify a custom profile name (e.g., "my-test-profile"), the module will create the following directory structure: - -``` -test-resources/ -└── settings/ - └── my-test-profile/ - ├── chromium-log - ├── crash-reports/ - └── Code/ - └── User/ - ├── settings.json - └── globalStorage/ -``` - -## Benefits - -1. **Isolation**: Each test can use a completely clean VSCode environment -2. **Reproducibility**: Tests start with the same baseline configuration every time -3. **Parallel Testing**: Multiple test suites can run simultaneously with different profiles -4. **No Interference**: Your development VSCode settings and extensions won't affect tests - -## Automatic Profile Generation - -If you don't specify a profile name, the module will automatically generate a unique one based on the current timestamp: - -```typescript -// This will create a profile like "test-profile-1642784567890" -const vscode = await startVSCode('./test-resources', 'latest'); -``` - -## Backward Compatibility - -All existing code will continue to work without changes. The profile name parameter is optional, and when not provided, a unique profile is automatically generated. - -## Best Practices - -1. Use descriptive profile names for different test scenarios -2. Consider cleaning up old profile directories after tests complete -3. Use unique profile names for parallel test execution -4. Include the profile name in test logs for debugging purposes From d2d1b29271484f682b7a1f32573225986b32e84f Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Tue, 29 Jul 2025 14:59:51 +0530 Subject: [PATCH 267/349] Separate the project migration step from the workspace opening step. --- .../mi-extension/src/util/migrationUtils.ts | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/workspaces/mi/mi-extension/src/util/migrationUtils.ts b/workspaces/mi/mi-extension/src/util/migrationUtils.ts index a344c9c052e..d4a9baa906f 100644 --- a/workspaces/mi/mi-extension/src/util/migrationUtils.ts +++ b/workspaces/mi/mi-extension/src/util/migrationUtils.ts @@ -139,7 +139,24 @@ const SYNAPSE_TO_MI_ARTIFACT_FOLDER_MAP: Record = { 'templates': 'templates' }; -export async function importProject(params: ImportProjectRequest): Promise { +export async function importProjects(params: ImportProjectRequest[]): Promise { + const responses: ImportProjectResponse[] = []; + for (const param of params) { + try { + const createdFolderPaths = await importProject(param); + await handleWorkspaceAfterMigration(param.directory, createdFolderPaths.map(r => Uri.file(r.filePath))); + for (const folder of createdFolderPaths) { + responses.push({ filePath: folder.filePath }); + } + } catch (error) { + console.error(`Failed to import project from ${param.source}:`, error); + responses.push({ filePath: '' }); + } + } + return responses; +} + +export async function importProject(params: ImportProjectRequest): Promise { const { source, directory, open } = params; const projectUri = workspace.getWorkspaceFolder(Uri.file(source))?.uri?.fsPath; if (!projectUri) { @@ -178,14 +195,18 @@ export async function importProject(params: ImportProjectRequest): Promise 0) { + return createdFolderUris.map(uri => ({ filePath: uri.fsPath })); + } else { + return [{ filePath: directory }]; + } } else { - window.showErrorMessage('Could not find the project details from the provided project: ', source); - return { filePath: "" }; + window.showErrorMessage('Could not find the project details from the provided project: ' + source); + return [{ filePath: "" }]; } } @@ -375,10 +396,11 @@ export async function migrateConfigs( projectDirToResolvedPomMap: Map, projectDirsWithType: { projectDir: string, projectType: Nature }[], createdProjectCount: number -): Promise { +): Promise { // determine the project type here const projectType = await determineProjectType(source); let hasClassMediatorModule = false; + const createdFolderUris: Uri[] = []; if (projectType === Nature.MULTIMODULE) { const artifactIdToFileInfoMap = generateArtifactIdToFileInfoMap(projectDirToResolvedPomMap, projectDirsWithType); @@ -386,7 +408,6 @@ export async function migrateConfigs( const projectDirToMetaFilesMap = generateProjectDirToMetaFilesMap(projectDirsWithType); const allUsedDependencyIds = new Set(); - const createdFolderUris: Uri[] = []; for (const { projectDir, projectType } of projectDirsWithType) { if (projectType === Nature.DISTRIBUTION && artifactIdToFileInfoMap) { // Compute the relative path from source to projectDir, and map it to the target @@ -406,7 +427,6 @@ export async function migrateConfigs( } } writeUnusedFileInfos(allUsedDependencyIds, artifactIdToFileInfoMap, source) - await handleWorkspaceAfterMigration(projectUri, createdFolderUris); } else if (projectType === Nature.LEGACY) { const items = fs.readdirSync(source, { withFileTypes: true }); for (const item of items) { @@ -428,6 +448,7 @@ export async function migrateConfigs( await updatePomForClassMediator(projectUri); } commands.executeCommand('setContext', 'MI.migrationStatus', 'done'); + return createdFolderUris; } /** From 7b4e8ec22a8b8a22d5b9c2838e0dda179e27ccce Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Wed, 30 Jul 2025 11:13:39 +0530 Subject: [PATCH 268/349] Add method to find old projects in the current project --- .../src/rpc-types/mi-visualizer/index.ts | 1 + .../src/rpc-types/mi-visualizer/rpc-type.ts | 1 + .../rpc-managers/mi-visualizer/rpc-handler.ts | 2 + .../rpc-managers/mi-visualizer/rpc-manager.ts | 49 +++++++++++++++++++ .../rpc-clients/mi-visualizer/rpc-client.ts | 5 ++ 5 files changed, 58 insertions(+) diff --git a/workspaces/mi/mi-core/src/rpc-types/mi-visualizer/index.ts b/workspaces/mi/mi-core/src/rpc-types/mi-visualizer/index.ts index dbde60e243b..4db4f3aff9f 100644 --- a/workspaces/mi/mi-core/src/rpc-types/mi-visualizer/index.ts +++ b/workspaces/mi/mi-core/src/rpc-types/mi-visualizer/index.ts @@ -58,6 +58,7 @@ import { GettingStartedData, SampleDownloadRequest } from "./types"; export interface MIVisualizerAPI { getWorkspaces: () => Promise; + findOldProjects: () => Promise; getProjectStructure: (params: ProjectStructureRequest) => Promise; getProjectOverview: (params: ProjectStructureRequest) => Promise; getCurrentThemeKind: () => Promise; diff --git a/workspaces/mi/mi-core/src/rpc-types/mi-visualizer/rpc-type.ts b/workspaces/mi/mi-core/src/rpc-types/mi-visualizer/rpc-type.ts index 0daec95ed07..ecd2479d566 100644 --- a/workspaces/mi/mi-core/src/rpc-types/mi-visualizer/rpc-type.ts +++ b/workspaces/mi/mi-core/src/rpc-types/mi-visualizer/rpc-type.ts @@ -60,6 +60,7 @@ import { RequestType, NotificationType } from "vscode-messenger-common"; const _preFix = "mi-visualizer"; export const getWorkspaces: RequestType = { method: `${_preFix}/getWorkspaces` }; +export const findOldProjects: RequestType = { method: `${_preFix}/findOldProjects` }; export const getProjectStructure: RequestType = { method: `${_preFix}/getProjectStructure` }; export const getProjectOverview: RequestType = { method: `${_preFix}/getProjectOverview` }; export const getCurrentThemeKind: RequestType = { method: `${_preFix}/getCurrentThemeKind` }; diff --git a/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-handler.ts b/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-handler.ts index 56a75194576..7894ef55e9f 100644 --- a/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-handler.ts +++ b/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-handler.ts @@ -43,6 +43,7 @@ import { getProjectStructure, getReadmeContent, getWorkspaces, + findOldProjects, goBack, goHome, goSelected, @@ -97,6 +98,7 @@ import { MiVisualizerRpcManager } from "./rpc-manager"; export function registerMiVisualizerRpcHandlers(messenger: Messenger, projectUri: string): void { const rpcManger = new MiVisualizerRpcManager(projectUri); messenger.onRequest(getWorkspaces, () => rpcManger.getWorkspaces()); + messenger.onRequest(findOldProjects, () => rpcManger.findOldProjects()); messenger.onRequest(getProjectStructure, (args: ProjectStructureRequest) => rpcManger.getProjectStructure(args)); messenger.onRequest(getProjectOverview, (args: ProjectStructureRequest) => rpcManger.getProjectOverview(args)); messenger.onRequest(getCurrentThemeKind, () => rpcManger.getCurrentThemeKind()); diff --git a/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts b/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts index e1ecafc1a4e..4b65d76f109 100644 --- a/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts +++ b/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts @@ -106,6 +106,55 @@ export class MiVisualizerRpcManager implements MIVisualizerAPI { }); } + /** + * Recursively searches for directories containing legacy project files (".project" or "pom.xml") + * starting from the given project URI. Returns a list of directory paths where such files are found. + * + * @returns {Promise} A promise that resolves to an array of directory paths containing + * legacy project files. + * + * @remarks + * - The search is performed synchronously within the helper function, but the main method is asynchronous. + * - Only directories containing at least one of the specified project files are included in the result. + * - If the provided project URI is a file, its parent directory is used as the starting point. + */ + async findOldProjects(): Promise { + const foundProjects: string[] = []; + + const checkForProjectFiles = (dir: string) => { + const entries = fs.readdirSync(dir, { withFileTypes: true }); + let hasProjectFile = false; + + for (const entry of entries) { + if (entry.isFile() && (entry.name === '.project' || entry.name === 'pom.xml')) { + foundProjects.push(dir); + hasProjectFile = true; + break; + } + } + + if (!hasProjectFile) { + for (const entry of entries) { + if (entry.isDirectory()) { + checkForProjectFiles(path.join(dir, entry.name)); + } + } + } + }; + + if (fs.existsSync(this.projectUri)) { + const stat = fs.statSync(this.projectUri); + if (stat.isDirectory()) { + checkForProjectFiles(this.projectUri); + } else { + const dir = path.dirname(this.projectUri); + checkForProjectFiles(dir); + } + } + + return foundProjects; + } + async getProjectStructure(params: ProjectStructureRequest): Promise { return new Promise(async (resolve) => { const langClient = getStateMachine(this.projectUri).context().langClient!; diff --git a/workspaces/mi/mi-rpc-client/src/rpc-clients/mi-visualizer/rpc-client.ts b/workspaces/mi/mi-rpc-client/src/rpc-clients/mi-visualizer/rpc-client.ts index f5be2016491..a7541a0fc03 100644 --- a/workspaces/mi/mi-rpc-client/src/rpc-clients/mi-visualizer/rpc-client.ts +++ b/workspaces/mi/mi-rpc-client/src/rpc-clients/mi-visualizer/rpc-client.ts @@ -56,6 +56,7 @@ import { getProjectStructure, getReadmeContent, getWorkspaces, + findOldProjects, goBack, goHome, goSelected, @@ -120,6 +121,10 @@ export class MiVisualizerRpcClient implements MIVisualizerAPI { return this._messenger.sendRequest(getWorkspaces, HOST_EXTENSION); } + findOldProjects(): Promise { + return this._messenger.sendRequest(findOldProjects, HOST_EXTENSION); + } + getProjectStructure(params: ProjectStructureRequest): Promise { return this._messenger.sendRequest(getProjectStructure, HOST_EXTENSION, params); } From f9946381f05d0fb11ea996b2fbb83f942e9d00ce Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Wed, 30 Jul 2025 23:01:21 +0530 Subject: [PATCH 269/349] Add utils to find multi module projects in a given workspace dir --- .../mi-extension/src/util/migrationUtils.ts | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/workspaces/mi/mi-extension/src/util/migrationUtils.ts b/workspaces/mi/mi-extension/src/util/migrationUtils.ts index d4a9baa906f..3f02d30a48d 100644 --- a/workspaces/mi/mi-extension/src/util/migrationUtils.ts +++ b/workspaces/mi/mi-extension/src/util/migrationUtils.ts @@ -139,6 +139,11 @@ const SYNAPSE_TO_MI_ARTIFACT_FOLDER_MAP: Record = { 'templates': 'templates' }; +const OLD_MULTI_MODULE_PROJECT_NATURES = [ + 'org.wso2.developerstudio.eclipse.mavenmultimodule.project.nature', + 'org.eclipse.m2e.core.maven2Nature' +]; + export async function importProjects(params: ImportProjectRequest[]): Promise { const responses: ImportProjectResponse[] = []; for (const param of params) { @@ -1659,6 +1664,72 @@ function findProjectNature(node: any): string | undefined { return undefined; } +/** + * Checks if the specified project file contains any of the old multi-module project natures. + * + * @param filePath - The path to the project file to check. + * @returns A promise that resolves to `true` if the file contains any of the old multi-module project natures, otherwise `false`. + */ +export async function containsMultiModuelNatureInProjectFile(filePath: string): Promise { + if (!fs.existsSync(filePath)) return false; + const content = await fs.promises.readFile(filePath, 'utf-8'); + return OLD_MULTI_MODULE_PROJECT_NATURES.some(nature => content.includes(`${nature}`)); +} + +/** + * Checks if the given POM file contains a multi-module project nature. + * + * Reads the specified POM file, extracts its project nature, and determines + * whether it matches any of the known old multi-module project natures. + * + * @param filePath - The absolute path to the POM file to check. + * @returns A promise that resolves to `true` if the POM file contains a multi-module nature, or `false` otherwise. + */ +export async function containsMultiModuleNatureInPomFile(filePath: string): Promise { + if (!fs.existsSync(filePath)) return false; + const pomContent = await fs.promises.readFile(filePath, 'utf-8'); + const projectNature = await extractNatureFromPomContent(pomContent); + return OLD_MULTI_MODULE_PROJECT_NATURES.includes(projectNature ?? ''); +} + +/** + * Recursively searches the given workspace directory for subdirectories that represent multi-module projects. + * A multi-module project is identified by either: + * - A `.project` file containing multi-module nature, or + * - A `pom.xml` file containing multi-module nature. + * + * @param workspaceDir - The root directory of the workspace to search within. + * @returns A promise that resolves to an array of absolute paths to directories identified as multi-module projects. + */ +export async function findMultiModuleProjectsInWorkspaceDir(workspaceDir: string): Promise { + const foundProjects: string[] = []; + + async function checkSubDirsRecursively(dir: string) { + const dirs = fs.readdirSync(dir, { withFileTypes: true }); + for (const dirent of dirs) { + if (dirent.isDirectory()) { + const subDir = path.join(dir, dirent.name); + const subProjectFile = path.join(subDir, '.project'); + const subPomFile = path.join(subDir, 'pom.xml'); + if (fs.existsSync(subProjectFile)) { + if (await containsMultiModuelNatureInProjectFile(subProjectFile)) { + foundProjects.push(subDir); + } + } else if (fs.existsSync(subPomFile)) { + if (await containsMultiModuleNatureInPomFile(subPomFile)) { + foundProjects.push(subDir); + } + } else { + checkSubDirsRecursively(subDir); + } + } + } + } + + await checkSubDirsRecursively(workspaceDir); + return foundProjects; +} + /** * Extracts and returns a record of property key-value pairs from the given XML object. * From c8b2fc9c743d5b2a2635d9904b2546f1bb55810a Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Wed, 30 Jul 2025 23:04:23 +0530 Subject: [PATCH 270/349] Update import projects to migrate multiple projects and open them in a single workspace --- workspaces/mi/mi-extension/src/util/migrationUtils.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/workspaces/mi/mi-extension/src/util/migrationUtils.ts b/workspaces/mi/mi-extension/src/util/migrationUtils.ts index 3f02d30a48d..b2e8b904b1e 100644 --- a/workspaces/mi/mi-extension/src/util/migrationUtils.ts +++ b/workspaces/mi/mi-extension/src/util/migrationUtils.ts @@ -146,18 +146,22 @@ const OLD_MULTI_MODULE_PROJECT_NATURES = [ export async function importProjects(params: ImportProjectRequest[]): Promise { const responses: ImportProjectResponse[] = []; + const allCreatedFolderUris: Uri[] = []; for (const param of params) { try { const createdFolderPaths = await importProject(param); - await handleWorkspaceAfterMigration(param.directory, createdFolderPaths.map(r => Uri.file(r.filePath))); for (const folder of createdFolderPaths) { responses.push({ filePath: folder.filePath }); + allCreatedFolderUris.push(Uri.file(folder.filePath)); } } catch (error) { console.error(`Failed to import project from ${param.source}:`, error); responses.push({ filePath: '' }); } } + if (allCreatedFolderUris.length > 0) { + await handleWorkspaceAfterMigration(params[0].directory, allCreatedFolderUris); + } return responses; } From bea6267aedfc25ac9671a704069d98b75961411a Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Wed, 30 Jul 2025 23:12:55 +0530 Subject: [PATCH 271/349] Update migrate project to handle multiple projects in a given dir --- .../mi/mi-core/src/rpc-types/mi-diagram/types.ts | 5 +++-- .../src/rpc-managers/mi-diagram/rpc-manager.ts | 12 +++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/workspaces/mi/mi-core/src/rpc-types/mi-diagram/types.ts b/workspaces/mi/mi-core/src/rpc-types/mi-diagram/types.ts index bd195fc1a31..fecd53c6520 100644 --- a/workspaces/mi/mi-core/src/rpc-types/mi-diagram/types.ts +++ b/workspaces/mi/mi-core/src/rpc-types/mi-diagram/types.ts @@ -371,7 +371,8 @@ export interface ImportProjectRequest { } export interface MigrateProjectRequest { - source: string; + dir: string; + sources: string[]; } export interface Connector { @@ -1231,7 +1232,7 @@ export interface ImportProjectResponse { } export interface MigrateProjectResponse { - filePath: string; + filePaths: string[]; } export interface FileStructure { diff --git a/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts b/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts index 70ecb5eb726..8dc7c2c11f7 100644 --- a/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts +++ b/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts @@ -304,7 +304,7 @@ import { UndoRedoManager } from "../../undoRedoManager"; import { copyDockerResources, copyMavenWrapper, createFolderStructure, getAPIResourceXmlWrapper, getAddressEndpointXmlWrapper, getDataServiceXmlWrapper, getDefaultEndpointXmlWrapper, getDssDataSourceXmlWrapper, getFailoverXmlWrapper, getHttpEndpointXmlWrapper, getInboundEndpointXmlWrapper, getLoadBalanceXmlWrapper, getMessageProcessorXmlWrapper, getMessageStoreXmlWrapper, getProxyServiceXmlWrapper, getRegistryResourceContent, getTaskXmlWrapper, getTemplateEndpointXmlWrapper, getTemplateXmlWrapper, getWsdlEndpointXmlWrapper, createGitignoreFile, getEditTemplateXmlWrapper } from "../../util"; import { addNewEntryToArtifactXML, createMetadataFilesForRegistryCollection, deleteRegistryResource, detectMediaType, getAvailableRegistryResources, getMediatypeAndFileExtension, getRegistryResourceMetadata, updateRegistryResourceMetadata } from "../../util/fileOperations"; import { log } from "../../util/logger"; -import { importProject } from "../../util/migrationUtils"; +import { importProjects } from "../../util/migrationUtils"; import { generateSwagger, getResourceInfo, isEqualSwaggers, mergeSwaggers } from "../../util/swagger"; import { getDataSourceXml } from "../../util/template-engine/mustach-templates/DataSource"; import { getClassMediatorContent } from "../../util/template-engine/mustach-templates/classMediator"; @@ -3955,11 +3955,13 @@ ${endpointAttributes} }); } - async migrateProject({ source }: MigrateProjectRequest): Promise { + async migrateProject({ dir, sources }: MigrateProjectRequest): Promise { return new Promise(async (resolve) => { - if (source) { - await importProject({ source, directory: source, open: true }); - resolve({ filePath: source }); + if (sources) { + const importList = sources.map(source => ({ source, directory: dir, open: false })); + const createdProjects = await importProjects(importList); + const filePaths = createdProjects.map(project => project.filePath); + resolve({ filePaths }); } }); } From e1e972ed1e47ec63b3fa0b09c0b44953be034230 Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Wed, 30 Jul 2025 23:16:00 +0530 Subject: [PATCH 272/349] Set view when old workspace is detected --- workspaces/mi/mi-visualizer/src/Visualizer.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/workspaces/mi/mi-visualizer/src/Visualizer.tsx b/workspaces/mi/mi-visualizer/src/Visualizer.tsx index bbebf5e80ca..6050597b0ee 100644 --- a/workspaces/mi/mi-visualizer/src/Visualizer.tsx +++ b/workspaces/mi/mi-visualizer/src/Visualizer.tsx @@ -30,6 +30,7 @@ import { RuntimeServicePanel } from "./RuntimeServicesPanel"; import { SwaggerPanel } from "./SwaggerPanel"; import { gitIssueUrl } from "./constants"; import { EnvironmentSetup } from "./views/EnvironmentSetup"; +import { UnsupportedProject } from "./views/UnsupportedProject"; const LoaderWrapper = styled.div` display: flex; @@ -79,6 +80,8 @@ export function Visualizer({ mode, swaggerData }: { mode: string, swaggerData?: setCurrentView('welcome'); } else if ('environmentSetup' in newState && newState.environmentSetup === "viewReady") { setCurrentView('environmentSetup'); + } else if ('oldWorkspaceDetected' in newState && newState.oldWorkspaceDetected === "viewReady") { + setCurrentView('oldWorkspaceDetected'); } } else if (newState === 'disabled') { setCurrentView('disabled'); @@ -115,6 +118,9 @@ export function Visualizer({ mode, swaggerData }: { mode: string, swaggerData?: case 'environmentSetup': setView(); break; + case 'oldWorkspaceDetected': + setView(); + break; case 'disabled': setView(); break; From 5a794c9496713d227ab0a8b5faee4d905e1ef200 Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Wed, 30 Jul 2025 15:07:05 +0530 Subject: [PATCH 273/349] Identify old workspace state --- .../mi/mi-core/src/state-machine-types.ts | 3 +- .../mi/mi-extension/src/stateMachine.ts | 72 ++++++++++++++----- 2 files changed, 57 insertions(+), 18 deletions(-) diff --git a/workspaces/mi/mi-core/src/state-machine-types.ts b/workspaces/mi/mi-core/src/state-machine-types.ts index f9583205f5e..604ad75a965 100644 --- a/workspaces/mi/mi-core/src/state-machine-types.ts +++ b/workspaces/mi/mi-core/src/state-machine-types.ts @@ -34,6 +34,7 @@ export enum MACHINE_VIEW { ADD_ARTIFACT = "Add Artifact", Overview = "Project Overview", UnsupportedProject = "Unsupported Project", + UnsupportedWorkspace = "Unsupported Workspace", Disabled = "MI Extension", Diagram = "MI Diagram", ResourceView = "Resource View", @@ -100,7 +101,7 @@ export enum AI_MACHINE_VIEW { } export type MachineStateValue = - | 'initialize' | 'projectDetected' | 'oldProjectDetected' | 'LSInit' | 'ready' | 'disabled' + | 'initialize' | 'projectDetected' | 'oldProjectDetected' | 'oldWorkspaceDetected' | 'LSInit' | 'ready' | 'disabled' | { ready: 'viewReady' } | { ready: 'viewEditing' } | { newProject: 'viewReady' }| { environmentSetup: 'viewReady' }; diff --git a/workspaces/mi/mi-extension/src/stateMachine.ts b/workspaces/mi/mi-extension/src/stateMachine.ts index 860c3ac3df0..d699e78ad5b 100644 --- a/workspaces/mi/mi-extension/src/stateMachine.ts +++ b/workspaces/mi/mi-extension/src/stateMachine.ts @@ -7,6 +7,7 @@ import { extension } from './MIExtensionContext'; import { DM_FUNCTION_NAME, EVENT_TYPE, + findOldProjects, HistoryEntry, MACHINE_VIEW, MachineStateValue, @@ -30,7 +31,7 @@ import { DMProject } from './datamapper/DMProject'; import { setupEnvironment } from './util/onboardingUtils'; import { getPopupStateMachine } from './stateMachinePopup'; import { askForProject } from './util/workspace'; -import { extractNatureFromPomContent } from './util/migrationUtils'; +import { containsMultiModuelNatureInProjectFile, containsMultiModuleNatureInPomFile, extractNatureFromPomContent, findMultiModuleProjectsInWorkspaceDir } from './util/migrationUtils'; const fs = require('fs'); interface MachineContext extends VisualizerLocation { @@ -73,6 +74,17 @@ const stateMachine = createMachine({ displayOverview: (context, event) => true, }) }, + { + target: 'oldWorkspaceDetected', + cond: (context, event) => + // Assuming true means old workspace detected + event.data.isOldWorkspace === true && event.data.displayOverview === true, + actions: assign({ + view: (context, event) => MACHINE_VIEW.UnsupportedWorkspace, + projectUri: (context, event) => event.data.projectUri, + displayOverview: (context, event) => true, + }) + }, { target: 'lsInit', cond: (context, event) => @@ -120,6 +132,28 @@ const stateMachine = createMachine({ } } }, + oldWorkspaceDetected: { + initial: "viewLoading", + states: { + viewLoading: { + invoke: [ + { + src: 'openWebPanel', + onDone: { + target: 'viewReady' + } + } + ] + }, + viewReady: { + on: { + REFRESH_ENVIRONMENT: { + target: '#mi.initialize' + } + } + } + } + }, lsInit: { invoke: { src: 'waitForLS', @@ -730,7 +764,7 @@ function updateProjectExplorer(location: VisualizerLocation | undefined) { async function checkIfMiProject(projectUri) { log(`Detecting project in ${projectUri} - ${new Date().toLocaleTimeString()}`); - let isProject = false, isOldProject = false, displayOverview = true, view = MACHINE_VIEW.Overview, isEnvironmentSetUp = false; + let isProject = false, isOldProject = false, isOldWorkspace = false, displayOverview = true, view = MACHINE_VIEW.Overview, isEnvironmentSetUp = false; const customProps: any = {}; try { // Check for pom.xml files excluding node_modules directory @@ -746,25 +780,22 @@ async function checkIfMiProject(projectUri) { // If not found, check for .project files if (!isProject) { const projectFiles = await vscode.workspace.findFiles(new vscode.RelativePattern(projectUri, '.project'), '**/node_modules/**', 1); - const oldProjectNatures = [ - 'org.wso2.developerstudio.eclipse.mavenmultimodule.project.nature', - 'org.eclipse.m2e.core.maven2Nature' - ]; + if (projectFiles.length > 0) { - const projectContent = await vscode.workspace.openTextDocument(projectFiles[0]); - if (oldProjectNatures.some(nature => projectContent.getText().includes('' + nature + ''))) { + if (await containsMultiModuelNatureInProjectFile(projectFiles[0].fsPath)) { isOldProject = true; - log("Integration Studio project detected in " + projectUri); + log("Integration Studio project detected"); + } + } else if (fs.existsSync(pomFilePath)) { + if (await containsMultiModuleNatureInPomFile(pomFilePath)) { + isOldProject = true; + log("Integration Studio project detected"); } } else { - if (fs.existsSync(pomFilePath)) { - const pomContent = await fs.promises.readFile(pomFilePath, 'utf-8'); - const projectNature = await extractNatureFromPomContent(pomContent); - - if (projectNature && oldProjectNatures.includes(projectNature)) { - isOldProject = true; - log("Integration Studio project detected"); - } + const foundOldProjects = await findMultiModuleProjectsInWorkspaceDir(projectUri); + if (foundOldProjects.length > 0) { + isOldWorkspace = true; + log("Integration Studio workspace detected"); } } } @@ -806,6 +837,12 @@ async function checkIfMiProject(projectUri) { vscode.commands.executeCommand('setContext', 'MI.status', 'projectDetected'); vscode.commands.executeCommand('setContext', 'MI.projectType', 'oldProject'); // for command enablements await extension.context.workspaceState.update('projectType', 'oldProject'); + } else if (isOldWorkspace) { + const displayState: boolean | undefined = extension.context.workspaceState.get('displayOverview'); + displayOverview = displayState === undefined ? true : displayState; + vscode.commands.executeCommand('setContext', 'MI.status', 'projectDetected'); + vscode.commands.executeCommand('setContext', 'MI.projectType', 'oldWorkspace'); // for command enablements + await extension.context.workspaceState.update('projectType', 'oldWorkspace'); } else { vscode.commands.executeCommand('setContext', 'MI.status', 'unknownProject'); } @@ -823,6 +860,7 @@ async function checkIfMiProject(projectUri) { return { isProject, isOldProject, + isOldWorkspace, displayOverview, projectUri, // Return the path of the detected project view, From a245591a726fc56cad91bf2c53b44f68cb279f7e Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Wed, 30 Jul 2025 23:51:12 +0530 Subject: [PATCH 274/349] Update unsupported page view for both workspace and project --- .../src/views/UnsupportedProject/index.tsx | 54 +++++++++++++++---- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/workspaces/mi/mi-visualizer/src/views/UnsupportedProject/index.tsx b/workspaces/mi/mi-visualizer/src/views/UnsupportedProject/index.tsx index f2d035e2c22..5e4d8be9c91 100644 --- a/workspaces/mi/mi-visualizer/src/views/UnsupportedProject/index.tsx +++ b/workspaces/mi/mi-visualizer/src/views/UnsupportedProject/index.tsx @@ -166,9 +166,13 @@ const Card: React.FC = ({ title, description, expanded, onClick }) => }; export function UnsupportedProject(props: UnsupportedProjectProps) { + const PROJECT = 'Project'; + const WORKSPACE = 'Workspace'; const { displayOverview = true } = props; const { rpcClient } = useVisualizerContext(); const [activeWorkspaces, setActiveWorkspaces] = React.useState(undefined); + const [foundOldProjects, setFoundOldProjects] = React.useState([]); + const [projectType, setProjectType] = React.useState(PROJECT); // 'Project' or 'Workspace' const [activeCard, setActiveCard] = React.useState(0); const [currentThemeKind, setCurrentThemeKind] = React.useState(undefined); const [displayOverviewOnStartup, setDisplayOverviewOnStartup] = React.useState(displayOverview); @@ -219,9 +223,10 @@ export function UnsupportedProject(props: UnsupportedProjectProps) { setDisplayOverviewOnStartup(!displayOverviewOnStartup); }; - const migrateProject = async () => { - await rpcClient.getMiDiagramRpcClient() - .executeCommand({ commands: [COMMANDS.MIGRATE_PROJECT, { source: undefined }] }); + const migrate = async () => { + if (activeWorkspaces) { + await rpcClient.getMiDiagramRpcClient().migrateProject({ dir: activeWorkspaces.fsPath, sources: foundOldProjects }); + } } useEffect(() => { @@ -233,6 +238,21 @@ export function UnsupportedProject(props: UnsupportedProjectProps) { }); }, []); + useEffect(() => { + if (activeWorkspaces?.fsPath) { + rpcClient.getMiVisualizerRpcClient().findOldProjects().then((response) => { + if (response && response.length > 0) { + setFoundOldProjects(response); + if (response.length > 1) { + setProjectType(WORKSPACE); + } else if (response.length === 1 && activeWorkspaces.fsPath !== response[0]) { + setProjectType(WORKSPACE); + } + } + }); + } + }, [activeWorkspaces]); // Runs when activeWorkspaces changes + // Set current theme useEffect(() => { if (rpcClient) { @@ -263,24 +283,40 @@ export function UnsupportedProject(props: UnsupportedProjectProps) { return ( - + - Unsupported Project Detected + + {`Unsupported ${projectType} Detected`} + - This project was identified as being created with Integration Studio. The MI VSCode extension has limited - functionality for these projects. + {`This ${projectType} was identified as being created with Integration Studio. The MI VSCode extension has limited + functionality for these projects.`} - We recommend migrating your project to the latest format to unlock the full suite of features available. + {`We recommend migrating your ${projectType.toLowerCase()} to the latest format to unlock the full suite of features available.`} For more information, refer to the{' '} migration documentation . + {foundOldProjects.length > 0 && projectType === WORKSPACE && ( +
+ + Found projects: + +
    + {foundOldProjects.map((project, idx) => ( +
  • + {project} +
  • + ))} +
+
+ )}
- +
From 1be2d87d3ffb00431d1e31d48a6ad54db6e7b564 Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Thu, 31 Jul 2025 11:30:20 +0530 Subject: [PATCH 275/349] Update rpc method to find old projects --- .../rpc-managers/mi-visualizer/rpc-manager.ts | 50 +++---------------- 1 file changed, 7 insertions(+), 43 deletions(-) diff --git a/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts b/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts index 4b65d76f109..f4541ef8b00 100644 --- a/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts +++ b/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts @@ -89,6 +89,7 @@ const fs = require('fs'); import { TextEdit } from "vscode-languageclient"; import { downloadJavaFromMI, downloadMI, getProjectSetupDetails, getSupportedMIVersionsHigherThan, setPathsInWorkSpace, updateRuntimeVersionsInPom, getMIVersionFromPom } from '../../util/onboardingUtils'; import { extractCAppDependenciesAsProjects } from "../../visualizer/activate"; +import { findMultiModuleProjectsInWorkspaceDir } from "../../util/migrationUtils"; Mustache.escape = escapeXml; export class MiVisualizerRpcManager implements MIVisualizerAPI { @@ -107,52 +108,15 @@ export class MiVisualizerRpcManager implements MIVisualizerAPI { } /** - * Recursively searches for directories containing legacy project files (".project" or "pom.xml") - * starting from the given project URI. Returns a list of directory paths where such files are found. + * Searches for and retrieves a list of old multi-module project paths within the current workspace directory. * - * @returns {Promise} A promise that resolves to an array of directory paths containing - * legacy project files. - * - * @remarks - * - The search is performed synchronously within the helper function, but the main method is asynchronous. - * - Only directories containing at least one of the specified project files are included in the result. - * - If the provided project URI is a file, its parent directory is used as the starting point. + * @returns {Promise} A promise that resolves to an array of strings, each representing the path to a found project. */ async findOldProjects(): Promise { - const foundProjects: string[] = []; - - const checkForProjectFiles = (dir: string) => { - const entries = fs.readdirSync(dir, { withFileTypes: true }); - let hasProjectFile = false; - - for (const entry of entries) { - if (entry.isFile() && (entry.name === '.project' || entry.name === 'pom.xml')) { - foundProjects.push(dir); - hasProjectFile = true; - break; - } - } - - if (!hasProjectFile) { - for (const entry of entries) { - if (entry.isDirectory()) { - checkForProjectFiles(path.join(dir, entry.name)); - } - } - } - }; - - if (fs.existsSync(this.projectUri)) { - const stat = fs.statSync(this.projectUri); - if (stat.isDirectory()) { - checkForProjectFiles(this.projectUri); - } else { - const dir = path.dirname(this.projectUri); - checkForProjectFiles(dir); - } - } - - return foundProjects; + return new Promise(async (resolve) => { + const foundProjects = await findMultiModuleProjectsInWorkspaceDir(this.projectUri); + resolve(foundProjects); + }); } async getProjectStructure(params: ProjectStructureRequest): Promise { From a970aa19486e6f8849f9baa6517fdf5f7ce18519 Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Thu, 31 Jul 2025 11:30:58 +0530 Subject: [PATCH 276/349] Skip .backup directory when finding multi module projects in a given workspace --- workspaces/mi/mi-extension/src/util/migrationUtils.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/workspaces/mi/mi-extension/src/util/migrationUtils.ts b/workspaces/mi/mi-extension/src/util/migrationUtils.ts index b2e8b904b1e..0a1f3f17dc9 100644 --- a/workspaces/mi/mi-extension/src/util/migrationUtils.ts +++ b/workspaces/mi/mi-extension/src/util/migrationUtils.ts @@ -1712,6 +1712,9 @@ export async function findMultiModuleProjectsInWorkspaceDir(workspaceDir: string const dirs = fs.readdirSync(dir, { withFileTypes: true }); for (const dirent of dirs) { if (dirent.isDirectory()) { + if (dirent.name === '.backup') { + continue; // Skip .backup directories + } const subDir = path.join(dir, dirent.name); const subProjectFile = path.join(subDir, '.project'); const subPomFile = path.join(subDir, 'pom.xml'); From ae6b5c4cbab4b2d72f24ddbcbaab5b4f1e26bb30 Mon Sep 17 00:00:00 2001 From: Vellummyilum Vinoth Date: Thu, 31 Jul 2025 13:29:39 +0530 Subject: [PATCH 277/349] Fix bugs on nested record mappigs --- .../src/rpc-managers/ai-panel/utils.ts | 44 ++-- .../resources/Complex/case_19/expected.json | 1 + .../resources/Complex/case_19/mapping.json | 32 +++ .../resources/Complex/case_19/param_def.json | 198 ++++++++++++++++++ 4 files changed, 261 insertions(+), 14 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_19/expected.json create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_19/mapping.json create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_19/param_def.json 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 110b99df072..c6ddf511b5a 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 @@ -1796,6 +1796,7 @@ async function handleRecordArrays(key: string, nestedKey: string, responseRecord let modifiedOutput: object; let outputMetadataType: string = ""; let outputMetadataTypeName: string = ""; + let isOutputDeeplyNested: boolean = false; for (let subObjectKey of subObjectKeys) { if (!nestedKey) { @@ -1808,20 +1809,19 @@ async function handleRecordArrays(key: string, nestedKey: string, responseRecord } outputMetadataTypeName = modifiedOutput["typeName"]; outputMetadataType = modifiedOutput["type"]; - let isDeeplyNested = (arrayRecords.includes(outputMetadataTypeName) || arrayEnumUnion.includes(outputMetadataType)); + isOutputDeeplyNested = (arrayRecords.includes(outputMetadataTypeName) || arrayEnumUnion.includes(outputMetadataType)); - let { itemKey: currentItemKey, combinedKey: currentCombinedKey, inputArrayNullable: currentArrayNullable } = await extractKeys(responseRecord[subObjectKey], parameterDefinitions, arrayRecords, arrayEnumUnion); + let { itemKey: currentItemKey, combinedKey: currentCombinedKey, inputArrayNullable: currentArrayNullable, isSet: isCurrentSet, isInputDeeplyNested: isCurrentInputDeeplyNested } = await extractKeys(responseRecord[subObjectKey], parameterDefinitions, arrayRecords, arrayEnumUnion); if (currentItemKey.includes('?')) { currentItemKey = currentItemKey.replace('?', ''); } if (modifiedOutput.hasOwnProperty("fields") || modifiedOutput.hasOwnProperty("members")) { - if (isDeeplyNested) { + if (isOutputDeeplyNested) { const subArrayRecord = responseRecord[subObjectKey]; const isCombinedKeyModified = currentCombinedKey.endsWith('?'); const replacementKey = currentArrayNullable || isCombinedKeyModified ? `${currentItemKey}Item?.` - : `${currentItemKey}Item.`; - + : `${isCurrentInputDeeplyNested ? currentItemKey + 'Item' : currentItemKey}.`; const regex = new RegExp( currentCombinedKey.replace(/\?/g, '\\?').replace(/\./g, '\\.') + '\\.', 'g' ); @@ -1830,8 +1830,10 @@ async function handleRecordArrays(key: string, nestedKey: string, responseRecord `${subObjectKey}: ${subArrayRecord.replace(regex, replacementKey)}` ); - itemKey = currentItemKey; - combinedKey = currentCombinedKey; + if (isCurrentSet || (itemKey === "" && combinedKey === "")) { + itemKey = currentItemKey; + combinedKey = currentCombinedKey; + } } else { formattedRecordsArray.push(`${subObjectKey}: ${responseRecord[subObjectKey]}`); } @@ -1889,11 +1891,15 @@ async function extractKeys( itemKey: string; combinedKey: string; inputArrayNullable: boolean; + isSet: boolean; + isInputDeeplyNested: boolean }> { let innerKey: string; let itemKey: string = ""; let combinedKey: string = ""; let inputArrayNullable: boolean = false; + let isSet: boolean = false; + let isInputDeeplyNested = false; // Handle the key for nullable and optional fields key = key.replace(/\?*$/, ""); @@ -1934,7 +1940,9 @@ async function extractKeys( itemKey = processedKeys.itemKey; combinedKey = processedKeys.combinedKey; inputArrayNullable = processedKeys.inputArrayNullable; - return { itemKey, combinedKey, inputArrayNullable }; + isSet = processedKeys.isSet; + isInputDeeplyNested = processedKeys.isInputDeeplyNested; + return { itemKey, combinedKey, inputArrayNullable, isSet, isInputDeeplyNested }; } async function processParentKey( @@ -1946,6 +1954,8 @@ async function processParentKey( itemKey: string; combinedKey: string; inputArrayNullable: boolean; + isSet: boolean; + isInputDeeplyNested: boolean; }> { let inputMetadataType: string = ""; let inputMetadataTypeName: string = ""; @@ -1954,6 +1964,7 @@ async function processParentKey( let refinedInnerKey: string; let isSet: boolean = false; let inputArrayNullable: boolean = false; + let isInputDeeplyNested: boolean = false; // Split the innerKey to get parent keys and field name let keys = innerKey.split("."); @@ -1974,7 +1985,7 @@ async function processParentKey( if (refinedParentKey.length === 1) { itemKey = parentKey[0]; combinedKey = parentKey[0]; - return { itemKey, combinedKey, inputArrayNullable }; + return { itemKey, combinedKey, inputArrayNullable, isSet, isInputDeeplyNested }; } for (let index = refinedParentKey.length - 1; index > 0; index--) { @@ -1986,13 +1997,18 @@ async function processParentKey( inputMetadataType = modifiedInputs["type"]; inputArrayNullable = modifiedInputs["nullableArray"]; - if (!isSet && (arrayEnumUnion.includes(inputMetadataType) || arrayRecords.includes(inputMetadataTypeName))) { - itemKey = parentKey[index]; - combinedKey = parentKey.slice(0, index + 1).join("."); - isSet = true; + const isArrayType = arrayRecords.includes(inputMetadataTypeName) || arrayEnumUnion.includes(inputMetadataType); + + if (isArrayType) { + if (!isSet) { + itemKey = parentKey[index]; + combinedKey = parentKey.slice(0, index + 1).join("."); + isSet = true; + } + isInputDeeplyNested = true; } } - return { itemKey, combinedKey, inputArrayNullable }; + return { itemKey, combinedKey, inputArrayNullable, isSet, isInputDeeplyNested }; } async function processCombinedKey( diff --git a/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_19/expected.json b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_19/expected.json new file mode 100644 index 00000000000..4b04d4993dd --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_19/expected.json @@ -0,0 +1 @@ +{"items": "from var ItemItem in tr.Items.Item\n select {\n date: tr.Timestamp,\nproduct_id: ItemItem.ProductId,\nquantity: ItemItem.Quantity,\ntotal: tr.TotalAmount\n}"} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_19/mapping.json b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_19/mapping.json new file mode 100644 index 00000000000..f46ff1b3a9f --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_19/mapping.json @@ -0,0 +1,32 @@ +{ + "items":{ + "date":{ + "operation":"DIRECT", + "targetType":"string", + "parameters":[ + "tr.Timestamp" + ] + }, + "product_id":{ + "operation":"DIRECT", + "targetType":"string", + "parameters":[ + "tr.Items.Item.ProductId" + ] + }, + "quantity":{ + "operation":"DIRECT", + "targetType":"int", + "parameters":[ + "tr.Items.Item.Quantity" + ] + }, + "total":{ + "operation":"DIRECT", + "targetType":"decimal", + "parameters":[ + "tr.TotalAmount" + ] + } + } +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_19/param_def.json b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_19/param_def.json new file mode 100644 index 00000000000..1a8601a1310 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_19/param_def.json @@ -0,0 +1,198 @@ +{ + "inputs":{ + "tr":{ + "TransactionId":{ + "type":"string", + "comment":"" + }, + "StoreId":{ + "type":"int", + "comment":"" + }, + "Timestamp":{ + "type":"string", + "comment":"" + }, + "Items":{ + "Item":{ + "ProductId":{ + "type":"string", + "comment":"" + }, + "Name":{ + "type":"string", + "comment":"" + }, + "Quantity":{ + "type":"int", + "comment":"" + }, + "Price":{ + "type":"decimal", + "comment":"" + } + } + }, + "TotalAmount":{ + "type":"decimal", + "comment":"" + }, + "PaymentMethod":{ + "type":"string", + "comment":"" + } + } + }, + "output":{ + "items":{ + "date":{ + "type":"string", + "comment":"" + }, + "product_id":{ + "type":"string", + "comment":"" + }, + "quantity":{ + "type":"int", + "comment":"" + }, + "total":{ + "type":"decimal", + "comment":"" + } + } + }, + "inputMetadata":{ + "tr":{ + "isArrayType":false, + "parameterName":"tr", + "parameterType":"Transaction", + "type":"record", + "fields":{ + "TransactionId":{ + "typeName":"string", + "type":"string", + "typeInstance":"TransactionId", + "nullable":false, + "optional":false + }, + "StoreId":{ + "typeName":"int", + "type":"int", + "typeInstance":"StoreId", + "nullable":false, + "optional":false + }, + "Timestamp":{ + "typeName":"string", + "type":"string", + "typeInstance":"Timestamp", + "nullable":false, + "optional":false + }, + "Items":{ + "nullable":false, + "optional":false, + "type":"record", + "typeInstance":"Items", + "typeName":"record", + "fields":{ + "Item":{ + "optional":false, + "typeName":"record[]", + "type":"record[]", + "typeInstance":"Item", + "fields":{ + "ProductId":{ + "typeName":"string", + "type":"string", + "typeInstance":"ProductId", + "nullable":false, + "optional":false + }, + "Name":{ + "typeName":"string", + "type":"string", + "typeInstance":"Name", + "nullable":false, + "optional":false + }, + "Quantity":{ + "typeName":"int", + "type":"int", + "typeInstance":"Quantity", + "nullable":false, + "optional":false + }, + "Price":{ + "typeName":"decimal", + "type":"decimal", + "typeInstance":"Price", + "nullable":false, + "optional":false + } + }, + "nullableArray":false, + "nullable":false + } + } + }, + "TotalAmount":{ + "typeName":"decimal", + "type":"decimal", + "typeInstance":"TotalAmount", + "nullable":false, + "optional":false + }, + "PaymentMethod":{ + "typeName":"string", + "type":"string", + "typeInstance":"PaymentMethod", + "nullable":false, + "optional":false + } + } + } + }, + "outputMetadata":{ + "items":{ + "optional":false, + "typeName":"record[]", + "type":"record[]", + "typeInstance":"items", + "fields":{ + "date":{ + "typeName":"string", + "type":"string", + "typeInstance":"date", + "nullable":false, + "optional":false + }, + "product_id":{ + "typeName":"string", + "type":"string", + "typeInstance":"product_id", + "nullable":false, + "optional":false + }, + "quantity":{ + "typeName":"int", + "type":"int", + "typeInstance":"quantity", + "nullable":false, + "optional":false + }, + "total":{ + "typeName":"decimal", + "type":"decimal", + "typeInstance":"total", + "nullable":false, + "optional":false + } + }, + "nullableArray":false, + "nullable":false + } + } +} From 8ffb7fa8fd01fc6079f156b124098a0c867c52ae Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Thu, 31 Jul 2025 14:58:31 +0530 Subject: [PATCH 278/349] Add rpc method to get project uri --- workspaces/mi/mi-core/src/rpc-types/mi-visualizer/index.ts | 1 + .../mi/mi-core/src/rpc-types/mi-visualizer/rpc-type.ts | 1 + .../src/rpc-managers/mi-visualizer/rpc-handler.ts | 2 ++ .../src/rpc-managers/mi-visualizer/rpc-manager.ts | 6 ++++++ .../src/rpc-clients/mi-visualizer/rpc-client.ts | 5 +++++ 5 files changed, 15 insertions(+) diff --git a/workspaces/mi/mi-core/src/rpc-types/mi-visualizer/index.ts b/workspaces/mi/mi-core/src/rpc-types/mi-visualizer/index.ts index 4db4f3aff9f..8a9a36bd035 100644 --- a/workspaces/mi/mi-core/src/rpc-types/mi-visualizer/index.ts +++ b/workspaces/mi/mi-core/src/rpc-types/mi-visualizer/index.ts @@ -57,6 +57,7 @@ import { import { GettingStartedData, SampleDownloadRequest } from "./types"; export interface MIVisualizerAPI { + getProjectUri: () => Promise; getWorkspaces: () => Promise; findOldProjects: () => Promise; getProjectStructure: (params: ProjectStructureRequest) => Promise; diff --git a/workspaces/mi/mi-core/src/rpc-types/mi-visualizer/rpc-type.ts b/workspaces/mi/mi-core/src/rpc-types/mi-visualizer/rpc-type.ts index ecd2479d566..18e3423af68 100644 --- a/workspaces/mi/mi-core/src/rpc-types/mi-visualizer/rpc-type.ts +++ b/workspaces/mi/mi-core/src/rpc-types/mi-visualizer/rpc-type.ts @@ -59,6 +59,7 @@ import { GettingStartedData, SampleDownloadRequest } from "./types"; import { RequestType, NotificationType } from "vscode-messenger-common"; const _preFix = "mi-visualizer"; +export const getProjectUri: RequestType = { method: `${_preFix}/getProjectUri` }; export const getWorkspaces: RequestType = { method: `${_preFix}/getWorkspaces` }; export const findOldProjects: RequestType = { method: `${_preFix}/findOldProjects` }; export const getProjectStructure: RequestType = { method: `${_preFix}/getProjectStructure` }; diff --git a/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-handler.ts b/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-handler.ts index 7894ef55e9f..d36bf06a76e 100644 --- a/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-handler.ts +++ b/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-handler.ts @@ -42,6 +42,7 @@ import { getProjectOverview, getProjectStructure, getReadmeContent, + getProjectUri, getWorkspaces, findOldProjects, goBack, @@ -97,6 +98,7 @@ import { MiVisualizerRpcManager } from "./rpc-manager"; export function registerMiVisualizerRpcHandlers(messenger: Messenger, projectUri: string): void { const rpcManger = new MiVisualizerRpcManager(projectUri); + messenger.onRequest(getProjectUri, () => rpcManger.getProjectUri()); messenger.onRequest(getWorkspaces, () => rpcManger.getWorkspaces()); messenger.onRequest(findOldProjects, () => rpcManger.findOldProjects()); messenger.onRequest(getProjectStructure, (args: ProjectStructureRequest) => rpcManger.getProjectStructure(args)); diff --git a/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts b/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts index f4541ef8b00..a249650b4ea 100644 --- a/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts +++ b/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts @@ -95,6 +95,12 @@ Mustache.escape = escapeXml; export class MiVisualizerRpcManager implements MIVisualizerAPI { constructor(private projectUri: string) { } + async getProjectUri(): Promise { + return new Promise((resolve) => { + resolve(this.projectUri); + }); + } + async getWorkspaces(): Promise { return new Promise(async (resolve) => { const workspaces = workspace.workspaceFolders; diff --git a/workspaces/mi/mi-rpc-client/src/rpc-clients/mi-visualizer/rpc-client.ts b/workspaces/mi/mi-rpc-client/src/rpc-clients/mi-visualizer/rpc-client.ts index a7541a0fc03..8cd06c4e3eb 100644 --- a/workspaces/mi/mi-rpc-client/src/rpc-clients/mi-visualizer/rpc-client.ts +++ b/workspaces/mi/mi-rpc-client/src/rpc-clients/mi-visualizer/rpc-client.ts @@ -55,6 +55,7 @@ import { getProjectOverview, getProjectStructure, getReadmeContent, + getProjectUri, getWorkspaces, findOldProjects, goBack, @@ -117,6 +118,10 @@ export class MiVisualizerRpcClient implements MIVisualizerAPI { this._messenger = messenger; } + getProjectUri(): Promise { + return this._messenger.sendRequest(getProjectUri, HOST_EXTENSION); + } + getWorkspaces(): Promise { return this._messenger.sendRequest(getWorkspaces, HOST_EXTENSION); } From 4a6de220d6e96611d285595e4f91e9100679947c Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Thu, 31 Jul 2025 14:59:05 +0530 Subject: [PATCH 279/349] Update to identify multi module projects from the root dir --- .../mi-extension/src/util/migrationUtils.ts | 57 ++++++++++--------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/workspaces/mi/mi-extension/src/util/migrationUtils.ts b/workspaces/mi/mi-extension/src/util/migrationUtils.ts index 0a1f3f17dc9..ef74f1a0eec 100644 --- a/workspaces/mi/mi-extension/src/util/migrationUtils.ts +++ b/workspaces/mi/mi-extension/src/util/migrationUtils.ts @@ -1697,43 +1697,46 @@ export async function containsMultiModuleNatureInPomFile(filePath: string): Prom } /** - * Recursively searches the given workspace directory for subdirectories that represent multi-module projects. + * Recursively searches the given workspace directory for multi-module projects. + * * A multi-module project is identified by either: - * - A `.project` file containing multi-module nature, or - * - A `pom.xml` file containing multi-module nature. - * - * @param workspaceDir - The root directory of the workspace to search within. - * @returns A promise that resolves to an array of absolute paths to directories identified as multi-module projects. + * - A `.project` file containing multi-module nature + * - A `pom.xml` file containing multi-module nature + * + * Directories named `.backup` are skipped. + * + * @param workspaceDir - The root directory of the workspace to search. + * @returns A promise that resolves to an array of directory paths containing multi-module projects. */ export async function findMultiModuleProjectsInWorkspaceDir(workspaceDir: string): Promise { const foundProjects: string[] = []; - async function checkSubDirsRecursively(dir: string) { - const dirs = fs.readdirSync(dir, { withFileTypes: true }); - for (const dirent of dirs) { - if (dirent.isDirectory()) { - if (dirent.name === '.backup') { - continue; // Skip .backup directories - } - const subDir = path.join(dir, dirent.name); - const subProjectFile = path.join(subDir, '.project'); - const subPomFile = path.join(subDir, 'pom.xml'); - if (fs.existsSync(subProjectFile)) { - if (await containsMultiModuelNatureInProjectFile(subProjectFile)) { - foundProjects.push(subDir); - } - } else if (fs.existsSync(subPomFile)) { - if (await containsMultiModuleNatureInPomFile(subPomFile)) { - foundProjects.push(subDir); - } - } else { - checkSubDirsRecursively(subDir); + async function checkDir(dir: string) { + if (path.basename(dir) === '.backup') { + return; // Skip .backup directories + } + const projectFile = path.join(dir, '.project'); + const pomFile = path.join(dir, 'pom.xml'); + if (fs.existsSync(projectFile)) { + if (await containsMultiModuelNatureInProjectFile(projectFile)) { + foundProjects.push(dir); + } + } else if (fs.existsSync(pomFile)) { + if (await containsMultiModuleNatureInPomFile(pomFile)) { + foundProjects.push(dir); + } + } else { + // Recurse into subdirectories + const dirs = fs.readdirSync(dir, { withFileTypes: true }); + for (const dirent of dirs) { + if (dirent.isDirectory()) { + await checkDir(path.join(dir, dirent.name)); } } } } - await checkSubDirsRecursively(workspaceDir); + await checkDir(workspaceDir); return foundProjects; } From 960fbed0d1698e35eaadb9b598490b7dc96a42a8 Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Thu, 31 Jul 2025 15:01:00 +0530 Subject: [PATCH 280/349] Update handling dir path when having a workspace --- .../src/views/UnsupportedProject/index.tsx | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/workspaces/mi/mi-visualizer/src/views/UnsupportedProject/index.tsx b/workspaces/mi/mi-visualizer/src/views/UnsupportedProject/index.tsx index 5e4d8be9c91..b1756ab723c 100644 --- a/workspaces/mi/mi-visualizer/src/views/UnsupportedProject/index.tsx +++ b/workspaces/mi/mi-visualizer/src/views/UnsupportedProject/index.tsx @@ -23,7 +23,7 @@ import { Button, Typography } from '@wso2/ui-toolkit'; import styled from '@emotion/styled'; import { View, ViewContent, ViewHeader } from '../../components/View'; import { VSCodeCheckbox } from '@vscode/webview-ui-toolkit/react'; -import { COMMANDS } from '../../constants'; +import path from 'path'; const Container = styled.div` display: flex; @@ -170,7 +170,7 @@ export function UnsupportedProject(props: UnsupportedProjectProps) { const WORKSPACE = 'Workspace'; const { displayOverview = true } = props; const { rpcClient } = useVisualizerContext(); - const [activeWorkspaces, setActiveWorkspaces] = React.useState(undefined); + const [openedDirectory, setOpenedDirectory] = React.useState(undefined); const [foundOldProjects, setFoundOldProjects] = React.useState([]); const [projectType, setProjectType] = React.useState(PROJECT); // 'Project' or 'Workspace' const [activeCard, setActiveCard] = React.useState(0); @@ -224,34 +224,31 @@ export function UnsupportedProject(props: UnsupportedProjectProps) { }; const migrate = async () => { - if (activeWorkspaces) { - await rpcClient.getMiDiagramRpcClient().migrateProject({ dir: activeWorkspaces.fsPath, sources: foundOldProjects }); + if (openedDirectory) { + await rpcClient.getMiDiagramRpcClient().migrateProject({ dir: openedDirectory, sources: foundOldProjects }); } } useEffect(() => { - rpcClient - .getMiVisualizerRpcClient() - .getWorkspaces() - .then(response => { - setActiveWorkspaces(response.workspaces[0]); - }); + rpcClient.getMiVisualizerRpcClient().getProjectUri().then((uri) => { + setOpenedDirectory(uri); + }); }, []); useEffect(() => { - if (activeWorkspaces?.fsPath) { + if (openedDirectory) { rpcClient.getMiVisualizerRpcClient().findOldProjects().then((response) => { if (response && response.length > 0) { setFoundOldProjects(response); if (response.length > 1) { setProjectType(WORKSPACE); - } else if (response.length === 1 && activeWorkspaces.fsPath !== response[0]) { + } else if (response.length === 1 && openedDirectory !== response[0]) { setProjectType(WORKSPACE); } } }); } - }, [activeWorkspaces]); // Runs when activeWorkspaces changes + }, [openedDirectory]); // Runs when openedDirectory changes // Set current theme useEffect(() => { @@ -283,7 +280,7 @@ export function UnsupportedProject(props: UnsupportedProjectProps) { return ( - + From ba3bd31095b05f67d97b1b6c36bbc687646cbe82 Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Thu, 31 Jul 2025 15:38:15 +0530 Subject: [PATCH 281/349] Remove the limit of opening created projects after migration --- .../mi-extension/src/util/migrationUtils.ts | 29 +++++++------------ 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/workspaces/mi/mi-extension/src/util/migrationUtils.ts b/workspaces/mi/mi-extension/src/util/migrationUtils.ts index ef74f1a0eec..88a454c264a 100644 --- a/workspaces/mi/mi-extension/src/util/migrationUtils.ts +++ b/workspaces/mi/mi-extension/src/util/migrationUtils.ts @@ -461,35 +461,26 @@ export async function migrateConfigs( } /** - * Handles post-migration workspace actions based on the number of created project folders. + * Handles workspace updates after a migration process by opening new folders or updating the workspace configuration. * - * - If the number of created projects is within the allowed limit, it either opens the single project in a new window - * or updates the current workspace with the new folders. - * - If the number exceeds the limit, it shows a warning message and prompts the user to open the projects manually. + * - If there is only one folder in workspace or none, and exactly one new folder was created, it opens that folder in a new window and closes the current one. + * - If multiple folders were created or the workspace already contains multiple folders, it updates the workspace with the new folders. * * @param projectUri - The URI of the original project being migrated. - * @param createdFolderUris - An array of URIs representing the newly created project folders. - * @returns A promise that resolves when the workspace actions are complete. + * @param createdFolderUris - An array of URIs representing the folders created during migration. + * @returns A promise that resolves when the workspace has been updated accordingly. */ async function handleWorkspaceAfterMigration(projectUri: string, createdFolderUris: Uri[]) { const createdProjectCount = createdFolderUris.length; - if (createdProjectCount <= MAX_PROJECTS_TO_OPEN) { - if (!workspace.workspaceFolders || workspace.workspaceFolders.length <= 1) { - if (createdProjectCount === 1) { - await commands.executeCommand('vscode.openFolder', createdFolderUris[0], true); - await commands.executeCommand('workbench.action.closeWindow'); - } else { - await updateWorkspaceWithNewFolders(projectUri, createdFolderUris); - } + if (!workspace.workspaceFolders || workspace.workspaceFolders.length <= 1) { + if (createdProjectCount === 1) { + await commands.executeCommand('vscode.openFolder', createdFolderUris[0], true); + await commands.executeCommand('workbench.action.closeWindow'); } else { await updateWorkspaceWithNewFolders(projectUri, createdFolderUris); } } else { - await window.showWarningMessage( - `Processed ${createdProjectCount} composite exporters and generated the relevant integration projects. Please open them from the file explorer.`, - { modal: true } - ); - commands.executeCommand('workbench.view.explorer'); + await updateWorkspaceWithNewFolders(projectUri, createdFolderUris); } } From b68ae94f98f4954c5c3b8fc4a22fc6c2fb88576d Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Thu, 31 Jul 2025 16:53:14 +0530 Subject: [PATCH 282/349] Create new projects inside respective project in the workspace --- workspaces/mi/mi-extension/src/util/migrationUtils.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/workspaces/mi/mi-extension/src/util/migrationUtils.ts b/workspaces/mi/mi-extension/src/util/migrationUtils.ts index 88a454c264a..2e17d6c7cbd 100644 --- a/workspaces/mi/mi-extension/src/util/migrationUtils.ts +++ b/workspaces/mi/mi-extension/src/util/migrationUtils.ts @@ -191,7 +191,7 @@ export async function importProject(params: ImportProjectRequest): Promise 0) { return createdFolderUris.map(uri => ({ filePath: uri.fsPath })); } else { - return [{ filePath: directory }]; + return [{ filePath: source }]; } } else { window.showErrorMessage('Could not find the project details from the provided project: ' + source); From 790f9f74dfd744725a2a1ed622a26f588dfa6ba3 Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Mon, 4 Aug 2025 10:01:24 +0530 Subject: [PATCH 283/349] Address reviewed comments --- workspaces/mi/mi-extension/src/stateMachine.ts | 4 ++-- workspaces/mi/mi-extension/src/util/migrationUtils.ts | 4 ++-- .../mi/mi-visualizer/src/views/UnsupportedProject/index.tsx | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/workspaces/mi/mi-extension/src/stateMachine.ts b/workspaces/mi/mi-extension/src/stateMachine.ts index d699e78ad5b..56f6f527ad0 100644 --- a/workspaces/mi/mi-extension/src/stateMachine.ts +++ b/workspaces/mi/mi-extension/src/stateMachine.ts @@ -31,7 +31,7 @@ import { DMProject } from './datamapper/DMProject'; import { setupEnvironment } from './util/onboardingUtils'; import { getPopupStateMachine } from './stateMachinePopup'; import { askForProject } from './util/workspace'; -import { containsMultiModuelNatureInProjectFile, containsMultiModuleNatureInPomFile, extractNatureFromPomContent, findMultiModuleProjectsInWorkspaceDir } from './util/migrationUtils'; +import { containsMultiModuleNatureInProjectFile, containsMultiModuleNatureInPomFile, extractNatureFromPomContent, findMultiModuleProjectsInWorkspaceDir } from './util/migrationUtils'; const fs = require('fs'); interface MachineContext extends VisualizerLocation { @@ -782,7 +782,7 @@ async function checkIfMiProject(projectUri) { const projectFiles = await vscode.workspace.findFiles(new vscode.RelativePattern(projectUri, '.project'), '**/node_modules/**', 1); if (projectFiles.length > 0) { - if (await containsMultiModuelNatureInProjectFile(projectFiles[0].fsPath)) { + if (await containsMultiModuleNatureInProjectFile(projectFiles[0].fsPath)) { isOldProject = true; log("Integration Studio project detected"); } diff --git a/workspaces/mi/mi-extension/src/util/migrationUtils.ts b/workspaces/mi/mi-extension/src/util/migrationUtils.ts index 2e17d6c7cbd..163355b76df 100644 --- a/workspaces/mi/mi-extension/src/util/migrationUtils.ts +++ b/workspaces/mi/mi-extension/src/util/migrationUtils.ts @@ -1665,7 +1665,7 @@ function findProjectNature(node: any): string | undefined { * @param filePath - The path to the project file to check. * @returns A promise that resolves to `true` if the file contains any of the old multi-module project natures, otherwise `false`. */ -export async function containsMultiModuelNatureInProjectFile(filePath: string): Promise { +export async function containsMultiModuleNatureInProjectFile(filePath: string): Promise { if (!fs.existsSync(filePath)) return false; const content = await fs.promises.readFile(filePath, 'utf-8'); return OLD_MULTI_MODULE_PROJECT_NATURES.some(nature => content.includes(`${nature}`)); @@ -1709,7 +1709,7 @@ export async function findMultiModuleProjectsInWorkspaceDir(workspaceDir: string const projectFile = path.join(dir, '.project'); const pomFile = path.join(dir, 'pom.xml'); if (fs.existsSync(projectFile)) { - if (await containsMultiModuelNatureInProjectFile(projectFile)) { + if (await containsMultiModuleNatureInProjectFile(projectFile)) { foundProjects.push(dir); } } else if (fs.existsSync(pomFile)) { diff --git a/workspaces/mi/mi-visualizer/src/views/UnsupportedProject/index.tsx b/workspaces/mi/mi-visualizer/src/views/UnsupportedProject/index.tsx index b1756ab723c..23a88ed502b 100644 --- a/workspaces/mi/mi-visualizer/src/views/UnsupportedProject/index.tsx +++ b/workspaces/mi/mi-visualizer/src/views/UnsupportedProject/index.tsx @@ -280,7 +280,7 @@ export function UnsupportedProject(props: UnsupportedProjectProps) { return ( - + From 82755e071537813b095235bbf17442709e63d678 Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Mon, 4 Aug 2025 16:01:13 +0530 Subject: [PATCH 284/349] Add test attempt to APIs created in ballerina module tests --- .../components/ArtifactTest/BallerinaModule.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/ArtifactTest/BallerinaModule.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/ArtifactTest/BallerinaModule.ts index fb34290df16..1dd1c75e7f5 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/ArtifactTest/BallerinaModule.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/components/ArtifactTest/BallerinaModule.ts @@ -145,11 +145,11 @@ export class BallerinaModule { values: { 'Name*': { type: 'input', - value: 'TestBallerinaAPI', + value: moduleName + 'API', }, 'Context*': { type: 'input', - value: '/TestBallerinaAPI', + value: '/' + moduleName + 'API', }, } }); From 138aba5e3bc4a65d91c6db9b1332367d21eb9628 Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Mon, 4 Aug 2025 23:08:57 +0530 Subject: [PATCH 285/349] Add test attempt to sequences created in cache mediator tests --- .../test/e2e-playwright-tests/mediatorTests/cache.spec.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/mediatorTests/cache.spec.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/mediatorTests/cache.spec.ts index 37ec76f0d19..0a4f742df90 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/mediatorTests/cache.spec.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/mediatorTests/cache.spec.ts @@ -204,7 +204,7 @@ export default function createTests() { }); await form.clickAddNewForField('Sequence Key'); const sequence = new Sequence(page.page); - await sequence.createSequence('cacheSeq1', true); + await sequence.createSequence('cacheSeq' + testAttempt, true); await form.submit("Add"); await diagram.getMediator("cache", 0, "group"); }); @@ -220,7 +220,7 @@ export default function createTests() { }, 'Sequence Key': { type: 'combo', - value: 'cacheSeq1', + value: 'cacheSeq' + testAttempt, } } }); @@ -242,7 +242,7 @@ export default function createTests() { }); await form.clickAddNewForField('Sequence Key'); const sequence = new Sequence(page.page); - await sequence.createSequence('cacheSeq2', true); + await sequence.createSequence('cacheNewSeq' + testAttempt, true); await form.submit("Update"); }); }); From 9ce37b9631dc4316710f7096598ec2a7c1cc1828 Mon Sep 17 00:00:00 2001 From: tharindulak Date: Tue, 5 Aug 2025 09:26:49 +0530 Subject: [PATCH 286/349] Fix intermittent test failures --- .../src/test/e2e-playwright-tests/mediatorTests/cache.spec.ts | 2 ++ .../src/test/e2e-playwright-tests/mediatorTests/log.spec.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/mediatorTests/cache.spec.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/mediatorTests/cache.spec.ts index 37ec76f0d19..6ba0f1db681 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/mediatorTests/cache.spec.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/mediatorTests/cache.spec.ts @@ -77,6 +77,8 @@ export default function createTests() { const diagram = new Diagram(page.page, 'Resource'); await diagram.init(); await diagram.addMediator('Cache'); + // Wait for the cache mediator to be added + await page.page.waitForTimeout(2000); await diagram.getMediator('cache', 0, 'group'); }); diff --git a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/mediatorTests/log.spec.ts b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/mediatorTests/log.spec.ts index 12394b61cfd..f12cf017d6a 100644 --- a/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/mediatorTests/log.spec.ts +++ b/workspaces/mi/mi-extension/src/test/e2e-playwright-tests/mediatorTests/log.spec.ts @@ -160,6 +160,8 @@ export default function createTests() { } }); console.log('Log mediator edited successfully'); + // Wait for the mediator to be updated + await page.page.waitForTimeout(2000); const editedDescription = await mediator.getDescription(); console.log('Edited log mediator description:', editedDescription); expect(editedDescription).toBe('log mediator edited'); From 1b474278f75a4ebfc37a026475cd3610dbc41dda Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Tue, 5 Aug 2025 10:45:49 +0530 Subject: [PATCH 287/349] Update organization name in Ballerina.toml from "anjanash" to "wso2" --- .../ballerina-extension/test/data/aiTest/Ballerina.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/ballerina-extension/test/data/aiTest/Ballerina.toml b/workspaces/ballerina/ballerina-extension/test/data/aiTest/Ballerina.toml index 01f08b5cc32..ced56415872 100644 --- a/workspaces/ballerina/ballerina-extension/test/data/aiTest/Ballerina.toml +++ b/workspaces/ballerina/ballerina-extension/test/data/aiTest/Ballerina.toml @@ -1,5 +1,5 @@ [package] -org = "anjanash" +org = "wso2" name = "aiTest" version = "0.1.0" distribution = "2201.13.0-m2" From e2f233d9088aea555c89eba78b64a8fe1e9363af Mon Sep 17 00:00:00 2001 From: madushajg Date: Tue, 5 Aug 2025 14:56:15 +0530 Subject: [PATCH 288/349] Refrain create binary expressions when target field of type float/decimal having default values --- .../src/components/Diagram/utils/dm-utils.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/workspaces/ballerina/data-mapper-view/src/components/Diagram/utils/dm-utils.ts b/workspaces/ballerina/data-mapper-view/src/components/Diagram/utils/dm-utils.ts index e69fba3fbb7..0bb4d4a3859 100644 --- a/workspaces/ballerina/data-mapper-view/src/components/Diagram/utils/dm-utils.ts +++ b/workspaces/ballerina/data-mapper-view/src/components/Diagram/utils/dm-utils.ts @@ -1392,6 +1392,20 @@ export function isDefaultValue(field: TypeField, value: string): boolean { if (value === '()'){ return true; } + + // For numeric types, compare the parsed values instead of string comparison + if (field?.typeName === PrimitiveBalType.Int || + field?.typeName === PrimitiveBalType.Float || + field?.typeName === PrimitiveBalType.Decimal) { + + // Clean the value by removing suffixes like 'f' for floats and 'd' for decimals + const cleanValue = value?.trim().replace(/[fd]$/i, ''); + const numericValue = parseFloat(cleanValue); + + // Check if it's a valid number and equals 0 + return !isNaN(numericValue) && numericValue === 0; + } + const defaultValue = getDefaultValue(field?.typeName); return defaultValue === value?.trim(); } From 09aa35345ad7725710b320edde76ba6352655579 Mon Sep 17 00:00:00 2001 From: madushajg Date: Tue, 5 Aug 2025 15:46:32 +0530 Subject: [PATCH 289/349] Enable editing expressions in target fields --- .../Diagram/Node/ObjectOutput/ObjectOutputFieldWidget.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/ObjectOutput/ObjectOutputFieldWidget.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/ObjectOutput/ObjectOutputFieldWidget.tsx index 2ed660ee94b..37f00fbae7a 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/ObjectOutput/ObjectOutputFieldWidget.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/ObjectOutput/ObjectOutputFieldWidget.tsx @@ -27,7 +27,7 @@ import { IDataMapperContext } from "../../../../utils/DataMapperContext/DataMapp import { DataMapperPortWidget, PortState, InputOutputPortModel } from "../../Port"; import { OutputSearchHighlight } from "../commons/Search"; import { useIONodesStyles } from "../../../styles"; -import { useDMCollapsedFieldsStore } from '../../../../store/store'; +import { useDMCollapsedFieldsStore, useDMExpressionBarStore } from '../../../../store/store'; import { getTypeName } from "../../utils/type-utils"; import { ArrayOutputFieldWidget } from "../ArrayOutput/ArrayOuptutFieldWidget"; import { fieldFQNFromPortName, getDefaultValue, getSanitizedId } from "../../utils/common-utils"; @@ -66,6 +66,7 @@ export function ObjectOutputFieldWidget(props: ObjectOutputFieldWidgetProps) { const [portState, setPortState] = useState(PortState.Unselected); const collapsedFieldsStore = useDMCollapsedFieldsStore(); + const setExprBarFocusedPort = useDMExpressionBarStore(state => state.setFocusedPort); let indentation = treeDepth * 16; let expanded = true; @@ -124,7 +125,7 @@ export function ObjectOutputFieldWidget(props: ObjectOutputFieldWidgetProps) { }; const handleEditValue = () => { - // TODO: Implement edit value + setExprBarFocusedPort(portIn); }; const onMouseEnter = () => { @@ -216,8 +217,7 @@ export function ObjectOutputFieldWidget(props: ObjectOutputFieldWidgetProps) { ); const addOrEditValueMenuItem: ValueConfigMenuItem = expression || hasDefaultValue - ? undefined - // ? { title: ValueConfigOption.EditValue, onClick: handleEditValue } TODO: Implement edit value + ? { title: ValueConfigOption.EditValue, onClick: handleEditValue } : { title: ValueConfigOption.InitializeWithValue, onClick: handleAddValue }; const deleteValueMenuItem: ValueConfigMenuItem = { From aacc6ff1d25024b0bcd27d0d559c806bad262d21 Mon Sep 17 00:00:00 2001 From: Vellummyilum Vinoth Date: Tue, 5 Aug 2025 15:46:42 +0530 Subject: [PATCH 290/349] Implement template filtering for AI inline data mapper --- .../service/datamapper/inline_datamapper.ts | 18 ++- .../src/rpc-managers/ai-panel/inline-utils.ts | 105 +++++++++--------- .../data/commandTemplates.const.ts | 1 + .../commandTemplates/models/template.model.ts | 1 + .../views/AIPanel/components/AIChat/index.tsx | 74 ++++++------ .../AIChatInput/hooks/useCommands.ts | 3 + 6 files changed, 115 insertions(+), 87 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/inline_datamapper.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/inline_datamapper.ts index 1a953f5678f..cd60958d769 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/inline_datamapper.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/inline_datamapper.ts @@ -429,11 +429,12 @@ function convertFlatToNestedMap(flatMap: { [key: string]: MappingJson }): { [key * Enhanced main function for AI-powered data mapping generation with inline schema support */ async function mapInlineData(payload: InlineDataMapperModelResponse): Promise { - const maxRetries = 6; + const maxRetries = 3; let retries = 0; + let lastError: Error; while (retries < maxRetries) { - if (retries > 1) { + if (retries > 0) { console.debug("Retrying to generate mappings for the payload."); } @@ -444,6 +445,13 @@ async function mapInlineData(payload: InlineDataMapperModelResponse): Promise { +): Promise { let inputs: { [key: string]: any } = {}; let inputMetadata: { [key: string]: any } = {}; let output: { [key: string]: any } = {}; let outputMetadata: { [key: string]: any } = {}; - let isErrorExists = false; let { inputs: mappingInputs, output: mappingOutput } = inlineDataMapperResponse.mappingsModel as ExpandedDMModel; let transformedInputs = transformInputs(mappingInputs); let transformedOutputs = transformOutput(mappingOutput); for (const parameter of transformedInputs.parameters) { - const inputDefinition: ErrorCode | RecordDefinitonObject = navigateTypeInfo(transformedInputs.parameterFields[parameter.parameterName], false); - - if (isErrorCode(inputDefinition)) { - return inputDefinition as ErrorCode; + try { + const inputDefinition = navigateTypeInfo(transformedInputs.parameterFields[parameter.parameterName], false); + inputs = { + ...inputs, + [parameter.parameterName]: (inputDefinition as RecordDefinitonObject).recordFields + }; + inputMetadata = { + ...inputMetadata, + [parameter.parameterName]: { + "isArrayType": parameter.isArrayType, + "parameterName": parameter.parameterName, + "parameterType": parameter.parameterType, + "type": parameter.type, + "fields": (inputDefinition as RecordDefinitonObject).recordFieldsMetadata + } + }; + } catch (error) { + console.error(`Error in process input parameter: ${parameter.parameterName}`); + throw new Error(`Failed to process input parameter: ${parameter.parameterName}`); } - - inputs = { - ...inputs, - [parameter.parameterName]: (inputDefinition as RecordDefinitonObject).recordFields - }; - - inputMetadata = { - ...inputMetadata, - [parameter.parameterName]: { - "isArrayType": parameter.isArrayType, - "parameterName": parameter.parameterName, - "parameterType": parameter.parameterType, - "type": parameter.type, - "fields": (inputDefinition as RecordDefinitonObject).recordFieldsMetadata - } - }; } - const outputDefinition = navigateTypeInfo(transformedOutputs, false); - - if (isErrorCode(outputDefinition)) { - return outputDefinition as ErrorCode; + try { + const outputDefinition = navigateTypeInfo(transformedOutputs, false); + output = { ...(outputDefinition as RecordDefinitonObject).recordFields }; + outputMetadata = { ...(outputDefinition as RecordDefinitonObject).recordFieldsMetadata }; + } catch (error) { + console.error(`Error in process output definition: ${error}`); + throw new Error('Failed to process output definition'); } - output = { ...(outputDefinition as RecordDefinitonObject).recordFields }; - outputMetadata = { ...(outputDefinition as RecordDefinitonObject).recordFieldsMetadata }; - const response = { inputs, output, @@ -405,16 +403,21 @@ export async function getInlineParamDefinitions( return { parameterMetadata: response, - errorStatus: isErrorExists + errorStatus: false }; } async function sendInlineDatamapperRequest(inlineDataMapperResponse: InlineDataMapperModelResponse | ErrorCode): Promise { - const response: DatamapperResponse = await generateInlineAutoMappings(inlineDataMapperResponse as InlineDataMapperModelResponse); - return response; + try { + const response: DatamapperResponse = await generateInlineAutoMappings(inlineDataMapperResponse as InlineDataMapperModelResponse); + return response; + } catch (error) { + console.error(`Error in sendInlineDatamapperRequest: ${error}`); + throw error; + } } -async function getInlineDatamapperCode(inlineDataMapperResponse: InlineDataMapperModelResponse | ErrorCode, parameterDefinitions: ParameterMetadata | ErrorCode): Promise { +async function getInlineDatamapperCode(inlineDataMapperResponse: InlineDataMapperModelResponse | ErrorCode, parameterDefinitions: ParameterMetadata | ErrorCode): Promise { let nestedKeyArray: string[] = []; try { let accessToken: string | ErrorCode; @@ -432,7 +435,7 @@ async function getInlineDatamapperCode(inlineDataMapperResponse: InlineDataMappe return finalCode; } catch (error) { console.error(error); - return TIMEOUT; + throw error; } } @@ -442,24 +445,24 @@ export async function processInlineMappings( ): Promise { let inlineDataMapperResponse = cleanInlineDataMapperModelResponse(request) as InlineDataMapperModelResponse; - let result = await getInlineParamDefinitions(inlineDataMapperResponse); - if (isErrorCode(result)) { - return result as ErrorCode; - } - let parameterDefinitions = (result as ParameterDefinitions).parameterMetadata; - if (file) { - let mappedResult = await mappingFileInlineDataMapperModel(file, inlineDataMapperResponse); - if (isErrorCode(mappedResult)) { - return mappedResult as ErrorCode; + try { + let result = await getInlineParamDefinitions(inlineDataMapperResponse); + + let parameterDefinitions = (result as ParameterDefinitions).parameterMetadata; + if (file) { + let mappedResult = await mappingFileInlineDataMapperModel(file, inlineDataMapperResponse); + if (isErrorCode(mappedResult)) { + return mappedResult as ErrorCode; + } + inlineDataMapperResponse = mappedResult as InlineDataMapperModelResponse; } - inlineDataMapperResponse = mappedResult as InlineDataMapperModelResponse; - } - const codeObject = await getInlineDatamapperCode(inlineDataMapperResponse, parameterDefinitions); - if (isErrorCode(codeObject) || Object.keys(codeObject).length === 0) { - return codeObject as ErrorCode; - } + const codeObject = await getInlineDatamapperCode(inlineDataMapperResponse, parameterDefinitions); - const mappings: Mapping[] = transformCodeObjectToMappings(codeObject, inlineDataMapperResponse); - return { mappings }; + const mappings: Mapping[] = transformCodeObjectToMappings(codeObject, inlineDataMapperResponse); + return { mappings }; + } catch (error) { + console.error(error); + throw error; + } } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/commandTemplates/data/commandTemplates.const.ts b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/commandTemplates/data/commandTemplates.const.ts index a635e906ed1..8443e62e0b7 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/commandTemplates/data/commandTemplates.const.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/commandTemplates/data/commandTemplates.const.ts @@ -105,6 +105,7 @@ export const commandTemplates = { id: TemplateId.InlineMappings, text: 'generate mappings using record fields and external values', placeholders: [], + defaultVisibility: false }, ], [Command.TypeCreator]: [ diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/commandTemplates/models/template.model.ts b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/commandTemplates/models/template.model.ts index 67088d93de8..a7449e078fd 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/commandTemplates/models/template.model.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/commandTemplates/models/template.model.ts @@ -23,4 +23,5 @@ export interface TemplateDefinition { id: TemplateId; text: string; placeholders: PlaceholderDefinition[]; + defaultVisibility?: boolean; } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx index 5eb826a7ffa..56d780b3625 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx @@ -1317,51 +1317,63 @@ const AIChat: React.FC = () => { addChatEntry("assistant", assistant_response); } - async function processInlineMappingParameters(message: string, metadata?: Record, attachments?: Attachment[],) { + async function processInlineMappingParameters(message: string, metadata?: Record, attachments?: Attachment[]) { let assistant_response = ""; let finalContent = ""; + + if (!metadata || Object.keys(metadata).length === 0) { + throw new Error(`Please make sure variables are initialized, and then try again.`) + } + let fileName = metadata.codeData.lineRange.fileName const variableName = metadata.name; const typeName = metadata.mappingsModel.output.typeName; setIsLoading(true); - const requestPayload: any = { - backendUri: "", - token: "", - metadata - }; - if (attachments && attachments.length > 0) { - requestPayload.attachment = attachments; - } - const allMappingsRequest = await rpcClient.getAiPanelRpcClient().getMappingsFromModel(requestPayload); - const sourceResponse = await rpcClient.getInlineDataMapperRpcClient().getAllDataMapperSource(allMappingsRequest); + try { + const requestPayload: any = { + backendUri: "", + token: "", + metadata + }; + if (attachments && attachments.length > 0) { + requestPayload.attachment = attachments; + } + const allMappingsRequest = await rpcClient.getAiPanelRpcClient().getMappingsFromModel(requestPayload); + const sourceResponse = await rpcClient.getInlineDataMapperRpcClient().getAllDataMapperSource(allMappingsRequest); - setIsLoading(false); + setIsLoading(false); - finalContent = sourceResponse.textEdits[allMappingsRequest.filePath]?.[0]?.newText; + finalContent = sourceResponse.textEdits[allMappingsRequest.filePath]?.[0]?.newText; - assistant_response = `Here are the data mappings:\n\n`; - assistant_response += `\n**Note**: When you click **Add to Integration**, it will override your existing mappings.\n`; - - const moduleInfo = metadata.mappingsModel.output.moduleInfo; - const hasModuleInfo = moduleInfo && moduleInfo.moduleName; + assistant_response = `Here are the data mappings:\n\n`; + assistant_response += `\n**Note**: When you click **Add to Integration**, it will override your existing mappings.\n`; - const typePrefix = hasModuleInfo - ? `${moduleInfo.moduleName.split('.').pop()}:${typeName}` - : typeName; + const moduleInfo = metadata.mappingsModel.output.moduleInfo; + const hasModuleInfo = moduleInfo && moduleInfo.moduleName; - const formattedContent = `${typePrefix} ${variableName} = {\n${formatWithProperIndentation(finalContent)}\n};`; - - assistant_response += `\n\`\`\`ballerina\n${formattedContent}\n\`\`\`\n`; + const typePrefix = hasModuleInfo + ? `${moduleInfo.moduleName.split('.').pop()}:${typeName}` + : typeName; - setMessages((prevMessages) => { - const newMessages = [...prevMessages]; - newMessages[newMessages.length - 1].content = assistant_response; - return newMessages; - }); - addChatEntry("user", message); - addChatEntry("assistant", assistant_response); + const formattedContent = `${typePrefix} ${variableName} = {\n${formatWithProperIndentation(finalContent)}\n};`; + + assistant_response += `\n\`\`\`ballerina\n${formattedContent}\n\`\`\`\n`; + + setMessages((prevMessages) => { + const newMessages = [...prevMessages]; + newMessages[newMessages.length - 1].content = assistant_response; + return newMessages; + }); + addChatEntry("user", message); + addChatEntry("assistant", assistant_response); + + return { success: true, response: assistant_response }; + } catch (error) { + setIsLoading(false); + return { error: error instanceof Error ? error.message : "An unexpected error occurred" }; + } } async function processContextTypeCreation(message: string, attachments: Attachment[]) { diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChatInput/hooks/useCommands.ts b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChatInput/hooks/useCommands.ts index c48714fcc5f..775a8dd87a3 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChatInput/hooks/useCommands.ts +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChatInput/hooks/useCommands.ts @@ -92,6 +92,9 @@ export function useCommands({ commandTemplate }: UseCommandsParams) { if (templateQuery.startsWith(" ")) { const filterText = templateQuery.slice(1); filtered = templates.filter((template) => { + if (template.defaultVisibility === false) { + return false; + } return (template.text.toLowerCase().startsWith(filterText) && template.id !== TemplateId.Wildcard); }).map((template) => ({ text: template.text, From e5ba63c7b053bdf6bfe9211ff4ce5b794e4fdfda Mon Sep 17 00:00:00 2001 From: Vellummyilum Vinoth Date: Tue, 5 Aug 2025 16:13:24 +0530 Subject: [PATCH 291/349] Implement template filtering for AI inline data mapper --- .../src/views/AIPanel/components/AIChat/index.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx index 56d780b3625..97d393a84f5 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/AIPanel/components/AIChat/index.tsx @@ -1333,8 +1333,6 @@ const AIChat: React.FC = () => { try { const requestPayload: any = { - backendUri: "", - token: "", metadata }; if (attachments && attachments.length > 0) { From 63d4d1df20162c61c2b02a67bcaee0f378d2f940 Mon Sep 17 00:00:00 2001 From: kaumini Date: Tue, 5 Aug 2025 16:15:58 +0530 Subject: [PATCH 292/349] Fix windows fuction view click --- workspaces/ballerina/bi-diagram/package.json | 3 ++- .../src/components/nodes/BaseNode/BaseNodeWidget.tsx | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/bi-diagram/package.json b/workspaces/ballerina/bi-diagram/package.json index 21aa175fae9..6bc40ebfe03 100644 --- a/workspaces/ballerina/bi-diagram/package.json +++ b/workspaces/ballerina/bi-diagram/package.json @@ -35,7 +35,8 @@ "@emotion/react": "^11.9.3", "@emotion/styled": "^11.10.5", "dagre": "~0.8.5", - "lodash": "~4.17.21" + "lodash": "~4.17.21", + "path": "~0.12.7" }, "devDependencies": { "@storybook/react": "^6.3.7", diff --git a/workspaces/ballerina/bi-diagram/src/components/nodes/BaseNode/BaseNodeWidget.tsx b/workspaces/ballerina/bi-diagram/src/components/nodes/BaseNode/BaseNodeWidget.tsx index e001c8057e4..f1f8d7695dc 100644 --- a/workspaces/ballerina/bi-diagram/src/components/nodes/BaseNode/BaseNodeWidget.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/nodes/BaseNode/BaseNodeWidget.tsx @@ -36,6 +36,7 @@ import { DiagnosticsPopUp } from "../../DiagnosticsPopUp"; import { getNodeTitle, nodeHasError } from "../../../utils/node"; import { BreakpointMenu } from "../../BreakNodeMenu/BreakNodeMenu"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; +import path from 'path'; export namespace NodeStyles { export type NodeStyleProp = { @@ -247,7 +248,7 @@ export function BaseNodeWidget(props: BaseNodeWidgetProps) { } const { fileName, startLine, endLine } = model.node.properties.view.value as ELineRange; openView && - openView(projectPath + "/" + fileName, { + openView(path.join(projectPath, fileName), { startLine: startLine.line, startColumn: startLine.offset, endLine: endLine.line, @@ -261,7 +262,7 @@ export function BaseNodeWidget(props: BaseNodeWidgetProps) { } const { fileName, startLine, endLine } = model.node.properties.view.value as ELineRange; openView && - openView(projectPath + "/" + fileName, { + openView(path.join(projectPath, fileName), { startLine: startLine.line, startColumn: startLine.offset, endLine: endLine.line, From 27089d8433efbb37897397ee027b78aab0b618ca Mon Sep 17 00:00:00 2001 From: madushajg Date: Tue, 5 Aug 2025 20:16:27 +0530 Subject: [PATCH 293/349] Enable initializing with enums --- .../src/interfaces/inline-data-mapper.ts | 2 +- .../ObjectOutput/ObjectOutputFieldWidget.tsx | 34 +++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/inline-data-mapper.ts b/workspaces/ballerina/ballerina-core/src/interfaces/inline-data-mapper.ts index 9cb08dd397e..a8307740802 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/inline-data-mapper.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/inline-data-mapper.ts @@ -159,7 +159,7 @@ export interface IOTypeField { export interface EnumMember { id: string; - value: string; + typeName: string; } export interface MappingElement { diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/ObjectOutput/ObjectOutputFieldWidget.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/ObjectOutput/ObjectOutputFieldWidget.tsx index 37f00fbae7a..1fe678a056d 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/ObjectOutput/ObjectOutputFieldWidget.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/ObjectOutput/ObjectOutputFieldWidget.tsx @@ -73,21 +73,32 @@ export function ObjectOutputFieldWidget(props: ObjectOutputFieldWidgetProps) { const typeName = getTypeName(field); const typeKind = field?.kind; + const isArray = typeKind === TypeKind.Array; const isRecord = typeKind === TypeKind.Record; + const isEnum = typeKind === TypeKind.Enum; let updatedParentId = getSanitizedId(parentId); if (fieldIndex !== undefined) { updatedParentId = `${updatedParentId}.${fieldIndex}` } + let fieldName = field?.variableName || ''; - let portName = updatedParentId !== '' ? fieldName !== '' && fieldIndex === undefined ? `${updatedParentId}.${fieldName}` : updatedParentId : fieldName; + let portName = updatedParentId !== '' + ? fieldName !== '' && fieldIndex === undefined + ? `${updatedParentId}.${fieldName}` + : updatedParentId + : fieldName; + const portIn = getPort(portName + ".IN"); const mapping = portIn && portIn.attributes.value; const { inputs, expression, diagnostics } = mapping || {}; const connectedViaLink = inputs?.length > 0; - const hasDefaultValue = expression && getDefaultValue(field?.kind) === expression.trim(); + + const hasDefaultValue = expression && + getDefaultValue(field?.kind) === expression.trim() && + !isEnum; const fields = isRecord && field?.fields?.filter(f => f !== null); const isWithinArray = fieldIndex !== undefined; @@ -115,6 +126,15 @@ export function ObjectOutputFieldWidget(props: ObjectOutputFieldWidgetProps) { } }; + const handleAddEnumValue = async (value: string) => { + setLoading(true); + try { + await addValue(fieldFQNFromPortName(portName), value, context); + } finally { + setLoading(false); + } + }; + const handleDeleteValue = async () => { setLoading(true); try { @@ -225,8 +245,16 @@ export function ObjectOutputFieldWidget(props: ObjectOutputFieldWidgetProps) { onClick: handleDeleteValue }; + const addEnumValueMenuItems: ValueConfigMenuItem[] = expression + ? [{ title: ValueConfigOption.EditValue, onClick: handleEditValue }] + : field?.members?.map(member => ({ + title: `Initialize as ${member.typeName}`, + onClick: () => handleAddEnumValue(member.typeName) + })); + const valConfigMenuItems = [ - !isWithinArray && addOrEditValueMenuItem, + !isWithinArray && !isEnum && addOrEditValueMenuItem, + ...(isEnum ? addEnumValueMenuItems : []), (expression || hasDefaultValue || isWithinArray) && deleteValueMenuItem ]; From e63276f368df7cf94c160c63293e8812620a4928 Mon Sep 17 00:00:00 2001 From: Chinthaka Jayatilake <37581983+ChinthakaJ98@users.noreply.github.com> Date: Tue, 5 Aug 2025 20:17:53 +0530 Subject: [PATCH 294/349] Fix issues in the MI Extension --- .../mi/mi-extension/src/debugger/activate.ts | 6 ++++-- .../mi/mi-extension/src/lang-client/activator.ts | 5 +++++ .../src/rpc-managers/mi-diagram/rpc-manager.ts | 12 ++++++------ .../rpc-managers/mi-visualizer/rpc-manager.ts | 10 +++++----- .../mi-extension/src/test-explorer/activator.ts | 7 +++++-- .../mi/mi-extension/src/util/fileOperations.ts | 2 +- .../mi/mi-extension/src/util/onboardingUtils.ts | 16 ++++++++-------- 7 files changed, 34 insertions(+), 24 deletions(-) diff --git a/workspaces/mi/mi-extension/src/debugger/activate.ts b/workspaces/mi/mi-extension/src/debugger/activate.ts index 1e001ab9ced..eb2d774dea3 100644 --- a/workspaces/mi/mi-extension/src/debugger/activate.ts +++ b/workspaces/mi/mi-extension/src/debugger/activate.ts @@ -76,8 +76,10 @@ export function activateDebugger(context: vscode.ExtensionContext) { } }); - vscode.commands.registerCommand(COMMANDS.REMOTE_DEPLOY_PROJECT, async (postBuildTask?: Function) => { - const projectUri = await askForProject(); + vscode.commands.registerCommand(COMMANDS.REMOTE_DEPLOY_PROJECT, async (projectUri?: string, postBuildTask?: Function) => { + if (!projectUri) { + projectUri = await askForProject(); + } await executeRemoteDeployTask(projectUri, postBuildTask); }); diff --git a/workspaces/mi/mi-extension/src/lang-client/activator.ts b/workspaces/mi/mi-extension/src/lang-client/activator.ts index 2e29a458212..8f77f750d90 100644 --- a/workspaces/mi/mi-extension/src/lang-client/activator.ts +++ b/workspaces/mi/mi-extension/src/lang-client/activator.ts @@ -53,6 +53,7 @@ import { getJavaHomeFromConfig, getProjectSetupDetails, isMISetup, isJavaSetup } import { SELECTED_SERVER_PATH } from '../debugger/constants'; import { extension } from '../MIExtensionContext'; import { extractCAppDependenciesAsProjects } from '../visualizer/activate'; +import vscode from "vscode"; const exec = util.promisify(require('child_process').exec); export interface ScopeInfo { @@ -173,6 +174,10 @@ export class MILanguageClient { } await isJavaSetup(projectUri, miVersionFromPom); await isMISetup(projectUri, miVersionFromPom); + const versions: string[] = ["4.0.0", "4.1.0", "4.2.0", "4.3.0"]; + const config = vscode.workspace.getConfiguration('MI', vscode.Uri.file(projectUri)); + await config.update("LEGACY_EXPRESSION_ENABLED", miVersionFromPom && versions.includes(miVersionFromPom), + vscode.ConfigurationTarget.WorkspaceFolder); const JAVA_HOME = getJavaHomeFromConfig(this.projectUri); if (JAVA_HOME) { const isJDKCompatible = await this.checkJDKCompatibility(JAVA_HOME); diff --git a/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts b/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts index 70ecb5eb726..3bbdcd7d73e 100644 --- a/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts +++ b/workspaces/mi/mi-extension/src/rpc-managers/mi-diagram/rpc-manager.ts @@ -474,7 +474,7 @@ export class MiDiagramRpcManager implements MiDiagramAPI { async getMIVersionFromPom(): Promise { return new Promise(async (resolve) => { - const res = await getMIVersionFromPom(); + const res = await getMIVersionFromPom(this.projectUri); resolve({ version: res ?? '' }); }); } @@ -3932,7 +3932,7 @@ ${endpointAttributes} const MI_COPILOT_BACKEND_V2 = process.env.MI_COPILOT_BACKEND_V2 as string; const MI_COPILOT_BACKEND_V3 = process.env.MI_COPILOT_BACKEND_V3 as string; const RUNTIME_THRESHOLD_VERSION = RUNTIME_VERSION_440; - const runtimeVersion = await getMIVersionFromPom(); + const runtimeVersion = await getMIVersionFromPom(this.projectUri); const isVersionThresholdReached = runtimeVersion ? compareVersions(runtimeVersion, RUNTIME_THRESHOLD_VERSION) : -1; @@ -4016,7 +4016,7 @@ ${endpointAttributes} resolve({ inboundConnectors: connectorCache.get('inbound-connector-data'), outboundConnectors: connectorCache.get('outbound-connector-data'), connectors: connectorCache.get('connectors') }); return; } - const runtimeVersion = miVersion ? miVersion : await getMIVersionFromPom(); + const runtimeVersion = miVersion ? miVersion : await getMIVersionFromPom(this.projectUri); const response = await fetch(APIS.MI_CONNECTOR_STORE); const connectorStoreResponse = await fetch(APIS.MI_CONNECTOR_STORE_BACKEND.replace('${version}', runtimeVersion ?? '')); @@ -4549,9 +4549,9 @@ ${keyValuesXML}`; const workspaceFolderUri = vscode.Uri.file(path.resolve(this.projectUri)); if (workspaceFolderUri) { const config = vscode.workspace.getConfiguration('MI', workspaceFolderUri); - const isRemoteDeploymentEnabled = config.get("REMOTE_DEPLOYMENT_ENABLED"); + const isRemoteDeploymentEnabled = config.get("REMOTE_DEPLOYMENT_ENABLED"); if (isRemoteDeploymentEnabled) { - await commands.executeCommand(COMMANDS.REMOTE_DEPLOY_PROJECT, false); + await commands.executeCommand(COMMANDS.REMOTE_DEPLOY_PROJECT, this.projectUri, false); } else { const configure = await vscode.window.showWarningMessage( 'Remote deployment is not enabled. Do you want to enable and configure it now?', @@ -5588,7 +5588,7 @@ ${keyValuesXML}`; async fetchConnectors(name, operation: 'add' | 'remove') { - const runtimeVersion = await getMIVersionFromPom(); + const runtimeVersion = await getMIVersionFromPom(this.projectUri); const connectorStoreResponse = await fetch(APIS.MI_CONNECTOR_STORE_BACKEND.replace('${version}', runtimeVersion ?? '')); const connectorStoreData = await connectorStoreResponse.json(); diff --git a/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts b/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts index e1ecafc1a4e..78d5704dfa2 100644 --- a/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts +++ b/workspaces/mi/mi-extension/src/rpc-managers/mi-visualizer/rpc-manager.ts @@ -721,12 +721,12 @@ export class MiVisualizerRpcManager implements MIVisualizerAPI { } async updateProjectSettingsConfig(params: ProjectConfig): Promise { - const config = workspace.getConfiguration('MI'); - await config.update(params.configName, params.value, vscode.ConfigurationTarget.Workspace); + const config = vscode.workspace.getConfiguration('MI', vscode.Uri.file(this.projectUri)); + await config.update(params.configName, params.value, vscode.ConfigurationTarget.WorkspaceFolder); } async isSupportEnabled(configName: string): Promise { - const projectRuntimeVersion = await getMIVersionFromPom(); + const projectRuntimeVersion = await getMIVersionFromPom(this.projectUri); return new Promise((resolve, reject) => { try { if (configName === "LEGACY_EXPRESSION_ENABLED") { @@ -736,8 +736,8 @@ export class MiVisualizerRpcManager implements MIVisualizerAPI { return; } } - const config = workspace.getConfiguration('MI'); - resolve(config.get(configName) || false); + const config = vscode.workspace.getConfiguration('MI', vscode.Uri.file(this.projectUri)); + resolve(config.get(configName) || false); } catch (error) { reject(error); } diff --git a/workspaces/mi/mi-extension/src/test-explorer/activator.ts b/workspaces/mi/mi-extension/src/test-explorer/activator.ts index 99d30638879..0fda010bb25 100644 --- a/workspaces/mi/mi-extension/src/test-explorer/activator.ts +++ b/workspaces/mi/mi-extension/src/test-explorer/activator.ts @@ -28,6 +28,8 @@ import { activateMockServiceTreeView } from "./mock-services/activator"; import { TagRange, TestCase, UnitTest } from "../../../syntax-tree/lib/src"; import { normalize } from "upath"; import { MILanguageClient } from "../lang-client/activator"; +import { webviews } from "../visualizer/webview"; +import vscode from "vscode"; export let testController: TestController; const testDirNodes: string[] = []; @@ -57,8 +59,9 @@ export async function activateTestExplorer(extensionContext: ExtensionContext) { startWatchingWorkspace(testFileMatchPattern, createTestsForAllFiles); commands.registerCommand(COMMANDS.ADD_TEST_SUITE, (args: any) => { - const projectUri = getProjectRoot(Uri.parse(args?.id)); - openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.TestSuite, projectUri }); + const projectUri = vscode.workspace.workspaceFolders?.[0]?.uri; + const webview = [...webviews.values()].find(webview => webview.getWebview()?.active) || [...webviews.values()][0]; + openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.TestSuite, projectUri: webview ? webview.getProjectUri() : projectUri?.fsPath }); console.log('Add Test suite'); }); diff --git a/workspaces/mi/mi-extension/src/util/fileOperations.ts b/workspaces/mi/mi-extension/src/util/fileOperations.ts index f11b004f371..427321f9b7d 100644 --- a/workspaces/mi/mi-extension/src/util/fileOperations.ts +++ b/workspaces/mi/mi-extension/src/util/fileOperations.ts @@ -652,7 +652,7 @@ export async function createMetadataFilesForRegistryCollection(collectionRoot: s export async function getAvailableRegistryResources(projectDir: string): Promise { const result: RegistryArtifact[] = []; - const miVersion = await getMIVersionFromPom(); + const miVersion = await getMIVersionFromPom(projectDir); if (miVersion && compareVersions(miVersion, '4.4.0') >= 0) { var artifactXMLPath = path.join(projectDir, 'src', 'main', 'wso2mi', 'resources', 'artifact.xml'); } else { diff --git a/workspaces/mi/mi-extension/src/util/onboardingUtils.ts b/workspaces/mi/mi-extension/src/util/onboardingUtils.ts index 16a448c82ae..92b657bce2e 100644 --- a/workspaces/mi/mi-extension/src/util/onboardingUtils.ts +++ b/workspaces/mi/mi-extension/src/util/onboardingUtils.ts @@ -60,10 +60,9 @@ export async function setupEnvironment(projectUri: string, isOldProject: boolean return false; } const versions: string[] = ["4.0.0", "4.1.0", "4.2.0", "4.3.0"]; - if (miVersionFromPom && versions.includes(miVersionFromPom)) { - const config = vscode.workspace.getConfiguration('MI', vscode.Uri.file(projectUri)); - await config.update("LEGACY_EXPRESSION_ENABLED", true, vscode.ConfigurationTarget.WorkspaceFolder); - } + const config = vscode.workspace.getConfiguration('MI', vscode.Uri.file(projectUri)); + await config.update("LEGACY_EXPRESSION_ENABLED", miVersionFromPom && versions.includes(miVersionFromPom), + vscode.ConfigurationTarget.WorkspaceFolder); const isMISet = await isMISetup(projectUri, miVersionFromPom); const isJavaSet = await isJavaSetup(projectUri, miVersionFromPom); @@ -97,7 +96,7 @@ export async function isMIUpToDate(): Promise { } export async function getProjectSetupDetails(projectUri: string): Promise { - const miVersion = await getMIVersionFromPom(); + const miVersion = await getMIVersionFromPom(projectUri); if (!miVersion) { vscode.window.showErrorMessage('Failed to get WSO2 Integrator: MI version from pom.xml.'); return { miVersionStatus: 'missing', javaDetails: { status: 'not-valid' }, miDetails: { status: 'not-valid' } }; @@ -110,8 +109,9 @@ export async function getProjectSetupDetails(projectUri: string): Promise { - const pomFiles = await vscode.workspace.findFiles('pom.xml', '**/node_modules/**', 1); +export async function getMIVersionFromPom(projectUri: string): Promise { + const pattern = new vscode.RelativePattern(projectUri, 'pom.xml'); + const pomFiles = await vscode.workspace.findFiles(pattern, '**/node_modules/**', 1); if (pomFiles.length === 0) { vscode.window.showErrorMessage('pom.xml not found.'); return null; @@ -585,7 +585,7 @@ function isMIInstalledAtPath(miPath: string): boolean { return fs.existsSync(path.join(miPath, 'bin', miExecutable)); } export async function setPathsInWorkSpace(request: SetPathRequest): Promise { - const projectMIVersion = await getMIVersionFromPom(); + const projectMIVersion = await getMIVersionFromPom(request.projectUri); let response: PathDetailsResponse = { status: 'not-valid' }; if (projectMIVersion) { From 1fcdf84280edeba71986dfc09364f9a02afc743b Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Tue, 5 Aug 2025 23:39:43 +0530 Subject: [PATCH 295/349] Handle ciphertool.enable property not getting updated in pom.xml file --- .../Overview/ProjectInformation/ProjectInformationForm.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/workspaces/mi/mi-visualizer/src/views/Overview/ProjectInformation/ProjectInformationForm.tsx b/workspaces/mi/mi-visualizer/src/views/Overview/ProjectInformation/ProjectInformationForm.tsx index 975bb33e731..93a55660ebd 100644 --- a/workspaces/mi/mi-visualizer/src/views/Overview/ProjectInformation/ProjectInformationForm.tsx +++ b/workspaces/mi/mi-visualizer/src/views/Overview/ProjectInformation/ProjectInformationForm.tsx @@ -53,6 +53,7 @@ const sectionTitleStyle = { margin: 0, paddingLeft: 20 }; // Field name to pom property name mapping export const fieldToPomPropertyMap: Record = { "buildDetails-enableFatCar": "fat.car.enable", + "buildDetails-dockerDetails-cipherToolEnable": "ciphertool.enable" }; export function ProjectInformationForm(props: ProjectInformationFormProps) { @@ -70,7 +71,7 @@ export function ProjectInformationForm(props: ProjectInformationFormProps) { "buildDetails-dockerDetails-dockerFileBaseImage": yup.string().required("Base image is required"), "buildDetails-dockerDetails-dockerName": yup.string().required("Docker name is required"), "buildDetails-enableFatCar": yup.boolean(), - "buildDetails-dockerDetails-enableCipherTool": yup.boolean(), + "buildDetails-dockerDetails-cipherToolEnable": yup.boolean(), "buildDetails-dockerDetails-keyStoreName": yup.string(), "buildDetails-dockerDetails-keyStoreAlias": yup.string(), "buildDetails-dockerDetails-keyStoreType": yup.string(), @@ -176,7 +177,7 @@ export function ProjectInformationForm(props: ProjectInformationFormProps) { "buildDetails-dockerDetails-dockerFileBaseImage": response.buildDetails?.dockerDetails?.dockerFileBaseImage?.value, "buildDetails-dockerDetails-dockerName": response.buildDetails?.dockerDetails?.dockerName.value, "buildDetails-enableFatCar": response.buildDetails?.enableFatCar?.value === 'true', - "buildDetails-dockerDetails-enableCipherTool": Boolean(response.buildDetails?.dockerDetails?.cipherToolEnable?.value), + "buildDetails-dockerDetails-cipherToolEnable": response.buildDetails?.dockerDetails?.cipherToolEnable?.value === 'true', "buildDetails-dockerDetails-keyStoreName": response.buildDetails?.dockerDetails?.keyStoreName?.value, "buildDetails-dockerDetails-keyStoreAlias": response.buildDetails?.dockerDetails?.keyStoreAlias?.value, "buildDetails-dockerDetails-keyStoreType": response.buildDetails?.dockerDetails?.keyStoreType?.value, @@ -511,7 +512,7 @@ export function ProjectInformationForm(props: ProjectInformationFormProps) { descriptionSx={{ margin: "10px 0" }} control={control as any} sx={fieldStyle} - {...register("buildDetails-dockerDetails-enableCipherTool")} + {...register("buildDetails-dockerDetails-cipherToolEnable")} /> Date: Wed, 6 Aug 2025 10:20:34 +0530 Subject: [PATCH 296/349] Modularize the e2e-test code --- .../api-services/graphql-service.spec.ts | 10 +-- .../api-services/graphqlUtils.ts | 17 ++++- .../test/e2e-playwright-tests/test.list.ts | 62 +++++++++---------- 3 files changed, 48 insertions(+), 41 deletions(-) diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts index 98409b0c1a7..a6d3be13f64 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphql-service.spec.ts @@ -115,17 +115,11 @@ export default function createTests() { await artifactWebView.getByRole('textbox', { name: 'Field Name*The name of the' }).fill(TEST_DATA.mutation[1].name); await artifactWebView.getByRole('button', { name: 'Save' }).click(); + await graphqlServiceUtils.closePanel(); - await artifactWebView.getByTestId('close-panel-btn').click({ force: true }); const outputName = TEST_DATA.mutation[1].outputType; await typeEditorUtils.verifyTypeLink(TEST_DATA.editedBasePath(testAttempt), TEST_DATA.mutation[1].name, outputName); await typeEditorUtils.verifyTypeNodeExists(outputName); - // TODO: Verify the argument type node exists - // await typeEditorUtils.verifyTypeNodeExists(TEST_DATA.mutation[1].arguments[1].name); - - await artifactWebView.getByTestId(`type-node-${outputName}`).getByText(`${outputName}`).click(); - await artifactWebView.getByTestId('side-panel').getByText('function1').click(); - await artifactWebView.getByTestId('back-button').click(); await graphqlServiceUtils.addFunction("function1", "string"); }); @@ -157,4 +151,4 @@ export default function createTests() { await artifactWebView.getByRole('button', { name: 'Save' }).click(); }); }); -} \ No newline at end of file +} diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts index a0473096f95..ee4751ae9d8 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/api-services/graphqlUtils.ts @@ -66,7 +66,8 @@ export class GraphQLServiceUtils { } async addFunction(name: string, returnType: string) { - await this.webView.getByTestId('type-node-outputtype1').getByText('outputtype1').click(); + const outputType = TEST_DATA.mutation[1].outputType; + await this.webView.getByTestId(`type-node-${outputType}`).getByText(`${outputType}`).click(); await this.webView.getByRole('button', { name: '   Implement' }).click(); await this.webView.getByTestId('add-variable-button').click({ force: true }); await this.setSidePanel({ @@ -171,4 +172,16 @@ export class GraphQLServiceUtils { async waitForElement(locator: any, timeout = 10000) { await locator.waitFor({ state: 'visible', timeout }); } -} \ No newline at end of file + + async closePanel() { + await this.page.waitForTimeout(2000); + const closeButton = this.webView.getByTestId('close-panel-btn'); + await this.waitForElement(closeButton); + + await closeButton.click({ force: true }); + await closeButton.waitFor({ + state: 'detached', + timeout: 10000 + }); + } +} diff --git a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test.list.ts b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test.list.ts index 8059d7fb925..d4d64a2b899 100644 --- a/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test.list.ts +++ b/workspaces/bi/bi-extension/src/test/e2e-playwright-tests/test.list.ts @@ -58,40 +58,40 @@ test.beforeAll(async () => { console.log('>>> Starting test suite'); }); -// // <----Automation Test----> -// test.describe(automation); +// <----Automation Test----> +test.describe(automation); -// // <----AI Chat Service Test----> -// test.describe(aiChatService); +// <----AI Chat Service Test----> +test.describe(aiChatService); -// // <----Integration as API Test----> -// test.describe(httpService); +// <----Integration as API Test----> +test.describe(httpService); test.describe(graphqlService); -// test.describe(tcpService); - -// // <----Event Integration Test----> -// test.describe(kafkaIntegration); -// test.describe(rabbitmqIntegration); -// test.describe(mqttIntegration); -// test.describe(azureIntegration); -// test.describe(salesforceIntegration); -// test.describe(twillioIntegration); -// test.describe(githubIntegration); - -// // <----File Integration Test----> -// test.describe(ftpIntegration); -// test.describe(directoryIntegration); - -// // <----Other Artifacts Test----> -// test.describe(functionArtifact); -// test.describe(naturalFunctionArtifact); -// test.describe(dataMapperArtifact); // TODO: Fix this test -// test.describe(typeDiagramArtifact); // TODO: Fix this test -// test.describe(connectionArtifact); -// test.describe(configuration); // TODO: Fix this test - -// test.describe(configuration); -// test.describe(typeTest); +test.describe(tcpService); + +// <----Event Integration Test----> +test.describe(kafkaIntegration); +test.describe(rabbitmqIntegration); +test.describe(mqttIntegration); +test.describe(azureIntegration); +test.describe(salesforceIntegration); +test.describe(twillioIntegration); +test.describe(githubIntegration); + +// <----File Integration Test----> +test.describe(ftpIntegration); +test.describe(directoryIntegration); + +// <----Other Artifacts Test----> +test.describe(functionArtifact); +test.describe(naturalFunctionArtifact); +test.describe(dataMapperArtifact); // TODO: Fix this test +test.describe(typeDiagramArtifact); // TODO: Fix this test +test.describe(connectionArtifact); +test.describe(configuration); // TODO: Fix this test + +test.describe(configuration); +test.describe(typeTest); test.afterAll(async () => { console.log(`>>> Finished test suite`); From 8e45b9f8e4f578fd98668e53fe7134b006ca460a Mon Sep 17 00:00:00 2001 From: kaumini Date: Wed, 6 Aug 2025 10:41:47 +0530 Subject: [PATCH 297/349] Use joinProjectPath util to get filepath for function viewing --- workspaces/ballerina/bi-diagram/package.json | 3 +-- .../src/components/nodes/BaseNode/BaseNodeWidget.tsx | 11 ++++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/workspaces/ballerina/bi-diagram/package.json b/workspaces/ballerina/bi-diagram/package.json index 6bc40ebfe03..21aa175fae9 100644 --- a/workspaces/ballerina/bi-diagram/package.json +++ b/workspaces/ballerina/bi-diagram/package.json @@ -35,8 +35,7 @@ "@emotion/react": "^11.9.3", "@emotion/styled": "^11.10.5", "dagre": "~0.8.5", - "lodash": "~4.17.21", - "path": "~0.12.7" + "lodash": "~4.17.21" }, "devDependencies": { "@storybook/react": "^6.3.7", diff --git a/workspaces/ballerina/bi-diagram/src/components/nodes/BaseNode/BaseNodeWidget.tsx b/workspaces/ballerina/bi-diagram/src/components/nodes/BaseNode/BaseNodeWidget.tsx index f1f8d7695dc..e9f8c48f4f4 100644 --- a/workspaces/ballerina/bi-diagram/src/components/nodes/BaseNode/BaseNodeWidget.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/nodes/BaseNode/BaseNodeWidget.tsx @@ -36,7 +36,6 @@ import { DiagnosticsPopUp } from "../../DiagnosticsPopUp"; import { getNodeTitle, nodeHasError } from "../../../utils/node"; import { BreakpointMenu } from "../../BreakNodeMenu/BreakNodeMenu"; import { useRpcContext } from "@wso2/ballerina-rpc-client"; -import path from 'path'; export namespace NodeStyles { export type NodeStyleProp = { @@ -242,13 +241,14 @@ export function BaseNodeWidget(props: BaseNodeWidgetProps) { setMenuAnchorEl(null); }; - const openDataMapper = () => { + const openDataMapper = async () => { if (!model.node.properties?.view?.value) { return; } const { fileName, startLine, endLine } = model.node.properties.view.value as ELineRange; + const filePath = await rpcClient.getVisualizerRpcClient().joinProjectPath(fileName); openView && - openView(path.join(projectPath, fileName), { + openView(filePath, { startLine: startLine.line, startColumn: startLine.offset, endLine: endLine.line, @@ -256,13 +256,14 @@ export function BaseNodeWidget(props: BaseNodeWidgetProps) { }); }; - const viewFunction = () => { + const viewFunction = async () => { if (!model.node.properties?.view?.value) { return; } const { fileName, startLine, endLine } = model.node.properties.view.value as ELineRange; + const filePath = await rpcClient.getVisualizerRpcClient().joinProjectPath(fileName); openView && - openView(path.join(projectPath, fileName), { + openView(filePath, { startLine: startLine.line, startColumn: startLine.offset, endLine: endLine.line, From 2c121bdae89dfce95a9cce059d514f4758350ef7 Mon Sep 17 00:00:00 2001 From: sachiniSam Date: Wed, 6 Aug 2025 11:17:17 +0530 Subject: [PATCH 298/349] Expand errorHandler based on active debug point --- .../bi-diagram/src/components/Diagram.tsx | 79 ++++++++++++++++++- 1 file changed, 78 insertions(+), 1 deletion(-) diff --git a/workspaces/ballerina/bi-diagram/src/components/Diagram.tsx b/workspaces/ballerina/bi-diagram/src/components/Diagram.tsx index 897aa296e8d..0f80ac52f87 100644 --- a/workspaces/ballerina/bi-diagram/src/components/Diagram.tsx +++ b/workspaces/ballerina/bi-diagram/src/components/Diagram.tsx @@ -132,7 +132,17 @@ export function Diagram(props: DiagramProps) { const getDiagramData = () => { let flowModel = cloneDeep(model); - const initVisitor = new InitVisitor(flowModel, expandedErrorHandler); + // Check if active breakpoint is within onFailure nodes and update expandedErrorHandler before running visitors + let currentExpandedErrorHandler = expandedErrorHandler; + if (breakpointInfo?.activeBreakpoint) { + const errorHandlerToExpand = getErrorHandlerIdForActiveBreakpoint(flowModel, breakpointInfo); + if (errorHandlerToExpand && expandedErrorHandler !== errorHandlerToExpand) { + currentExpandedErrorHandler = errorHandlerToExpand; + setExpandedErrorHandler(errorHandlerToExpand); + } + } + + const initVisitor = new InitVisitor(flowModel, currentExpandedErrorHandler); traverseFlow(flowModel, initVisitor); const sizingVisitor = new SizingVisitor(); traverseFlow(flowModel, sizingVisitor); @@ -154,6 +164,73 @@ export function Diagram(props: DiagramProps) { return { nodes, links }; }; + // Helper function to find error handlers with active breakpoints in onFailure branches + const getErrorHandlerIdForActiveBreakpoint = (flow: Flow, breakpointInfo: BreakpointInfo): string | undefined => { + if (!breakpointInfo.activeBreakpoint) { + return undefined; + } + + let errorHandlerIdToExpand: string | undefined; + const activeBreakpoint = breakpointInfo.activeBreakpoint; + + const checkNode = (node: FlowNode): void => { + if (node.codedata?.node === "ERROR_HANDLER") { + // Find the onFailure branch + const onFailureBranch = node.branches?.find((branch) => branch.codedata?.node === "ON_FAILURE"); + if (onFailureBranch) { + // Check if any child nodes in the onFailure branch match the active breakpoint + const hasActiveBreakpointInOnFailure = checkForActiveBreakpointInBranch(onFailureBranch, activeBreakpoint); + if (hasActiveBreakpointInOnFailure) { + errorHandlerIdToExpand = node.id; + return; + } + } + } + + // Recursively check child nodes + if (node.branches) { + for (const branch of node.branches) { + if (branch.children) { + for (const child of branch.children) { + checkNode(child); + if (errorHandlerIdToExpand) return; + } + } + } + } + }; + + const checkForActiveBreakpointInBranch = (branch: any, activeBreakpoint: any): boolean => { + if (branch.children) { + for (const child of branch.children) { + // Check if this node matches the active breakpoint + if (child.codedata?.lineRange?.startLine?.line === activeBreakpoint.line) { + return true; + } + // Recursively check nested branches + if (child.branches) { + for (const nestedBranch of child.branches) { + if (checkForActiveBreakpointInBranch(nestedBranch, activeBreakpoint)) { + return true; + } + } + } + } + } + return false; + }; + + // Start checking from the root nodes + if (flow.nodes) { + for (const child of flow.nodes) { + checkNode(child); + if (errorHandlerIdToExpand) break; + } + } + + return errorHandlerIdToExpand; + }; + const drawDiagram = (nodes: NodeModel[], links: NodeLinkModel[]) => { const newDiagramModel = new DiagramModel(); newDiagramModel.addLayer(new OverlayLayerModel()); From 368de5d3adb3446a66d83a8020311e9d2edb5832 Mon Sep 17 00:00:00 2001 From: madushajg Date: Wed, 6 Aug 2025 11:59:06 +0530 Subject: [PATCH 299/349] Enable map with enums --- .../src/interfaces/inline-data-mapper.ts | 1 + .../Diagram/Node/Input/InputNodeFactory.tsx | 7 ++++++- .../Diagram/Node/Input/InputNodeTreeItemWidget.tsx | 8 +++++--- .../components/Diagram/Node/Input/InputNodeWidget.tsx | 11 +++++------ .../src/components/Diagram/utils/type-utils.ts | 10 ++++++++++ 5 files changed, 27 insertions(+), 10 deletions(-) diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/inline-data-mapper.ts b/workspaces/ballerina/ballerina-core/src/interfaces/inline-data-mapper.ts index a8307740802..ff47ad2f7f9 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/inline-data-mapper.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/inline-data-mapper.ts @@ -160,6 +160,7 @@ export interface IOTypeField { export interface EnumMember { id: string; typeName: string; + optional?: boolean; } export interface MappingElement { diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNodeFactory.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNodeFactory.tsx index 0d7fa691443..4b7b308af75 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNodeFactory.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNodeFactory.tsx @@ -38,7 +38,12 @@ export class InputNodeFactory extends AbstractReactFactory ); - } else if (event.model.filteredInputType && event.model.filteredInputType.kind === TypeKind.Record) { + } else if (event.model.filteredInputType && + (event.model.filteredInputType.kind === TypeKind.Record || + event.model.filteredInputType.kind === TypeKind.Array || + event.model.filteredInputType.kind === TypeKind.Enum + ) + ) { return ( {fieldName} {dmType.optional && "?"} - {typeName && ( + {typeName && !isEnumMember(portOut?.getParent() as InputNode) && ( {typeName} diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx index 34a34fcd1c0..89317c824af 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNodeWidget.tsx @@ -61,14 +61,14 @@ export function InputNodeWidget(props: InputNodeWidgetProps) { const portOut = getPort(`${id}.OUT`); - const hasFields = !!dmType?.fields?.length; - let fields: IOType[]; if (dmType.kind === TypeKind.Record) { fields = dmType.fields; } else if (dmType.kind === TypeKind.Array) { fields = [ dmType.member ]; + } else if (dmType.kind === TypeKind.Enum) { + fields = dmType.members; } let expanded = true; @@ -126,7 +126,7 @@ export function InputNodeWidget(props: InputNodeWidgetProps) { onMouseLeave={onMouseLeave} > - {hasFields && ( + {fields && ( + From b9745489de9b1124a9e2b0f777cb5db5ff08585f Mon Sep 17 00:00:00 2001 From: chathurangaj Date: Thu, 7 Aug 2025 13:58:19 +0530 Subject: [PATCH 325/349] Address reviewed comments --- .../mi/mi-visualizer/src/views/UnsupportedProject/index.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/workspaces/mi/mi-visualizer/src/views/UnsupportedProject/index.tsx b/workspaces/mi/mi-visualizer/src/views/UnsupportedProject/index.tsx index b878b4e9146..f4fa5b3719a 100644 --- a/workspaces/mi/mi-visualizer/src/views/UnsupportedProject/index.tsx +++ b/workspaces/mi/mi-visualizer/src/views/UnsupportedProject/index.tsx @@ -234,7 +234,6 @@ export function UnsupportedProject(props: UnsupportedProjectProps) { setIsMigrating(true); try { await rpcClient.getMiDiagramRpcClient().migrateProject({ dir: openedDirectory, sources: foundOldProjects }); - console.log('Migration completed successfully'); } catch (error) { console.error('Migration failed:', error); setIsMigrating(false); From e4eef169077e4a6f04ca08b613fd4f6e877d7d8a Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Thu, 7 Aug 2025 09:30:17 +0530 Subject: [PATCH 326/349] Refactor tool parameter handling in AIAgentSidePanel and remove redundant code --- .../views/BI/AIChatAgent/AIAgentSidePanel.tsx | 88 ++++++++----------- 1 file changed, 35 insertions(+), 53 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx index a06d08f328d..8ffbfe4a067 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx @@ -420,6 +420,39 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { }); }; + const updateToolParameters = (params: any[], baseParams?: ToolParameters): ToolParameters => { + const newToolParameters = baseParams ? cloneDeep(baseParams) : createToolParameters(); + const paramKeys = params.map((param: any) => param.formValues.variable); + + if (newToolParameters.value && typeof newToolParameters.value === "object" && !Array.isArray(newToolParameters.value)) { + // Remove keys that are no longer present + Object.keys(newToolParameters.value).forEach((key) => { + if (!paramKeys.includes(key)) { + delete (newToolParameters.value as ToolParametersValue)[key]; + } + }); + + // Add or update parameters + paramKeys.forEach((key: string) => { + const paramData = params.find((param: any) => param.formValues.variable === key)?.formValues; + const existingParam = (newToolParameters.value as ToolParametersValue)[key]; + + if (existingParam?.value?.variable) { + existingParam.value.variable.value = paramData?.variable || key; + existingParam.value.parameterDescription.value = paramData?.parameterDescription || ""; + existingParam.value.type.value = paramData?.type || ""; + } else { + (newToolParameters.value as ToolParametersValue)[key] = createDefaultParameterValue({ + value: paramData?.variable || key, + parameterDescription: paramData?.parameterDescription, + type: paramData?.type, + }); + } + }); + } + return newToolParameters; + }; + const handleToolSubmit = (data: FormValues) => { // Safely convert name to camelCase, handling any input const name = data["name"] || ""; @@ -441,7 +474,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { if (toolNodeId === FUNCTION_CALL && Array.isArray(data["parameters"])) { clonedFunctionNode = functionNode.current ? cloneDeep(functionNode.current) : null; - toolParameters = cloneDeep(functionNode.current?.properties?.parameters) as unknown as ToolParameters; + toolParameters = updateToolParameters(data["parameters"], functionNode.current?.properties?.parameters as unknown as ToolParameters | undefined); // Update clonedFunctionNode parameter values from data["parameters"] const parametersValue = clonedFunctionNode?.properties?.parameters?.value; @@ -453,33 +486,9 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { } }); } - - // Update toolParameters: remove keys not present, and set values from data - const paramKeys = data["parameters"].map((param: any) => param.key); - if (toolParameters && typeof toolParameters.value === "object" && !Array.isArray(toolParameters.value)) { - Object.keys(toolParameters.value).forEach((key) => { - if (!paramKeys.includes(key)) { - delete toolParameters.value[key]; - } - }); - paramKeys.forEach((key: string) => { - const paramObj = toolParameters.value[key]; - if (paramObj && paramObj.value && paramObj.value.variable) { - paramObj.value.variable.value = data["parameters"].find((param: any) => param.key === key)?.formValues.variable || key; - paramObj.value.parameterDescription.value = data["parameters"].find((param: any) => param.key === key)?.formValues.parameterDescription || ""; - paramObj.value.type.value = data["parameters"].find((param: any) => param.key === key)?.formValues.type || ""; - } - if (!toolParameters.value[key]) { - toolParameters.value[key] = createDefaultParameterValue({ - value: data["parameters"].find((param: any) => param.key === key)?.formValues.variable || key, - parameterDescription: data["parameters"].find((param: any) => param.key === key)?.formValues.parameterDescription, - type: data["parameters"].find((param: any) => param.key === key)?.formValues.type - }); - } - }); - } } else if ((toolNodeId === REMOTE_ACTION_CALL || toolNodeId === RESOURCE_ACTION_CALL || toolNodeId === METHOD_CALL) && Array.isArray(data["parameters"])) { clonedFlowNode = flowNode.current ? cloneDeep(flowNode.current) : null; + toolParameters = updateToolParameters(data["parameters"]); // Update flowNode parameter values from data["parameters"] if (clonedFlowNode?.properties && typeof clonedFlowNode?.properties === "object" && !Array.isArray(clonedFlowNode?.properties)) { @@ -495,33 +504,6 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { }); clonedFlowNode.properties = newProperties; } - - // Update toolParameters: remove keys not present, and set values from data - toolParameters = createToolParameters(); - const paramKeys = data["parameters"].map((param: any) => param.key); - console.log(">>> toolParameters before update", { toolParameters, paramKeys }); - if (toolParameters && typeof toolParameters.value === "object" && !Array.isArray(toolParameters.value)) { - Object.keys(toolParameters.value).forEach((key) => { - if (!paramKeys.includes(key)) { - delete toolParameters.value[key]; - } - }); - paramKeys.forEach((key: string) => { - const paramObj = toolParameters.value[key]; - if (paramObj && paramObj.value && paramObj.value.variable) { - paramObj.value.variable.value = data["parameters"].find((param: any) => param.key === key)?.formValues.variable || key; - paramObj.value.parameterDescription.value = data["parameters"].find((param: any) => param.key === key)?.formValues.parameterDescription || ""; - paramObj.value.type.value = data["parameters"].find((param: any) => param.key === key)?.formValues.type || ""; - } - if (!toolParameters.value[key]) { - toolParameters.value[key] = createDefaultParameterValue({ - value: data["parameters"].find((param: any) => param.key === key)?.formValues.variable || key, - parameterDescription: data["parameters"].find((param: any) => param.key === key)?.formValues.parameterDescription, - type: data["parameters"].find((param: any) => param.key === key)?.formValues.type - }); - } - }); - } } console.log(">>> toolParameters", { toolParameters }); From aa6b9eeb0e11bc84d67ab579ecb5e6f5fb8e7699 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Thu, 7 Aug 2025 09:43:39 +0530 Subject: [PATCH 327/349] Update resourcePath handling for RESOURCE_ACTION_CALL nodes in AIAgentSidePanel --- .../src/views/BI/AIChatAgent/AIAgentSidePanel.tsx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx index 8ffbfe4a067..386ff394475 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx @@ -37,6 +37,7 @@ import { ToolParameters, ToolParametersValue, DIRECTORY_MAP, + Property, } from "@wso2/ballerina-core"; import { @@ -501,6 +502,19 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { value: paramValue }; } + // Update resourcePath for RESOURCE_ACTION_CALL nodes + if (toolNodeId === RESOURCE_ACTION_CALL) { + const resourcePathProperty = (newProperties as any)["resourcePath"] as Property; + const path = resourcePathProperty?.value; + const updatedPath = typeof path === "string" ? path.replace(key, paramValue) : path; + (newProperties as any)["resourcePath"] = { + ...resourcePathProperty, + codedata: { + originalName: updatedPath + }, + value: updatedPath + }; + } }); clonedFlowNode.properties = newProperties; } From 8d8bd27b3f1d70a2383d45ca65b2a091b889dc44 Mon Sep 17 00:00:00 2001 From: Dan Niles Date: Thu, 7 Aug 2025 14:06:04 +0530 Subject: [PATCH 328/349] Remove use of any type in AIAgentSidePanel when creating tools --- .../src/rpc-types/ai-agent/interfaces.ts | 10 ++++ .../views/BI/AIChatAgent/AIAgentSidePanel.tsx | 47 +++++++++++-------- 2 files changed, 37 insertions(+), 20 deletions(-) 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 90b3380c1de..e2194c847a1 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 @@ -40,6 +40,16 @@ export interface AgentTool { connectionName: string; } +export interface ToolParameterFormValues { + variable: string; + type: string; + parameterDescription: string; +} + +export interface ToolParameterItem { + formValues: ToolParameterFormValues; +} + export interface AgentToolRequest { toolName: string; description: string; diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx index 386ff394475..1003b8db813 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/AIChatAgent/AIAgentSidePanel.tsx @@ -38,6 +38,8 @@ import { ToolParametersValue, DIRECTORY_MAP, Property, + ToolParameterItem, + NodeProperties, } from "@wso2/ballerina-core"; import { @@ -211,7 +213,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { console.log("convertedCategories", convertedCategories); let filteredCategories = []; - + // Filter categories based on mode if (mode === NewToolSelectionMode.CONNECTION) { filteredCategories = convertedCategories; @@ -222,7 +224,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { const filteredFunctions = await handleSearchFunction("", FUNCTION_TYPE.REGULAR, false); filteredCategories = convertedCategories.concat(filteredFunctions); } - + setCategories(filteredCategories); initialCategoriesRef.current = filteredCategories; // Store initial categories setLoading(false); @@ -421,9 +423,9 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { }); }; - const updateToolParameters = (params: any[], baseParams?: ToolParameters): ToolParameters => { + const updateToolParameters = (params: ToolParameterItem[], baseParams?: ToolParameters): ToolParameters => { const newToolParameters = baseParams ? cloneDeep(baseParams) : createToolParameters(); - const paramKeys = params.map((param: any) => param.formValues.variable); + const paramKeys = params.map((param: ToolParameterItem) => param.formValues.variable); if (newToolParameters.value && typeof newToolParameters.value === "object" && !Array.isArray(newToolParameters.value)) { // Remove keys that are no longer present @@ -435,7 +437,7 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { // Add or update parameters paramKeys.forEach((key: string) => { - const paramData = params.find((param: any) => param.formValues.variable === key)?.formValues; + const paramData = params.find((param: ToolParameterItem) => param.formValues.variable === key)?.formValues; const existingParam = (newToolParameters.value as ToolParametersValue)[key]; if (existingParam?.value?.variable) { @@ -493,30 +495,35 @@ export function AIAgentSidePanel(props: BIFlowDiagramProps) { // Update flowNode parameter values from data["parameters"] if (clonedFlowNode?.properties && typeof clonedFlowNode?.properties === "object" && !Array.isArray(clonedFlowNode?.properties)) { - const newProperties = { ...clonedFlowNode.properties }; + const newProperties = { ...clonedFlowNode.properties } as Record; Object.keys(newProperties).forEach((key) => { const paramValue = data[key]; - if (paramValue !== undefined) { - (newProperties as ToolParametersValue)[key] = { - ...((newProperties as ToolParametersValue)[key]!), + if (paramValue !== undefined && newProperties[key]) { + newProperties[key] = { + ...newProperties[key], value: paramValue }; } // Update resourcePath for RESOURCE_ACTION_CALL nodes if (toolNodeId === RESOURCE_ACTION_CALL) { - const resourcePathProperty = (newProperties as any)["resourcePath"] as Property; - const path = resourcePathProperty?.value; - const updatedPath = typeof path === "string" ? path.replace(key, paramValue) : path; - (newProperties as any)["resourcePath"] = { - ...resourcePathProperty, - codedata: { - originalName: updatedPath - }, - value: updatedPath - }; + const resourcePathProperty = newProperties["resourcePath"]; + if (resourcePathProperty) { + const path = resourcePathProperty.value; + const updatedPath = typeof path === "string" ? path.replace(key, paramValue) : path; + newProperties["resourcePath"] = { + ...resourcePathProperty, + codedata: resourcePathProperty.codedata ? { + ...resourcePathProperty.codedata, + originalName: typeof updatedPath === "string" ? updatedPath : String(updatedPath) + } : { + originalName: typeof updatedPath === "string" ? updatedPath : String(updatedPath) + }, + value: updatedPath + }; + } } }); - clonedFlowNode.properties = newProperties; + clonedFlowNode.properties = newProperties as NodeProperties; } } From cb4aed72c58f2feeab70a0746736eb37e9cbef30 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Thu, 7 Aug 2025 15:45:00 +0530 Subject: [PATCH 329/349] Add change log for 1.2.1 --- workspaces/bi/bi-extension/CHANGELOG.md | 36 +++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/workspaces/bi/bi-extension/CHANGELOG.md b/workspaces/bi/bi-extension/CHANGELOG.md index 13ebd3ff85c..e791d1b3f77 100644 --- a/workspaces/bi/bi-extension/CHANGELOG.md +++ b/workspaces/bi/bi-extension/CHANGELOG.md @@ -1,5 +1,41 @@ # Change log +## Version 1.2.1 (2025-08-07) + +### Fixed + +- Resolved issues affecting Inline Data Mapper functionality and flow diagram rendering + +## Version 1.2.0 (2025-07-29) + +### Major Updates + +- **Enhanced Inline Data Mapper:** Redesigned for improved user experience with AI-driven mapping suggestions and a sub-mapping form. +- **AI Copilot & RAG Workflows:** Upgraded AI Copilot now uses ballerina/ai packages, with low-code support added for advanced RAG workflows. + +### Added + +- **AI Capabilities:** + - Support for Anthropic's Claude Sonnet v4 for code generation. + - Added Vector Knowledge Base node for RAG workflows. + - Configuration options for default AI model providers in the Flow Diagram. +- **Editor & IDE Features:** + - New VSCode setting to manage the visibility of the Sequence Diagram. + - Option to include the current organization in search results. + +### Changes + +- **Data Mapper:** Improved search, label positioning, and performance. Now refreshes automatically when code changes. +- **AI & Copilot:** Streamlined flows for user-friendliness and enhanced agent capabilities with new packages. +- **UI/UX:** Refined diagram rendering and title components for a more responsive interface. + +### Fixed + +- **Data Mapper:** Corrected rendering issues and various bugs in mapping generation and type resolution. +- **AI & Copilot:** Resolved re-rendering bugs and authentication flow issues. +- **Configuration:** Fixed issues with Config.toml management and fast-run command failures. +- **IDE Stability:** Addressed UI freezing, improved state management, and enhanced project handling in multi-root workspaces. + ## **1.1.0** (2025-07-14) ### Major Features From 9c2a9fae3e6c1d9de267157c5ae1c458a0ea64cf Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Thu, 7 Aug 2025 15:49:29 +0530 Subject: [PATCH 330/349] Add change log for ballerina 5.3.1 --- .../ballerina-extension/CHANGELOG.md | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/workspaces/ballerina/ballerina-extension/CHANGELOG.md b/workspaces/ballerina/ballerina-extension/CHANGELOG.md index d77992aac0d..b44fc57fe74 100644 --- a/workspaces/ballerina/ballerina-extension/CHANGELOG.md +++ b/workspaces/ballerina/ballerina-extension/CHANGELOG.md @@ -2,6 +2,44 @@ All notable changes to the "Ballerina" extension will be documented in this file. + +## Version 5.3.1 (2025-08-07) + +### Fixed + +- Resolved issues affecting Inline Data Mapper functionality and flow diagram rendering + +## Version 5.3.0 (2025-07-29) + +### Major Updates + +- **Enhanced Inline Data Mapper:** Redesigned for improved user experience with AI-driven mapping suggestions and a sub-mapping form. +- **AI Copilot & RAG Workflows:** Upgraded AI Copilot now uses ballerina/ai packages, with low-code support added for advanced RAG workflows. + +### Added + +- **AI Capabilities:** + - Support for Anthropic's Claude Sonnet v4 for code generation. + - Added Vector Knowledge Base node for RAG workflows. + - Configuration options for default AI model providers in the Flow Diagram. +- **Editor & IDE Features:** + - New VSCode setting to manage the visibility of the Sequence Diagram. + - Option to include the current organization in search results. + +### Changes + +- **Data Mapper:** Improved search, label positioning, and performance. Now refreshes automatically when code changes. +- **AI & Copilot:** Streamlined flows for user-friendliness and enhanced agent capabilities with new packages. +- **UI/UX:** Refined diagram rendering and title components for a more responsive interface. + +### Fixed + +- **Data Mapper:** Corrected rendering issues and various bugs in mapping generation and type resolution. +- **AI & Copilot:** Resolved re-rendering bugs and authentication flow issues. +- **Configuration:** Fixed issues with Config.toml management and fast-run command failures. +- **IDE Stability:** Addressed UI freezing, improved state management, and enhanced project handling in multi-root workspaces. + + ## **5.2.0** (2025-07-14) ### Major Features From b3c7cbdcf68370c8d51af2734d6b8a238c02f0c7 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Thu, 7 Aug 2025 15:57:40 +0530 Subject: [PATCH 331/349] Update extension versions --- workspaces/ballerina/ballerina-extension/package.json | 2 +- workspaces/bi/bi-extension/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 4ecc402f242..00edb5b611b 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.2.1", + "version": "5.3.0", "publisher": "wso2", "icon": "resources/images/ballerina.png", "homepage": "https://wso2.com/ballerina/vscode/docs", diff --git a/workspaces/bi/bi-extension/package.json b/workspaces/bi/bi-extension/package.json index 5dea0196d3e..2bc7c6a6888 100644 --- a/workspaces/bi/bi-extension/package.json +++ b/workspaces/bi/bi-extension/package.json @@ -2,7 +2,7 @@ "name": "ballerina-integrator", "displayName": "WSO2 Integrator: BI", "description": "An extension which gives a development environment for designing, developing, debugging, and testing integration solutions.", - "version": "1.1.1", + "version": "1.2.0", "publisher": "wso2", "icon": "resources/images/wso2-ballerina-integrator-logo.png", "repository": { From 1c20f9d2a455ad9410b4611df5ce38b3ddf2f48f Mon Sep 17 00:00:00 2001 From: madushajg Date: Thu, 7 Aug 2025 16:13:41 +0530 Subject: [PATCH 332/349] Improve error banner styles --- .../src/components/DataMapper/DataMapper.tsx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/workspaces/ballerina/data-mapper-view/src/components/DataMapper/DataMapper.tsx b/workspaces/ballerina/data-mapper-view/src/components/DataMapper/DataMapper.tsx index 77be41ec5c9..7a9eb366d79 100644 --- a/workspaces/ballerina/data-mapper-view/src/components/DataMapper/DataMapper.tsx +++ b/workspaces/ballerina/data-mapper-view/src/components/DataMapper/DataMapper.tsx @@ -100,6 +100,18 @@ const classes = { position: 'absolute', left: '50%', transform: 'translateX(-50%)' + }), + errorBanner: css({ + borderColor: "var(--vscode-errorForeground)" + }), + errorMessage: css({ + zIndex: 1, + position: 'absolute', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + width: '500px', + animation: `${fadeIn} 0.5s ease-in-out` }) } From 04230d27c05055ffd811a9bc972423b2de14729f Mon Sep 17 00:00:00 2001 From: ChamodA Date: Thu, 7 Aug 2025 16:15:58 +0530 Subject: [PATCH 333/349] Enhance port name generation logic in PrimitiveOutputElementWidget --- .../Node/PrimitiveOutput/PrimitiveOutputElementWidget.tsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputElementWidget.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputElementWidget.tsx index 43040ac5e18..c56883bda78 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputElementWidget.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputElementWidget.tsx @@ -71,10 +71,13 @@ export function PrimitiveOutputElementWidget(props: PrimitiveOutputElementWidget const [portState, setPortState] = useState(PortState.Unselected); const fieldName = field?.id || ''; + const view = context.views[context.views.length - 1]; let portName = getSanitizedId(parentId); if (fieldIndex !== undefined) { portName = `${portName}.${fieldIndex}`; + } else if (fieldName && view.subMappingInfo) { + portName = `${portName}.${fieldName}`; } const portIn = getPort(`${portName}.IN`); @@ -82,8 +85,8 @@ export function PrimitiveOutputElementWidget(props: PrimitiveOutputElementWidget const mapping = portIn && portIn.attributes.value; let { expression, diagnostics } = mapping || {}; - if (portIn?.getParent() instanceof PrimitiveOutputNode) { - expression = context.model.query?.resultClause.properties.expression; + if (portIn?.getParent() instanceof PrimitiveOutputNode && context.model.query) { + expression = context.model.query.resultClause.properties.expression; } const handleEditValue = () => { From f9e8232122159c7d60bf772e323903abbd64e7b7 Mon Sep 17 00:00:00 2001 From: gigara Date: Thu, 7 Aug 2025 19:05:39 +0530 Subject: [PATCH 334/349] Update tmp lib version to 0.2.4 --- common/config/rush/pnpm-lock.yaml | 18 +- pnpm-lock.yaml | 50698 ---------------------- workspaces/mi/mi-extension/package.json | 2 +- 3 files changed, 10 insertions(+), 50708 deletions(-) delete mode 100644 pnpm-lock.yaml diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 8e15715f93f..2dff47c4f18 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -3504,8 +3504,8 @@ importers: specifier: ^0.23.11 version: 0.23.11 tmp: - specifier: ~0.2.3 - version: 0.2.3 + specifier: ~0.2.4 + version: 0.2.4 to-json-schema: specifier: 0.2.5 version: 0.2.5 @@ -20240,8 +20240,8 @@ packages: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} - tmp@0.2.3: - resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + tmp@0.2.4: + resolution: {integrity: sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ==} engines: {node: '>=14.14'} tmpl@1.0.5: @@ -33680,7 +33680,7 @@ snapshots: parse-semver: 1.1.1 read: 1.0.7 semver: 7.7.2 - tmp: 0.2.3 + tmp: 0.2.4 typed-rest-client: 1.8.11 url-join: 4.0.1 xml2js: 0.5.0 @@ -33716,7 +33716,7 @@ snapshots: read: 1.0.7 secretlint: 9.3.4 semver: 7.7.2 - tmp: 0.2.3 + tmp: 0.2.4 typed-rest-client: 1.8.11 url-join: 4.0.1 xml2js: 0.5.0 @@ -46226,7 +46226,7 @@ snapshots: dependencies: '@bazel/runfiles': 6.3.1 jszip: 3.10.1 - tmp: 0.2.3 + tmp: 0.2.4 ws: 8.18.3 transitivePeerDependencies: - bufferutil @@ -47657,7 +47657,7 @@ snapshots: dependencies: os-tmpdir: 1.0.2 - tmp@0.2.3: {} + tmp@0.2.4: {} tmpl@1.0.5: {} @@ -48753,7 +48753,7 @@ snapshots: parse-semver: 1.1.1 read: 1.0.7 semver: 5.7.2 - tmp: 0.2.3 + tmp: 0.2.4 typed-rest-client: 1.8.11 url-join: 4.0.1 xml2js: 0.4.23 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 5d46a147143..00000000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,50698 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -overrides: - 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 - micromatch: ^4.0.8 - esbuild: ^0.25.0 - xmldom: npm:@xmldom/xmldom@^0.8.10 - '@eslint/plugin-kit': ^0.3.4 - on-headers: ^1.1.0 - form-data: ^4.0.4 - -importers: - - .: {} - - workspaces/ballerina/ballerina-core: - dependencies: - '@types/mousetrap': - specifier: ~1.6.11 - version: 1.6.15 - '@types/vscode-webview': - specifier: ^1.57.3 - version: 1.57.5 - '@types/ws': - specifier: ^8.2.1 - version: 8.18.1 - '@wso2/syntax-tree': - specifier: workspace:* - version: link:../syntax-tree - handlebars: - specifier: ~4.7.8 - version: 4.7.8 - isomorphic-ws: - specifier: ^5.0.0 - version: 5.0.0(ws@8.18.3) - mousetrap: - specifier: ^1.6.5 - version: 1.6.5 - react: - specifier: 18.2.0 - version: 18.2.0 - tree-kill: - specifier: ^1.2.2 - version: 1.2.2 - vscode-jsonrpc: - specifier: ^8.2.1 - version: 8.2.1 - vscode-languageserver-protocol: - specifier: ^3.17.5 - version: 3.17.5 - vscode-languageserver-types: - specifier: ^3.17.5 - version: 3.17.5 - vscode-messenger-common: - specifier: ^0.5.1 - version: 0.5.1 - vscode-uri: - specifier: ^3.0.8 - version: 3.1.0 - vscode-ws-jsonrpc: - specifier: ^3.4.0 - version: 3.4.0 - devDependencies: - '@types/node': - specifier: ^22.15.21 - version: 22.15.32 - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/vscode': - specifier: ^1.83.1 - version: 1.101.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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.4.2) - typescript: - specifier: 5.8.3 - version: 5.8.3 - - workspaces/ballerina/ballerina-extension: - dependencies: - '@types/lodash': - specifier: ^4.14.200 - version: 4.17.17 - '@vscode/test-electron': - specifier: ^2.4.0 - version: 2.5.2 - '@vscode/vsce': - specifier: ^2.22.0 - version: 2.32.0 - '@wso2/ballerina-core': - specifier: workspace:* - version: link:../ballerina-core - '@wso2/ballerina-visualizer': - specifier: workspace:* - version: link:../ballerina-visualizer - '@wso2/font-wso2-vscode': - specifier: workspace:* - version: link:../../common-libs/font-wso2-vscode - '@wso2/syntax-tree': - specifier: workspace:* - version: link:../syntax-tree - '@wso2/wso2-platform-core': - specifier: workspace:* - version: link:../../wso2-platform/wso2-platform-core - cors-anywhere: - specifier: ^0.4.4 - version: 0.4.4 - del-cli: - specifier: ^5.1.0 - version: 5.1.0 - dotenv: - specifier: ~16.5.0 - version: 16.5.0 - file-uri-to-path: - specifier: ^2.0.0 - version: 2.0.0 - glob: - specifier: ^7.2.3 - version: 7.2.3 - handlebars: - specifier: ~4.7.8 - version: 4.7.8 - jwt-decode: - specifier: ^4.0.0 - version: 4.0.0 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - monaco-languageclient: - specifier: 0.13.1-next.9 - version: 0.13.1-next.9 - node-fetch: - specifier: ^3.3.2 - version: 3.3.2 - node-schedule: - specifier: ^2.1.1 - version: 2.1.1 - portfinder: - specifier: ^1.0.32 - version: 1.0.37 - source-map-support: - specifier: ^0.5.21 - version: 0.5.21 - toml: - specifier: ^3.0.0 - version: 3.0.0 - uuid: - specifier: ^11.1.0 - version: 11.1.0 - vscode-debugadapter: - specifier: ^1.51.0 - version: 1.51.0 - vscode-debugprotocol: - specifier: ^1.51.0 - version: 1.51.0 - vscode-extension-telemetry: - specifier: ^0.1.7 - version: 0.1.7 - vscode-languageclient: - specifier: ^8.1.0 - version: 8.1.0 - vscode-languageserver-protocol: - specifier: ^3.17.5 - version: 3.17.5 - vscode-languageserver-types: - specifier: ^3.17.5 - version: 3.17.5 - vscode-messenger: - specifier: ^0.4.5 - version: 0.4.5 - vscode-messenger-common: - specifier: ^0.4.5 - version: 0.4.5 - vscode-test: - specifier: ^1.6.1 - version: 1.6.1 - vscode-uri: - specifier: ^3.0.8 - version: 3.1.0 - xml-js: - specifier: ^1.6.11 - version: 1.6.11 - xstate: - specifier: ^4.38.3 - version: 4.38.3 - devDependencies: - '@sentry/webpack-plugin': - specifier: ^1.20.1 - version: 1.21.0(encoding@0.1.13) - '@types/chai': - specifier: ^4.3.9 - version: 4.3.20 - '@types/mocha': - specifier: ~10.0.3 - version: 10.0.10 - '@types/node': - specifier: ^18.18.7 - version: 18.19.112 - '@types/tcp-port-used': - specifier: ^1.0.3 - version: 1.0.4 - '@types/vscode': - specifier: ^1.83.1 - version: 1.101.0 - '@types/vscode-notebook-renderer': - specifier: ~1.72.2 - version: 1.72.3 - adm-zip: - specifier: ^0.5.16 - version: 0.5.16 - axios: - specifier: ^1.6.0 - version: 1.9.0 - chai: - specifier: ^4.3.10 - version: 4.5.0 - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - cross-env: - specifier: ^7.0.3 - version: 7.0.3 - decache: - specifier: ^4.6.2 - version: 4.6.2 - express: - specifier: ^4.18.2 - version: 4.21.2 - istanbul: - specifier: ^0.4.5 - version: 0.4.5 - js-yaml: - specifier: ^4.1.0 - version: 4.1.0 - keytar: - specifier: ^7.9.0 - version: 7.9.0 - kill-port: - specifier: 2.0.1 - version: 2.0.1 - mocha: - specifier: ^10.2.0 - version: 10.8.2 - pako: - specifier: ^2.1.0 - version: 2.1.0 - pkce-challenge: - specifier: ^3.1.0 - version: 3.1.0 - remap-istanbul: - specifier: ^0.13.0 - version: 0.13.0 - rimraf: - specifier: ^3.0.2 - version: 3.0.2 - tcp-port-used: - specifier: ^1.0.2 - version: 1.0.2 - ts-loader: - specifier: ^9.5.0 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) - tslint: - specifier: ^6.1.3 - version: 6.1.3(typescript@5.8.3) - typescript: - specifier: 5.8.3 - version: 5.8.3 - vscode-debugadapter-testsupport: - specifier: ^1.51.0 - version: 1.51.0 - vscode-extension-tester: - specifier: ^5.10.0 - version: 5.10.0(mocha@10.8.2)(typescript@5.8.3) - webpack: - specifier: ^5.94.0 - version: 5.100.2(webpack-cli@5.1.4) - webpack-cli: - specifier: ^5.1.4 - version: 5.1.4(webpack@5.100.2) - webpack-merge-and-include-globally: - specifier: ^2.3.4 - version: 2.3.4(webpack@5.100.2) - yarn: - specifier: ^1.22.19 - version: 1.22.22 - - workspaces/ballerina/ballerina-low-code-diagram: - dependencies: - '@date-io/date-fns': - specifier: ^3.2.1 - version: 3.2.1(date-fns@4.1.0) - '@wso2/ballerina-core': - specifier: workspace:* - version: link:../ballerina-core - '@wso2/syntax-tree': - specifier: workspace:* - version: link:../syntax-tree - classnames: - specifier: ^2.5.1 - version: 2.5.1 - clipboard-copy: - specifier: ^4.0.1 - version: 4.0.1 - clsx: - specifier: ^2.1.1 - version: 2.1.1 - cron-validator: - specifier: 1.3.1 - version: 1.3.1 - date-fns: - specifier: ^4.1.0 - version: 4.1.0 - date-fns-tz: - specifier: ^3.2.0 - version: 3.2.0(date-fns@4.1.0) - dexie: - specifier: ^4.0.11 - version: 4.0.11 - graphql: - specifier: ^16.11.0 - version: 16.11.0 - handlebars: - specifier: ^4.7.8 - version: 4.7.8 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@22.15.32)(babel-plugin-macros@3.1.0) - joi: - specifier: ^17.13.3 - version: 17.13.3 - lodash.camelcase: - specifier: ^4.3.0 - version: 4.3.0 - lodash.clonedeep: - specifier: ^4.5.0 - version: 4.5.0 - lodash.debounce: - specifier: ^4.0.8 - version: 4.0.8 - monaco-editor: - specifier: 0.52.2 - version: 0.52.2 - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - react-intl: - specifier: ^7.1.11 - version: 7.1.11(react@18.2.0)(typescript@5.8.3) - react-lottie: - specifier: ^1.2.10 - version: 1.2.10(react@18.2.0) - react-zoom-pan-pinch: - specifier: ^3.7.0 - version: 3.7.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - uuid: - specifier: ^11.1.0 - version: 11.1.0 - vscode-languageserver-protocol: - specifier: ^3.17.5 - version: 3.17.5 - devDependencies: - '@babel/core': - specifier: ^7.27.1 - version: 7.27.4 - '@babel/preset-env': - specifier: ^7.27.2 - version: 7.27.2(@babel/core@7.27.4) - '@rollup/plugin-commonjs': - specifier: ^28.0.3 - version: 28.0.6(rollup@4.44.0) - '@rollup/plugin-json': - specifier: ^6.1.0 - version: 6.1.0(rollup@4.44.0) - '@rollup/plugin-node-resolve': - specifier: ^16.0.1 - version: 16.0.1(rollup@4.44.0) - '@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.4)(@storybook/builder-webpack5@6.5.16(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.100.2) - '@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(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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.4)(@storybook/builder-webpack5@6.5.16(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@types/webpack@5.28.5(esbuild@0.25.5)(webpack-cli@6.0.1))(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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) - '@types/classnames': - specifier: ^2.2.9 - version: 2.3.4 - '@types/handlebars': - specifier: ^4.1.0 - version: 4.1.0 - '@types/lodash.camelcase': - specifier: ^4.3.0 - version: 4.3.9 - '@types/lodash.clonedeep': - specifier: ^4.5.6 - version: 4.5.9 - '@types/lodash.debounce': - specifier: ^4.0.6 - version: 4.0.9 - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-lottie': - specifier: ^1.2.10 - version: 1.2.10 - '@types/uuid': - specifier: ^10.0.0 - version: 10.0.0 - '@types/webpack': - specifier: ^5.28.5 - version: 5.28.5(esbuild@0.25.5)(webpack-cli@6.0.1) - babel-loader: - specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.4)(webpack@5.100.2) - copy-webpack-plugin: - specifier: ^13.0.0 - version: 13.0.0(webpack@5.100.2) - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - css-loader: - specifier: ^7.1.2 - version: 7.1.2(webpack@5.100.2) - express: - specifier: ^5.1.0 - version: 5.1.0 - file-loader: - specifier: ^6.2.0 - version: 6.2.0(webpack@5.100.2) - fork-ts-checker-webpack-plugin: - specifier: ^9.1.0 - version: 9.1.0(typescript@5.8.3)(webpack@5.100.2) - glob: - specifier: ^11.0.2 - version: 11.0.3 - react-scripts-ts: - specifier: ^3.1.0 - version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.27.4))(babel-runtime@6.26.0)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)(webpack-cli@6.0.1) - react-test-renderer: - specifier: ^19.1.0 - version: 19.1.0(react@18.2.0) - rimraf: - specifier: ^6.0.1 - version: 6.0.1 - rollup: - specifier: ^4.41.0 - version: 4.44.0 - rollup-plugin-import-css: - specifier: ^3.5.8 - version: 3.5.8(rollup@4.44.0) - rollup-plugin-peer-deps-external: - specifier: ^2.2.4 - version: 2.2.4(rollup@4.44.0) - rollup-plugin-postcss: - specifier: ^4.0.2 - version: 4.0.2(postcss@8.5.6) - rollup-plugin-scss: - specifier: ^4.0.1 - version: 4.0.1 - rollup-plugin-svg: - specifier: ^2.0.0 - version: 2.0.0 - rollup-plugin-typescript2: - specifier: ^0.36.0 - version: 0.36.0(rollup@4.44.0)(typescript@5.8.3) - sass: - specifier: ^1.89.0 - version: 1.89.2 - sass-loader: - specifier: ^16.0.5 - version: 16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.100.2) - storybook: - specifier: ^8.6.14 - version: 8.6.14(prettier@3.6.2) - style-loader: - specifier: ^4.0.0 - version: 4.0.0(webpack@5.100.2) - stylelint: - specifier: ^16.19.1 - version: 16.21.0(typescript@5.8.3) - stylelint-config-standard: - specifier: ^38.0.0 - version: 38.0.0(stylelint@16.21.0(typescript@5.8.3)) - svg-url-loader: - specifier: ^8.0.0 - version: 8.0.0(webpack@5.100.2) - ts-loader: - specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) - tslib: - specifier: ^2.8.1 - version: 2.8.1 - tslint: - specifier: ^6.1.3 - version: 6.1.3(typescript@5.8.3) - tslint-react: - specifier: ^5.0.0 - version: 5.0.0(tslint@6.1.3(typescript@5.8.3))(typescript@5.8.3) - tslint-react-hooks: - specifier: ^2.2.2 - version: 2.2.2(tslint@6.1.3(typescript@5.8.3))(typescript@5.8.3) - typescript: - specifier: 5.8.3 - version: 5.8.3 - webpack: - specifier: ^5.94.0 - version: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - webpack-cli: - specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2) - webpack-dev-server: - specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) - - workspaces/ballerina/ballerina-rpc-client: - dependencies: - '@types/vscode-webview': - specifier: ^1.57.3 - version: 1.57.5 - '@wso2/ballerina-core': - specifier: workspace:* - version: link:../ballerina-core - '@wso2/syntax-tree': - specifier: workspace:* - version: link:../syntax-tree - monaco-editor: - specifier: 0.44.0 - version: 0.44.0 - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - vscode-languageserver-types: - specifier: ^3.17.5 - version: 3.17.5 - vscode-messenger-common: - specifier: ^0.4.5 - version: 0.4.5 - vscode-messenger-webview: - specifier: ^0.5.1 - version: 0.5.1 - devDependencies: - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - 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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - eslint: - specifier: ^9.27.0 - version: 9.27.0(jiti@2.4.2) - eslint-plugin-react-hooks: - specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.4.2)) - eslint-plugin-react-refresh: - specifier: ^0.4.20 - version: 0.4.20(eslint@9.27.0(jiti@2.4.2)) - typescript: - specifier: 5.8.3 - version: 5.8.3 - - workspaces/ballerina/ballerina-side-panel: - dependencies: - '@emotion/react': - specifier: ^11.14.0 - version: 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': - specifier: ^11.14.0 - version: 11.14.0(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) - '@wso2/ballerina-core': - specifier: workspace:* - version: link:../ballerina-core - '@wso2/ballerina-rpc-client': - specifier: workspace:* - version: link:../ballerina-rpc-client - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../../common-libs/ui-toolkit - lodash: - specifier: ~4.17.21 - version: 4.17.21 - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - 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: - '@storybook/react': - specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.100.2))(webpack-hot-middleware@2.26.1) - '@types/lodash': - specifier: ~4.17.16 - version: 4.17.17 - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - specifier: 18.2.0 - version: 18.2.0 - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - typescript: - specifier: 5.8.3 - version: 5.8.3 - - workspaces/ballerina/ballerina-visualizer: - dependencies: - '@emotion/css': - specifier: ^11.13.5 - version: 11.13.5 - '@emotion/react': - specifier: ^11.14.0 - version: 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': - specifier: ^11.14.0 - version: 11.14.0(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) - '@headlessui/react': - specifier: ~2.2.4 - version: 2.2.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@hookform/resolvers': - specifier: ~5.0.1 - version: 5.0.1(react-hook-form@7.56.4(react@18.2.0)) - '@tanstack/query-core': - specifier: ^5.77.1 - version: 5.81.2 - '@tanstack/react-query': - specifier: 5.77.1 - version: 5.77.1(react@18.2.0) - '@types/lodash': - specifier: ~4.17.16 - version: 4.17.17 - '@vscode/webview-ui-toolkit': - specifier: ^1.4.0 - version: 1.4.0(react@18.2.0) - '@wso2/ballerina-core': - specifier: workspace:* - version: link:../ballerina-core - '@wso2/ballerina-graphql-design-diagram': - specifier: workspace:* - version: link:../graphql-design-diagram - '@wso2/ballerina-inline-data-mapper': - specifier: workspace:* - version: link:../inline-data-mapper - '@wso2/ballerina-low-code-diagram': - specifier: workspace:* - version: link:../ballerina-low-code-diagram - '@wso2/ballerina-rpc-client': - specifier: workspace:* - version: link:../ballerina-rpc-client - '@wso2/ballerina-side-panel': - specifier: workspace:* - version: link:../ballerina-side-panel - '@wso2/ballerina-statement-editor': - specifier: workspace:* - version: link:../statement-editor - '@wso2/bi-diagram': - specifier: workspace:* - version: link:../bi-diagram - '@wso2/component-diagram': - specifier: workspace:* - version: link:../../common-libs/component-diagram - '@wso2/data-mapper-view': - specifier: workspace:* - version: link:../data-mapper-view - '@wso2/overview-view': - specifier: workspace:* - version: link:../overview-view - '@wso2/persist-layer-diagram': - specifier: workspace:* - version: link:../persist-layer-diagram - '@wso2/record-creator': - specifier: workspace:* - version: link:../record-creator - '@wso2/sequence-diagram': - specifier: workspace:* - version: link:../sequence-diagram - '@wso2/syntax-tree': - specifier: workspace:* - version: link:../syntax-tree - '@wso2/type-diagram': - specifier: workspace:* - version: link:../type-diagram - '@wso2/type-editor': - specifier: workspace:* - version: link:../type-editor - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../../common-libs/ui-toolkit - '@wso2/wso2-platform-core': - specifier: workspace:* - version: link:../../wso2-platform/wso2-platform-core - highlight.js: - specifier: ^11.11.1 - version: 11.11.1 - lodash: - specifier: ~4.17.21 - version: 4.17.21 - lodash.debounce: - specifier: ^4.0.8 - version: 4.0.8 - react: - specifier: 18.2.0 - version: 18.2.0 - react-collapse: - specifier: ~5.1.1 - version: 5.1.1(react@18.2.0) - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - react-hook-form: - specifier: 7.56.4 - version: 7.56.4(react@18.2.0) - react-lottie: - specifier: ^1.2.10 - version: 1.2.10(react@18.2.0) - react-markdown: - specifier: ~10.1.0 - version: 10.1.0(@types/react@18.2.0)(react@18.2.0) - react-syntax-highlighter: - specifier: ~15.6.1 - version: 15.6.1(react@18.2.0) - rehype-raw: - specifier: ^7.0.0 - version: 7.0.0 - remark-breaks: - specifier: ~4.0.0 - version: 4.0.0 - vscode-uri: - specifier: ^3.1.0 - version: 3.1.0 - yup: - specifier: ~1.6.1 - version: 1.6.1 - devDependencies: - '@types/lodash.debounce': - specifier: ^4.0.6 - version: 4.0.9 - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-collapse': - specifier: ~5.0.4 - version: 5.0.4 - '@types/react-dom': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-lottie': - specifier: ^1.2.5 - version: 1.2.10 - '@types/react-syntax-highlighter': - specifier: ~15.5.13 - version: 15.5.13 - '@types/vscode-webview': - specifier: ~1.57.5 - version: 1.57.5 - '@types/webpack': - specifier: ^5.28.5 - version: 5.28.5(webpack-cli@4.10.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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - buffer: - specifier: ^6.0.3 - version: 6.0.3 - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - css-loader: - specifier: ^7.1.2 - version: 7.1.2(webpack@5.100.2) - eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.4.2) - eslint-plugin-react-hooks: - specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.4.2)) - eslint-plugin-react-refresh: - specifier: ^0.4.20 - version: 0.4.20(eslint@9.27.0(jiti@2.4.2)) - sass-loader: - specifier: ^16.0.5 - version: 16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.100.2) - source-map-loader: - specifier: ^5.0.0 - version: 5.0.0(webpack@5.100.2) - style-loader: - specifier: ^4.0.0 - version: 4.0.0(webpack@5.100.2) - ts-loader: - specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) - typescript: - specifier: 5.8.3 - version: 5.8.3 - webpack: - specifier: ^5.94.0 - version: 5.100.2(webpack-cli@4.10.0) - webpack-dev-server: - specifier: ^5.2.1 - version: 5.2.2(webpack-cli@4.10.0)(webpack@5.100.2) - - workspaces/ballerina/bi-diagram: - dependencies: - '@emotion/react': - specifier: ^11.9.3 - version: 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': - specifier: ^11.10.5 - version: 11.14.0(@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': - specifier: ^6.7.4 - version: 6.7.4 - '@projectstorm/react-canvas-core': - specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(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) - '@projectstorm/react-diagrams-core': - specifier: ^7.0.3 - version: 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': - specifier: ^7.1.3 - version: 7.1.3(@types/react@18.2.0) - '@projectstorm/react-diagrams-routing': - specifier: ^7.1.3 - version: 7.1.3(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) - '@wso2/ballerina-core': - specifier: workspace:* - version: link:../ballerina-core - '@wso2/ballerina-rpc-client': - specifier: workspace:* - version: link:../ballerina-rpc-client - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../../common-libs/ui-toolkit - dagre: - specifier: ~0.8.5 - version: 0.8.5 - lodash: - specifier: ~4.17.21 - version: 4.17.21 - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - devDependencies: - '@storybook/react': - specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.100.2))(webpack-hot-middleware@2.26.1) - '@types/dagre': - specifier: ~0.7.52 - version: 0.7.52 - '@types/lodash': - specifier: ~4.17.16 - version: 4.17.17 - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - specifier: 18.2.0 - version: 18.2.0 - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - typescript: - specifier: 5.8.3 - version: 5.8.3 - - workspaces/ballerina/component-diagram: - dependencies: - '@emotion/react': - specifier: ^11.14.0 - version: 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': - specifier: ^11.14.0 - version: 11.14.0(@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': - specifier: ^7.0.3 - version: 7.0.3 - '@projectstorm/react-canvas-core': - specifier: ^7.0.3 - version: 7.0.3(@types/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) - '@projectstorm/react-diagrams-core': - specifier: ^7.0.3 - version: 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': - specifier: ^7.1.3 - version: 7.1.3(@types/react@18.2.0) - '@projectstorm/react-diagrams-routing': - specifier: ^7.1.3 - version: 7.1.3(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) - '@wso2/ballerina-core': - specifier: workspace:* - version: link:../ballerina-core - '@wso2/bi-diagram': - specifier: workspace:* - version: link:../bi-diagram - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../../common-libs/ui-toolkit - dagre: - specifier: ~0.8.5 - version: 0.8.5 - lodash: - specifier: ~4.17.21 - version: 4.17.21 - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - devDependencies: - '@storybook/react': - specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.100.2))(webpack-hot-middleware@2.26.1) - '@types/dagre': - specifier: ~0.7.52 - version: 0.7.52 - '@types/lodash': - specifier: ~4.17.16 - version: 4.17.17 - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - specifier: 18.2.0 - version: 18.2.0 - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - typescript: - specifier: 5.8.3 - version: 5.8.3 - - workspaces/ballerina/data-mapper-view: - dependencies: - '@emotion/css': - specifier: ~11.13.5 - version: 11.13.5 - '@emotion/react': - specifier: ^11.14.0 - version: 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': - specifier: ^11.14.0 - version: 11.14.0(@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': - specifier: ^6.7.4 - version: 6.7.4 - '@projectstorm/react-canvas-core': - specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(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.0(@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': - specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(react@18.2.0)(resize-observer-polyfill@1.5.1) - '@tanstack/query-core': - specifier: ^5.77.1 - version: 5.81.2 - '@tanstack/react-query': - specifier: 5.77.1 - version: 5.77.1(react@18.2.0) - '@vscode/webview-ui-toolkit': - specifier: ^1.4.0 - version: 1.4.0(react@18.2.0) - '@wso2/ballerina-core': - specifier: workspace:* - version: link:../ballerina-core - '@wso2/ballerina-rpc-client': - specifier: workspace:* - version: link:../ballerina-rpc-client - '@wso2/ballerina-statement-editor': - specifier: workspace:* - version: link:../statement-editor - '@wso2/record-creator': - specifier: workspace:* - version: link:../record-creator - '@wso2/syntax-tree': - specifier: workspace:* - version: link:../syntax-tree - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../../common-libs/ui-toolkit - blueimp-md5: - specifier: ^2.19.0 - version: 2.19.0 - classnames: - specifier: ^2.5.1 - version: 2.5.1 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - lodash.debounce: - specifier: ^4.0.8 - version: 4.0.8 - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - react-intl: - specifier: ^7.1.11 - version: 7.1.11(react@18.2.0)(typescript@5.8.3) - react-lottie: - specifier: ^1.2.10 - version: 1.2.10(react@18.2.0) - reflect-metadata: - specifier: ^0.1.14 - version: 0.1.14 - resize-observer-polyfill: - specifier: ^1.5.1 - version: 1.5.1 - tsyringe: - specifier: ^4.10.0 - version: 4.10.0 - vscode-languageserver-types: - specifier: ^3.17.5 - version: 3.17.5 - zustand: - specifier: ^4.5.7 - version: 4.5.7(@types/react@18.2.0)(immer@9.0.21)(react@18.2.0) - devDependencies: - '@babel/core': - specifier: ^7.27.1 - version: 7.27.4 - '@babel/preset-env': - specifier: ^7.27.2 - version: 7.27.2(@babel/core@7.27.4) - '@rollup/plugin-commonjs': - specifier: ^28.0.3 - version: 28.0.6(rollup@4.44.0) - '@rollup/plugin-json': - specifier: ^6.1.0 - version: 6.1.0(rollup@4.44.0) - '@rollup/plugin-node-resolve': - specifier: ^16.0.1 - version: 16.0.1(rollup@4.44.0) - '@storybook/addon-actions': - specifier: ^8.6.14 - version: 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@storybook/addon-essentials': - specifier: ^8.6.14 - version: 8.6.14(@types/react@18.2.0)(storybook@8.6.14(prettier@3.6.2)) - '@storybook/addon-links': - specifier: ^8.6.14 - version: 8.6.14(react@18.2.0)(storybook@8.6.14(prettier@3.6.2)) - '@storybook/builder-webpack5': - specifier: ^8.6.14 - version: 8.6.14(storybook@8.6.14(prettier@3.6.2))(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/manager-webpack5': - specifier: ^6.5.16 - version: 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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: ^8.6.14 - version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.6.2)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.6.2))(typescript@5.8.3) - '@types/blueimp-md5': - specifier: ^2.18.2 - version: 2.18.2 - '@types/classnames': - specifier: ^2.3.4 - version: 2.3.4 - '@types/handlebars': - specifier: ^4.1.0 - version: 4.1.0 - '@types/lodash': - specifier: 4.17.16 - version: 4.17.16 - '@types/lodash.debounce': - specifier: ^4.0.9 - version: 4.0.9 - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-lottie': - specifier: ^1.2.10 - version: 1.2.10 - '@types/uuid': - specifier: ^10.0.0 - version: 10.0.0 - '@types/webpack': - specifier: ^5.28.5 - version: 5.28.5(webpack-cli@6.0.1) - '@typescript-eslint/eslint-plugin': - specifier: ~8.32.1 - version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': - specifier: ~8.32.1 - version: 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@vitejs/plugin-react': - specifier: ^4.4.1 - version: 4.5.2(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) - babel-loader: - specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.4)(webpack@5.100.2) - babel-plugin-transform-typescript-metadata: - specifier: ^0.3.2 - version: 0.3.2(@babel/core@7.27.4)(@babel/traverse@7.28.0) - copy-webpack-plugin: - specifier: ^13.0.0 - version: 13.0.0(webpack@5.100.2) - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - css-loader: - specifier: ^7.1.2 - version: 7.1.2(webpack@5.100.2) - dagre: - specifier: ^0.8.5 - version: 0.8.5 - eslint: - specifier: ^9.27.0 - version: 9.27.0(jiti@2.4.2) - eslint-plugin-react-hooks: - specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.4.2)) - eslint-plugin-react-refresh: - specifier: ^0.4.20 - version: 0.4.20(eslint@9.27.0(jiti@2.4.2)) - file-loader: - specifier: ^6.2.0 - version: 6.2.0(webpack@5.100.2) - fork-ts-checker-webpack-plugin: - specifier: ^9.1.0 - version: 9.1.0(typescript@5.8.3)(webpack@5.100.2) - monaco-editor-webpack-plugin: - specifier: ^7.1.0 - version: 7.1.0(monaco-editor@0.52.2)(webpack@5.100.2) - mousetrap: - specifier: ^1.6.5 - version: 1.6.5 - pathfinding: - specifier: ^0.4.18 - version: 0.4.18 - paths-js: - specifier: ^0.4.11 - version: 0.4.11 - react-scripts-ts: - specifier: ^3.1.0 - version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.27.4))(babel-runtime@6.26.0)(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)(webpack-cli@6.0.1) - react-test-renderer: - specifier: ^19.1.0 - version: 19.1.0(react@18.2.0) - rimraf: - specifier: ^6.0.1 - version: 6.0.1 - rollup: - specifier: ^4.41.0 - version: 4.44.0 - rollup-plugin-import-css: - specifier: ^3.5.8 - version: 3.5.8(rollup@4.44.0) - rollup-plugin-peer-deps-external: - specifier: ^2.2.4 - version: 2.2.4(rollup@4.44.0) - rollup-plugin-postcss: - specifier: ^4.0.2 - version: 4.0.2(postcss@8.5.6) - rollup-plugin-scss: - specifier: ^4.0.1 - version: 4.0.1 - rollup-plugin-svg: - specifier: ^2.0.0 - version: 2.0.0 - rollup-plugin-typescript2: - specifier: ^0.36.0 - version: 0.36.0(rollup@4.44.0)(typescript@5.8.3) - sass: - specifier: ^1.89.0 - version: 1.89.2 - sass-loader: - specifier: ^16.0.5 - version: 16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.100.2) - storybook: - specifier: ^8.6.14 - version: 8.6.14(prettier@3.6.2) - style-loader: - specifier: ^4.0.0 - version: 4.0.0(webpack@5.100.2) - stylelint: - specifier: ^16.19.1 - version: 16.21.0(typescript@5.8.3) - stylelint-config-standard: - specifier: ^38.0.0 - version: 38.0.0(stylelint@16.21.0(typescript@5.8.3)) - svg-url-loader: - specifier: ^8.0.0 - version: 8.0.0(webpack@5.100.2) - ts-loader: - specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) - tslib: - specifier: ^2.8.1 - version: 2.8.1 - tslint: - specifier: ^6.1.3 - version: 6.1.3(typescript@5.8.3) - tslint-react: - specifier: ^5.0.0 - version: 5.0.0(tslint@6.1.3(typescript@5.8.3))(typescript@5.8.3) - tslint-react-hooks: - specifier: ^2.2.2 - version: 2.2.2(tslint@6.1.3(typescript@5.8.3))(typescript@5.8.3) - typescript: - specifier: 5.8.3 - version: 5.8.3 - vite: - specifier: ^6.3.5 - version: 6.3.5(@types/node@24.0.14)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) - vscode-uri: - specifier: ^3.1.0 - version: 3.1.0 - webpack: - specifier: ^5.94.0 - version: 5.100.2(webpack-cli@6.0.1) - webpack-cli: - specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2) - webpack-dev-server: - specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) - - workspaces/ballerina/graphql: - dependencies: - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - graphiql: - specifier: 3.7.0 - version: 3.7.0(@codemirror/language@6.11.1)(@types/node@24.0.14)(@types/react-dom@18.2.0)(@types/react@18.2.0)(graphql@16.11.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - graphiql-explorer: - specifier: ^0.9.0 - version: 0.9.0(graphql@16.11.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - devDependencies: - '@babel/core': - specifier: ^7.27.1 - version: 7.27.4 - '@storybook/addon-actions': - specifier: ^6.5.9 - 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.4)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.100.2) - '@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.4.2))(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.4.2))(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.4)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4.2))(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.4.2))(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) - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - specifier: 18.2.0 - version: 18.2.0 - babel-loader: - specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.4)(webpack@5.100.2) - css-loader: - specifier: ^7.1.2 - version: 7.1.2(webpack@5.100.2) - graphql: - specifier: ^16.11.0 - version: 16.11.0 - mini-css-extract-plugin: - specifier: ^2.9.2 - version: 2.9.2(webpack@5.100.2) - source-map-loader: - specifier: ^5.0.0 - version: 5.0.0(webpack@5.100.2) - style-loader: - specifier: ^4.0.0 - version: 4.0.0(webpack@5.100.2) - ts-loader: - specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) - typescript: - specifier: 5.8.3 - version: 5.8.3 - webpack: - specifier: ^5.94.0 - version: 5.100.2(webpack-cli@4.10.0) - webpack-cli: - specifier: ^4.10.0 - version: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.100.2) - - workspaces/ballerina/graphql-design-diagram: - dependencies: - '@emotion/css': - specifier: ~11.13.5 - version: 11.13.5 - '@emotion/react': - specifier: ^11.14.0 - version: 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': - specifier: ^11.14.0 - version: 11.14.0(@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': - specifier: ^6.7.4 - version: 6.7.4 - '@projectstorm/react-canvas-core': - specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(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.0(@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': - specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(react@18.2.0)(resize-observer-polyfill@1.5.1) - '@wso2/ballerina-core': - specifier: workspace:* - version: link:../ballerina-core - '@wso2/syntax-tree': - specifier: workspace:* - version: link:../syntax-tree - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../../common-libs/ui-toolkit - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - html-to-image: - specifier: ^1.10.8 - version: 1.11.13 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - react-monaco-editor: - specifier: 0.58.0 - version: 0.58.0(monaco-editor@0.52.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - resize-observer-polyfill: - specifier: ^1.5.1 - version: 1.5.1 - rimraf: - specifier: ^6.0.1 - version: 6.0.1 - tslint: - specifier: ^6.1.3 - version: 6.1.3(typescript@4.9.5) - tslint-react: - specifier: ^5.0.0 - version: 5.0.0(tslint@6.1.3(typescript@4.9.5))(typescript@4.9.5) - tslint-react-hooks: - specifier: ^2.2.2 - version: 2.2.2(tslint@6.1.3(typescript@4.9.5))(typescript@4.9.5) - typescript: - specifier: ^4.1.3 - version: 4.9.5 - vscode-uri: - specifier: ^3.1.0 - version: 3.1.0 - devDependencies: - '@types/lodash': - specifier: 4.17.16 - version: 4.17.16 - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - - workspaces/ballerina/inline-data-mapper: - dependencies: - '@emotion/css': - specifier: ~11.13.5 - version: 11.13.5 - '@emotion/react': - specifier: ^11.14.0 - version: 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': - specifier: ^11.14.0 - version: 11.14.0(@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': - specifier: ^6.7.4 - version: 6.7.4 - '@projectstorm/react-canvas-core': - specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(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.0(@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': - specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(react@18.2.0)(resize-observer-polyfill@1.5.1) - '@tanstack/query-core': - specifier: ^5.77.1 - version: 5.81.2 - '@tanstack/react-query': - specifier: 5.77.1 - version: 5.77.1(react@18.2.0) - '@types/mousetrap': - specifier: ~1.6.15 - version: 1.6.15 - '@vscode/webview-ui-toolkit': - specifier: ^1.2.0 - version: 1.4.0(react@18.2.0) - '@wso2/ballerina-core': - specifier: workspace:* - version: link:../ballerina-core - '@wso2/ballerina-rpc-client': - specifier: workspace:* - version: link:../ballerina-rpc-client - '@wso2/syntax-tree': - specifier: workspace:* - version: link:../syntax-tree - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../../common-libs/ui-toolkit - blueimp-md5: - specifier: ^2.19.0 - version: 2.19.0 - classnames: - specifier: ^2.2.6 - version: 2.5.1 - lodash: - specifier: ^4.17.11 - version: 4.17.21 - lodash.debounce: - specifier: ^4.0.8 - version: 4.0.8 - mousetrap: - specifier: ^1.6.5 - version: 1.6.5 - react: - specifier: ^18.2.0 - version: 18.2.0 - react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) - resize-observer-polyfill: - specifier: ^1.5.1 - version: 1.5.1 - vscode-languageserver-types: - specifier: ^3.17.5 - version: 3.17.5 - zustand: - specifier: ^5.0.4 - version: 5.0.5(@types/react@18.2.0)(immer@9.0.21)(react@18.2.0)(use-sync-external-store@1.5.0(react@18.2.0)) - devDependencies: - '@types/blueimp-md5': - specifier: ^2.18.2 - version: 2.18.2 - '@types/lodash': - specifier: 4.17.16 - version: 4.17.16 - '@types/lodash.debounce': - specifier: ^4.0.6 - version: 4.0.9 - '@types/react': - specifier: ^18.2.0 - version: 18.2.0 - '@types/react-dom': - 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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': - specifier: ~8.32.1 - version: 8.32.1(eslint@9.27.0(jiti@2.4.2))(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.100.2) - eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.4.2) - eslint-plugin-react-hooks: - specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.4.2)) - eslint-plugin-react-refresh: - specifier: ^0.4.4 - version: 0.4.20(eslint@9.27.0(jiti@2.4.2)) - file-loader: - specifier: ^6.2.0 - version: 6.2.0(webpack@5.100.2) - react-hook-form: - specifier: ~7.56.3 - version: 7.56.4(react@18.2.0) - ts-loader: - specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) - tslib: - specifier: ^2.8.1 - version: 2.8.1 - tslint: - specifier: ^6.1.3 - version: 6.1.3(typescript@5.8.3) - tslint-react: - specifier: ^5.0.0 - version: 5.0.0(tslint@6.1.3(typescript@5.8.3))(typescript@5.8.3) - tslint-react-hooks: - specifier: ^2.2.2 - version: 2.2.2(tslint@6.1.3(typescript@5.8.3))(typescript@5.8.3) - typescript: - specifier: ^5.8.3 - version: 5.8.3 - - workspaces/ballerina/overview-view: - dependencies: - '@emotion/react': - specifier: ^11.9.3 - version: 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': - specifier: ^11.10.5 - version: 11.14.0(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) - '@vscode/webview-ui-toolkit': - specifier: ^1.2.0 - version: 1.4.0(react@18.2.0) - '@wso2/ballerina-core': - specifier: workspace:* - version: link:../ballerina-core - '@wso2/ballerina-rpc-client': - specifier: workspace:* - version: link:../ballerina-rpc-client - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../../common-libs/ui-toolkit - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - vscode-uri: - specifier: ^3.0.8 - version: 3.1.0 - devDependencies: - '@types/react': - 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) - '@typescript-eslint/parser': - specifier: ^6.21.0 - version: 6.21.0(eslint@8.57.1)(typescript@5.8.3) - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - eslint: - specifier: ^8.57.1 - version: 8.57.1 - eslint-plugin-react-hooks: - specifier: ^5.2.0 - version: 5.2.0(eslint@8.57.1) - eslint-plugin-react-refresh: - specifier: ^0.4.20 - version: 0.4.20(eslint@8.57.1) - typescript: - specifier: 5.8.3 - version: 5.8.3 - - workspaces/ballerina/persist-layer-diagram: - dependencies: - '@emotion/css': - specifier: ~11.13.5 - version: 11.13.5 - '@emotion/react': - specifier: ^11.9.3 - version: 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': - specifier: ^11.10.5 - version: 11.14.0(@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': - specifier: ^7.0.3 - version: 7.0.3 - '@projectstorm/react-canvas-core': - specifier: ^7.0.3 - version: 7.0.3(@types/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) - '@projectstorm/react-diagrams-core': - specifier: ^7.0.3 - version: 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': - specifier: ^7.1.3 - version: 7.1.3(@types/react@18.2.0) - '@projectstorm/react-diagrams-routing': - specifier: ^7.1.3 - version: 7.1.3(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) - '@types/lodash': - specifier: ^4.14.189 - version: 4.17.17 - '@types/node': - specifier: ^22.15.18 - version: 22.15.32 - closest: - specifier: ^0.0.1 - version: 0.0.1 - dagre: - specifier: ^0.8.5 - version: 0.8.5 - file-loader: - specifier: ^6.2.0 - version: 6.2.0(webpack@5.100.2) - html-to-image: - specifier: ^1.10.8 - version: 1.11.13 - lodash: - specifier: ^4.17.11 - version: 4.17.21 - pathfinding: - specifier: ^0.4.18 - version: 0.4.18 - paths-js: - specifier: ^0.4.11 - version: 0.4.11 - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - resize-observer-polyfill: - specifier: ^1.5.1 - version: 1.5.1 - typescript: - specifier: 5.8.3 - version: 5.8.3 - devDependencies: - '@babel/core': - specifier: ^7.27.1 - version: 7.27.4 - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - specifier: 18.2.0 - version: 18.2.0 - '@wso2/ballerina-core': - specifier: workspace:* - version: link:../ballerina-core - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../../common-libs/ui-toolkit - babel-loader: - specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.4)(webpack@5.100.2) - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - css-loader: - specifier: ^7.1.2 - version: 7.1.2(webpack@5.100.2) - source-map-loader: - specifier: ^5.0.0 - version: 5.0.0(webpack@5.100.2) - style-loader: - specifier: ^4.0.0 - version: 4.0.0(webpack@5.100.2) - ts-loader: - specifier: ^9.4.1 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) - webpack: - specifier: ^5.94.0 - version: 5.100.2(webpack-cli@6.0.1) - webpack-cli: - specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2) - webpack-dev-server: - specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) - - workspaces/ballerina/record-creator: - dependencies: - '@emotion/css': - specifier: ~11.13.5 - version: 11.13.5 - '@emotion/react': - specifier: ~11.14.0 - version: 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': - specifier: ~11.14.0 - version: 11.14.0(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) - '@headlessui/react': - specifier: ~1.7.18 - version: 1.7.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@tanstack/react-query': - specifier: ~5.76.1 - version: 5.76.2(react@18.2.0) - '@types/lodash.debounce': - specifier: ~4.0.9 - version: 4.0.9 - '@types/react-lottie': - specifier: ~1.2.10 - version: 1.2.10 - '@vscode/webview-ui-toolkit': - specifier: ~1.4.0 - version: 1.4.0(react@18.2.0) - '@wso2/ballerina-core': - specifier: workspace:* - version: link:../ballerina-core - '@wso2/ballerina-rpc-client': - specifier: workspace:* - version: link:../ballerina-rpc-client - '@wso2/ballerina-statement-editor': - specifier: workspace:* - version: link:../statement-editor - '@wso2/syntax-tree': - specifier: workspace:* - version: link:../syntax-tree - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../../common-libs/ui-toolkit - lodash.debounce: - specifier: ~4.0.8 - version: 4.0.8 - monaco-editor: - specifier: ~0.46.0 - version: 0.46.0 - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - react-intl: - specifier: ~7.1.11 - version: 7.1.11(react@18.2.0)(typescript@5.8.3) - react-lottie: - specifier: ~1.2.4 - version: 1.2.10(react@18.2.0) - vscode-uri: - specifier: ~3.1.0 - version: 3.1.0 - devDependencies: - '@types/node': - specifier: ^22.15.18 - version: 22.15.32 - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - specifier: 18.2.0 - version: 18.2.0 - copyfiles: - specifier: ~2.4.1 - version: 2.4.1 - eslint: - specifier: ~9.26.0 - version: 9.26.0(jiti@2.4.2) - react-scripts-ts: - specifier: 3.1.0 - version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.28.0))(babel-runtime@6.26.0)(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - typescript: - specifier: 5.8.3 - version: 5.8.3 - - workspaces/ballerina/sequence-diagram: - dependencies: - '@emotion/react': - specifier: ^11.9.3 - version: 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': - specifier: ^11.10.5 - version: 11.14.0(@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': - specifier: ^7.0.3 - version: 7.0.3 - '@projectstorm/react-canvas-core': - specifier: ^7.0.3 - version: 7.0.3(@types/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) - '@projectstorm/react-diagrams-core': - specifier: ^7.0.3 - version: 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': - specifier: ^7.1.3 - version: 7.1.3(@types/react@18.2.0) - '@projectstorm/react-diagrams-routing': - specifier: ^7.1.3 - version: 7.1.3(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) - '@wso2/ballerina-core': - specifier: workspace:* - version: link:../ballerina-core - '@wso2/ballerina-rpc-client': - specifier: workspace:* - version: link:../ballerina-rpc-client - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../../common-libs/ui-toolkit - dagre: - specifier: ~0.8.5 - version: 0.8.5 - lodash: - specifier: ~4.17.21 - version: 4.17.21 - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - devDependencies: - '@storybook/react': - specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.26.0(jiti@2.4.2))(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.100.2))(webpack-hot-middleware@2.26.1) - '@types/dagre': - specifier: ~0.7.52 - version: 0.7.52 - '@types/lodash': - specifier: ~4.17.16 - version: 4.17.17 - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - 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.4.2))(typescript@5.8.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - eslint: - specifier: ~9.26.0 - version: 9.26.0(jiti@2.4.2) - eslint-plugin-react-hooks: - specifier: ~5.2.0 - version: 5.2.0(eslint@9.26.0(jiti@2.4.2)) - 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.4.2))(typescript@5.8.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.26.0(jiti@2.4.2)) - prettier: - specifier: ~3.5.3 - version: 3.5.3 - typescript: - specifier: 5.8.3 - version: 5.8.3 - - workspaces/ballerina/statement-editor: - dependencies: - '@emotion/css': - specifier: ~11.13.5 - version: 11.13.5 - '@emotion/react': - specifier: ^11.9.3 - version: 11.14.0(@types/react@17.0.87)(react@19.1.0) - '@emotion/styled': - specifier: ^11.10.5 - version: 11.14.0(@emotion/react@11.14.0(@types/react@17.0.87)(react@19.1.0))(@types/react@17.0.87)(react@19.1.0) - '@tanstack/query-core': - specifier: ^4.0.0-beta.1 - version: 4.40.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) - '@vscode/webview-ui-toolkit': - specifier: ^1.2.0 - version: 1.4.0(react@19.1.0) - '@wso2/ballerina-core': - specifier: workspace:* - version: link:../ballerina-core - '@wso2/ballerina-rpc-client': - specifier: workspace:* - version: link:../ballerina-rpc-client - '@wso2/syntax-tree': - specifier: workspace:* - version: link:../syntax-tree - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../../common-libs/ui-toolkit - classnames: - specifier: ^2.2.6 - version: 2.5.1 - lodash.debounce: - specifier: ^4.0.8 - version: 4.0.8 - react: - specifier: ^19.1.0 - version: 19.1.0 - react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) - react-icons: - specifier: ^4.12.0 - version: 4.12.0(react@19.1.0) - react-intl: - specifier: ^7.1.11 - version: 7.1.11(react@19.1.0)(typescript@4.9.5) - react-lottie: - specifier: ^1.2.3 - version: 1.2.10(react@19.1.0) - vscode-languageserver-protocol: - specifier: ^3.16.0 - version: 3.17.5 - vscode-languageserver-types: - specifier: ^3.17.5 - version: 3.17.5 - vscode-uri: - specifier: ^3.0.8 - version: 3.1.0 - devDependencies: - '@storybook/react': - specifier: ^6.5.9 - version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.100.2))(webpack-hot-middleware@2.26.1) - '@types/classnames': - specifier: ^2.2.9 - version: 2.3.4 - '@types/lodash.camelcase': - specifier: ^4.3.0 - version: 4.3.9 - '@types/lodash.clonedeep': - specifier: ^4.5.6 - version: 4.5.9 - '@types/lodash.debounce': - specifier: ^4.0.6 - version: 4.0.9 - '@types/react': - specifier: ^17.0.37 - version: 17.0.87 - '@types/react-dom': - specifier: 17.0.14 - version: 17.0.14 - '@types/react-lottie': - specifier: ^1.2.5 - version: 1.2.10 - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - storybook: - specifier: ^8.6.13 - version: 8.6.14(prettier@3.6.2) - tslib: - specifier: ^2.1.0 - version: 2.8.1 - tslint: - specifier: ^6.1.3 - version: 6.1.3(typescript@4.9.5) - tslint-react: - specifier: ^4.2.0 - version: 4.2.0(tslint@6.1.3(typescript@4.9.5))(typescript@4.9.5) - tslint-react-hooks: - specifier: ^2.2.2 - version: 2.2.2(tslint@6.1.3(typescript@4.9.5))(typescript@4.9.5) - typescript: - specifier: ^4.9.4 - version: 4.9.5 - - workspaces/ballerina/syntax-tree: - devDependencies: - husky: - specifier: ^9.1.7 - version: 9.1.7 - lint-staged: - specifier: ^16.0.0 - version: 16.1.2 - prettier: - specifier: ^3.5.3 - version: 3.5.3 - rimraf: - specifier: ^6.0.1 - version: 6.0.1 - tslint: - specifier: ^6.1.3 - version: 6.1.3(typescript@5.8.3) - typescript: - specifier: 5.8.3 - version: 5.8.3 - - workspaces/ballerina/type-diagram: - dependencies: - '@emotion/css': - specifier: ~11.13.5 - version: 11.13.5 - '@emotion/react': - specifier: ^11.9.3 - version: 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': - specifier: ^11.14.0 - version: 11.14.0(@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': - specifier: ^7.0.3 - version: 7.0.3 - '@projectstorm/react-canvas-core': - specifier: ^7.0.3 - version: 7.0.3(@types/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) - '@projectstorm/react-diagrams-core': - specifier: ^7.0.3 - version: 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': - specifier: ^7.1.3 - version: 7.1.3(@types/react@18.2.0) - '@projectstorm/react-diagrams-routing': - specifier: ^7.1.3 - version: 7.1.3(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) - '@types/lodash': - specifier: ^4.17.16 - version: 4.17.17 - '@types/node': - specifier: ^22.15.19 - version: 22.15.32 - closest: - specifier: ^0.0.1 - version: 0.0.1 - dagre: - specifier: ^0.8.5 - version: 0.8.5 - file-loader: - specifier: ^6.2.0 - version: 6.2.0(webpack@5.100.2) - html-to-image: - specifier: ^1.11.11 - version: 1.11.13 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - pathfinding: - specifier: ^0.4.18 - version: 0.4.18 - paths-js: - specifier: ^0.4.11 - version: 0.4.11 - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - resize-observer-polyfill: - specifier: ^1.5.1 - version: 1.5.1 - typescript: - specifier: 5.8.3 - version: 5.8.3 - uuid: - specifier: ^11.1.0 - version: 11.1.0 - devDependencies: - '@babel/core': - specifier: ^7.27.1 - version: 7.27.4 - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - specifier: 18.2.0 - version: 18.2.0 - '@types/uuid': - specifier: ^10.0.0 - version: 10.0.0 - '@wso2/ballerina-core': - specifier: workspace:* - version: link:../ballerina-core - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../../common-libs/ui-toolkit - babel-loader: - specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.4)(webpack@5.100.2) - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - css-loader: - specifier: ^7.1.2 - version: 7.1.2(webpack@5.100.2) - source-map-loader: - specifier: ^5.0.0 - version: 5.0.0(webpack@5.100.2) - style-loader: - specifier: ^4.0.0 - version: 4.0.0(webpack@5.100.2) - ts-loader: - specifier: ^9.4.1 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) - webpack: - specifier: ^5.94.0 - version: 5.100.2(webpack-cli@6.0.1) - webpack-cli: - specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2) - webpack-dev-server: - specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) - - workspaces/ballerina/type-editor: - dependencies: - '@emotion/css': - specifier: ~11.13.5 - version: 11.13.5 - '@emotion/react': - specifier: ~11.14.0 - version: 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': - specifier: ~11.14.0 - version: 11.14.0(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) - '@headlessui/react': - specifier: ~1.7.18 - version: 1.7.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@tanstack/react-query': - specifier: 5.76.1 - version: 5.76.1(react@18.2.0) - '@vscode/webview-ui-toolkit': - specifier: ~1.4.0 - version: 1.4.0(react@18.2.0) - '@wso2/ballerina-core': - specifier: workspace:* - version: link:../ballerina-core - '@wso2/ballerina-rpc-client': - specifier: workspace:* - version: link:../ballerina-rpc-client - '@wso2/ballerina-statement-editor': - specifier: workspace:* - version: link:../statement-editor - '@wso2/syntax-tree': - specifier: workspace:* - version: link:../syntax-tree - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../../common-libs/ui-toolkit - lodash: - specifier: ~4.17.21 - version: 4.17.21 - lodash.debounce: - specifier: ^4.0.8 - version: 4.0.8 - monaco-editor: - specifier: ~0.52.2 - version: 0.52.2 - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - react-intl: - specifier: ^7.1.11 - version: 7.1.11(react@18.2.0)(typescript@5.8.3) - react-lottie: - specifier: ^1.2.10 - version: 1.2.10(react@18.2.0) - vscode-uri: - specifier: ~3.1.0 - version: 3.1.0 - devDependencies: - '@types/lodash': - specifier: ~4.17.15 - version: 4.17.17 - '@types/lodash.debounce': - specifier: ^4.0.9 - version: 4.0.9 - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-lottie': - specifier: ^1.2.10 - version: 1.2.10 - copyfiles: - specifier: ~2.4.1 - version: 2.4.1 - eslint: - specifier: ~9.26.0 - version: 9.26.0(jiti@2.4.2) - react-scripts-ts: - specifier: 3.1.0 - version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.28.0))(babel-runtime@6.26.0)(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - typescript: - specifier: 5.8.3 - version: 5.8.3 - - workspaces/bi/bi-extension: - dependencies: - '@wso2/ballerina-core': - specifier: workspace:* - version: link:../../ballerina/ballerina-core - '@wso2/font-wso2-vscode': - specifier: workspace:* - version: link:../../common-libs/font-wso2-vscode - xstate: - specifier: ^4.38.3 - version: 4.38.3 - devDependencies: - '@playwright/test': - specifier: ~1.52.0 - version: 1.52.0 - '@types/mocha': - specifier: ^10.0.3 - version: 10.0.10 - '@types/node': - specifier: 22.15.18 - version: 22.15.18 - '@types/vscode': - specifier: ^1.84.0 - version: 1.101.0 - '@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) - '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@8.57.1)(typescript@5.8.3) - '@vscode/test-electron': - specifier: ^2.5.2 - version: 2.5.2 - '@vscode/vsce': - specifier: ^3.4.0 - version: 3.4.2 - '@wso2/playwright-vscode-tester': - specifier: workspace:* - version: link:../../common-libs/playwright-vscode-tester - copy-webpack-plugin: - specifier: ^13.0.0 - version: 13.0.0(webpack@5.100.2) - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - eslint: - specifier: ^8.57.1 - version: 8.57.1 - glob: - specifier: ^11.0.2 - version: 11.0.3 - mocha: - specifier: ^11.2.2 - version: 11.7.0 - source-map-support: - specifier: ^0.5.21 - version: 0.5.21 - ts-loader: - specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) - typescript: - specifier: 5.8.3 - version: 5.8.3 - webpack: - specifier: ^5.94.0 - version: 5.100.2(webpack-cli@6.0.1) - webpack-cli: - specifier: ^6.0.1 - version: 6.0.1(webpack@5.100.2) - webpack-permissions-plugin: - specifier: ^1.0.9 - version: 1.0.10 - - workspaces/choreo/choreo-core: - dependencies: - '@wso2/wso2-platform-core': - specifier: workspace:* - version: link:../../wso2-platform/wso2-platform-core - vscode-messenger-common: - specifier: ^0.5.1 - version: 0.5.1 - vscode-messenger-webview: - specifier: ^0.5.1 - version: 0.5.1 - devDependencies: - '@biomejs/biome': - specifier: ^1.8.3 - version: 1.9.4 - typescript: - specifier: 5.8.3 - version: 5.8.3 - - workspaces/choreo/choreo-extension: - dependencies: - '@vscode-logging/logger': - specifier: ^2.0.0 - version: 2.0.0 - '@vscode-logging/types': - specifier: ^2.0.0 - version: 2.0.0 - '@vscode-logging/wrapper': - specifier: ^2.0.0 - version: 2.0.0 - '@vscode/extension-telemetry': - specifier: ~1.0.0 - version: 1.0.0(tslib@2.8.1) - '@vscode/iconv-lite-umd': - specifier: ^0.7.0 - version: 0.7.0 - '@vscode/webview-ui-toolkit': - specifier: ^1.2.0 - version: 1.4.0(react@19.1.0) - '@wso2/choreo-core': - specifier: workspace:* - version: link:../choreo-core - '@wso2/choreo-vscode-webviews': - specifier: workspace:* - version: link:../choreo-webviews - '@wso2/wso2-platform-core': - specifier: workspace:* - version: link:../../wso2-platform/wso2-platform-core - byline: - specifier: ^5.0.0 - version: 5.0.0 - dotenv: - specifier: ^16.0.3 - version: 16.3.2 - file-type: - specifier: ^18.2.1 - version: 18.7.0 - js-yaml: - specifier: ^4.1.0 - version: 4.1.0 - jschardet: - specifier: ^3.0.0 - version: 3.1.4 - vscode-jsonrpc: - specifier: ^8.2.1 - version: 8.2.1 - vscode-messenger: - specifier: ^0.5.1 - version: 0.5.1 - vscode-messenger-common: - specifier: ^0.5.1 - version: 0.5.1 - which: - specifier: ^5.0.0 - version: 5.0.0 - yaml: - specifier: ^2.6.0 - version: 2.8.0 - zustand: - specifier: ^5.0.5 - version: 5.0.5(@types/react@18.2.0)(immer@9.0.21)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)) - devDependencies: - '@biomejs/biome': - specifier: ^1.8.3 - version: 1.9.4 - '@playwright/test': - specifier: 1.52.0 - version: 1.52.0 - '@types/byline': - specifier: ^4.2.36 - version: 4.2.36 - '@types/js-yaml': - specifier: ^4.0.9 - version: 4.0.9 - '@types/mocha': - specifier: ~10.0.1 - version: 10.0.10 - '@types/node': - specifier: ^22.15.24 - version: 22.15.32 - '@types/vscode': - specifier: ^1.100.0 - version: 1.101.0 - '@types/which': - specifier: ^3.0.4 - version: 3.0.4 - '@vscode/vsce': - specifier: ^3.4.2 - version: 3.4.2 - '@wso2/playwright-vscode-tester': - specifier: workspace:* - version: link:../../common-libs/playwright-vscode-tester - axios: - specifier: ^1.9.0 - version: 1.9.0 - copy-webpack-plugin: - specifier: ^13.0.0 - version: 13.0.0(webpack@5.100.2) - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - del-cli: - specifier: ^6.0.0 - version: 6.0.0 - mocha: - specifier: ^11.5.0 - version: 11.7.0 - terser-webpack-plugin: - specifier: ^5.3.10 - version: 5.3.14(webpack@5.100.2) - ts-loader: - specifier: ~9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) - typescript: - specifier: 5.8.3 - version: 5.8.3 - vscode-extension-tester: - specifier: ^8.14.1 - version: 8.14.1(mocha@11.7.0)(typescript@5.8.3) - webpack: - specifier: ^5.94.0 - version: 5.100.2(webpack-cli@6.0.1) - webpack-cli: - specifier: ^6.0.1 - version: 6.0.1(webpack@5.100.2) - webpack-permissions-plugin: - specifier: ^1.0.9 - version: 1.0.10 - - workspaces/choreo/choreo-webviews: - dependencies: - '@biomejs/biome': - specifier: ^1.9.4 - version: 1.9.4 - '@formkit/auto-animate': - specifier: 0.8.2 - version: 0.8.2 - '@headlessui/react': - specifier: ^2.2.4 - version: 2.2.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@hookform/resolvers': - specifier: ^5.0.1 - version: 5.0.1(react-hook-form@7.56.4(react@18.2.0)) - '@tanstack/react-query': - specifier: ~4.28.0 - version: 4.28.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@tanstack/react-query-persist-client': - specifier: ~4.28.0 - version: 4.28.0(@tanstack/react-query@4.28.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) - '@vscode/webview-ui-toolkit': - specifier: ^1.4.0 - version: 1.4.0(react@18.2.0) - '@wso2/choreo-core': - specifier: workspace:* - version: link:../choreo-core - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../../common-libs/ui-toolkit - '@wso2/wso2-platform-core': - specifier: workspace:* - version: link:../../wso2-platform/wso2-platform-core - classnames: - specifier: ~2.5.1 - version: 2.5.1 - clipboardy: - specifier: ^4.0.0 - version: 4.0.0 - js-yaml: - specifier: ^4.1.0 - version: 4.1.0 - lodash.debounce: - specifier: ~4.0.8 - version: 4.0.8 - prism-react-renderer: - specifier: ^2.4.1 - version: 2.4.1(react@18.2.0) - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - react-hook-form: - specifier: 7.56.4 - version: 7.56.4(react@18.2.0) - react-markdown: - specifier: ^7.1.0 - version: 7.1.2(@types/react@18.2.0)(react@18.2.0) - rehype-raw: - specifier: ^6.1.0 - version: 6.1.1 - remark-gfm: - specifier: ^4.0.1 - version: 4.0.1 - swagger-ui-react: - specifier: ^5.22.0 - version: 5.25.2(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - timezone-support: - specifier: ^3.1.0 - version: 3.1.0 - vscode-messenger-common: - specifier: ^0.5.1 - version: 0.5.1 - vscode-messenger-webview: - specifier: ^0.5.1 - version: 0.5.1 - zod: - specifier: ^3.22.4 - version: 3.25.67 - devDependencies: - '@types/js-yaml': - specifier: ^4.0.5 - version: 4.0.9 - '@types/lodash.debounce': - specifier: ^4.0.9 - version: 4.0.9 - '@types/node': - specifier: ^22.15.24 - version: 22.15.32 - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - specifier: 18.2.0 - version: 18.2.0 - '@types/swagger-ui-react': - specifier: ^5.18.0 - version: 5.18.0 - '@types/vscode-webview': - specifier: ^1.57.5 - version: 1.57.5 - autoprefixer: - specifier: ^10.4.21 - version: 10.4.21(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.100.2) - file-loader: - specifier: ^6.2.0 - version: 6.2.0(webpack@5.100.2) - node-sass: - specifier: ^9.0.0 - version: 9.0.0 - path: - specifier: ^0.12.7 - version: 0.12.7 - postcss: - specifier: ^8.5.4 - version: 8.5.6 - postcss-loader: - specifier: ^8.1.1 - version: 8.1.1(postcss@8.5.6)(typescript@5.8.3)(webpack@5.100.2) - sass-loader: - specifier: ^16.0.5 - version: 16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.100.2) - source-map-loader: - specifier: ^5.0.0 - version: 5.0.0(webpack@5.100.2) - style-loader: - specifier: ^4.0.0 - version: 4.0.0(webpack@5.100.2) - tailwindcss: - specifier: ^3.4.3 - version: 3.4.17 - ts-loader: - specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) - typescript: - specifier: 5.8.3 - version: 5.8.3 - webpack: - specifier: ^5.94.0 - version: 5.100.2(webpack-cli@6.0.1) - webpack-cli: - specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2) - webpack-dev-server: - specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) - - workspaces/common-libs/component-diagram: - dependencies: - '@emotion/react': - specifier: ^11.9.3 - version: 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': - specifier: ^11.10.5 - version: 11.14.0(@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': - specifier: ^6.7.4 - version: 6.7.4 - '@projectstorm/react-canvas-core': - specifier: ^7.0.3 - version: 7.0.3(@types/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) - '@projectstorm/react-diagrams-core': - specifier: ^7.0.3 - version: 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': - specifier: ^7.1.3 - version: 7.1.3(@types/react@18.2.0) - '@projectstorm/react-diagrams-routing': - specifier: ^7.1.3 - version: 7.1.3(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) - '@wso2/ballerina-core': - specifier: workspace:* - version: link:../../ballerina/ballerina-core - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../ui-toolkit - dagre: - specifier: ~0.8.5 - version: 0.8.5 - lodash: - specifier: ~4.17.21 - version: 4.17.21 - react: - specifier: ~18.2.0 - version: 18.2.0 - react-dom: - specifier: ~18.2.0 - version: 18.2.0(react@18.2.0) - devDependencies: - '@storybook/react': - specifier: ^9.0.0 - version: 9.0.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3) - '@types/dagre': - specifier: ~0.7.52 - version: 0.7.52 - '@types/lodash': - specifier: ~4.17.17 - version: 4.17.17 - '@types/react': - specifier: ^18.2.0 - version: 18.2.0 - '@types/react-dom': - specifier: ^18.2.0 - version: 18.2.0 - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - typescript: - specifier: ^5.8.3 - version: 5.8.3 - - workspaces/common-libs/font-wso2-vscode: - devDependencies: - '@vscode/codicons': - specifier: 0.0.36 - version: 0.0.36 - fantasticon: - specifier: ^3.0.0 - version: 3.0.0 - icon-font-generator: - specifier: ^2.1.11 - version: 2.1.11 - jsonc-parser: - specifier: ^3.3.1 - version: 3.3.1 - - workspaces/common-libs/playwright-vscode-tester: - dependencies: - '@playwright/test': - specifier: 1.52.0 - version: 1.52.0 - '@vscode/vsce': - specifier: ~3.4.2 - version: 3.4.2 - compare-versions: - specifier: ~6.1.1 - version: 6.1.1 - fs-extra: - specifier: ~11.3.0 - version: 11.3.0 - got: - specifier: 14.4.7 - version: 14.4.7 - hpagent: - specifier: ~1.2.0 - version: 1.2.0 - playwright-core: - specifier: ~1.52.0 - version: 1.52.0 - targz: - specifier: ~1.0.1 - version: 1.0.1 - unzipper: - specifier: ~0.12.3 - version: 0.12.3 - devDependencies: - '@types/fs-extra': - specifier: ~11.0.1 - version: 11.0.4 - '@types/node': - specifier: ~22.15.24 - version: 22.15.32 - '@types/unzipper': - 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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': - specifier: ~8.33.0 - version: 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - typescript: - specifier: 5.8.3 - version: 5.8.3 - - workspaces/common-libs/rpc-generator: - dependencies: - '@ts-morph/common': - specifier: ^0.27.0 - version: 0.27.0 - ts-morph: - specifier: ^26.0.0 - version: 26.0.0 - devDependencies: - '@types/node': - specifier: ^22.15.24 - version: 22.15.32 - - workspaces/common-libs/service-designer: - dependencies: - '@emotion/css': - specifier: ^11.10.5 - version: 11.13.5 - '@emotion/react': - specifier: ^11.9.3 - version: 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': - specifier: ^11.10.5 - version: 11.14.0(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) - '@vscode/codicons': - specifier: 0.0.33 - version: 0.0.33 - '@vscode/webview-ui-toolkit': - specifier: ^1.2.0 - version: 1.4.0(react@18.2.0) - '@wso2/font-wso2-vscode': - specifier: workspace:* - version: link:../font-wso2-vscode - '@wso2/syntax-tree': - specifier: workspace:* - version: link:../../ballerina/syntax-tree - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../ui-toolkit - react: - specifier: '>=17.0.2' - version: 18.2.0 - react-dom: - specifier: '>=17.0.2' - version: 18.2.0(react@18.2.0) - devDependencies: - '@storybook/addon-actions': - specifier: ~7.4.0 - version: 7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/addon-essentials': - specifier: ~7.4.0 - 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/addon-links': - specifier: ~7.4.0 - version: 7.4.6(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) - '@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.4)(@swc/core@1.12.5(@swc/helpers@0.5.17))(@swc/helpers@0.5.17)(@types/react-dom@18.2.0)(@types/react@18.2.0)(@types/webpack@5.28.5(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6))(encoding@0.1.13)(esbuild@0.25.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)))(webpack-hot-middleware@2.26.1) - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - 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) - '@typescript-eslint/parser': - specifier: ^6.9.1 - version: 6.21.0(eslint@8.57.1)(typescript@5.8.3) - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - eslint: - specifier: ^8.52.0 - version: 8.57.1 - eslint-plugin-react: - specifier: ^7.33.1 - version: 7.37.5(eslint@8.57.1) - eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.2(eslint@8.57.1) - eslint-plugin-react-refresh: - specifier: ^0.4.4 - version: 0.4.20(eslint@8.57.1) - typescript: - specifier: 5.8.3 - version: 5.8.3 - - workspaces/common-libs/ui-toolkit: - dependencies: - '@emotion/css': - specifier: ^11.10.5 - version: 11.13.5 - '@emotion/react': - specifier: ^11.9.3 - version: 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': - specifier: ^11.10.5 - version: 11.14.0(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) - '@headlessui/react': - specifier: ~1.7.18 - version: 1.7.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@monaco-editor/react': - specifier: ~4.7.0 - version: 4.7.0(monaco-editor@0.52.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@projectstorm/geometry': - specifier: ^6.7.4 - version: 6.7.4 - '@projectstorm/react-canvas-core': - specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(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.0(@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': - specifier: ^7.0.3 - version: 7.0.3(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) - '@vscode/codicons': - specifier: 0.0.36 - version: 0.0.36 - '@vscode/webview-ui-toolkit': - specifier: ~1.4.0 - version: 1.4.0(react@18.2.0) - '@wso2/font-wso2-vscode': - specifier: workspace:* - version: link:../font-wso2-vscode - classnames: - specifier: ^2.5.1 - version: 2.5.1 - lodash: - specifier: ~4.17.21 - version: 4.17.21 - monaco-editor: - specifier: ~0.52.2 - version: 0.52.2 - prismjs: - specifier: ^1.30.0 - version: 1.30.0 - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - react-hook-form: - specifier: 7.56.3 - version: 7.56.3(react@18.2.0) - devDependencies: - '@storybook/addon-docs': - specifier: ^9.0.12 - version: 9.0.12(@types/react@18.2.0)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/addon-essentials': - specifier: ^8.6.14 - version: 8.6.14(@types/react@18.2.0)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/cli': - specifier: ^9.0.12 - version: 9.0.17(@babel/preset-env@7.27.2(@babel/core@7.28.0))(@testing-library/dom@10.4.0)(prettier@3.6.2) - '@storybook/react': - specifier: ^9.0.12 - version: 9.0.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3) - '@storybook/react-vite': - specifier: ^9.0.12 - version: 9.0.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.44.0)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) - '@types/lodash': - specifier: ~4.17.16 - version: 4.17.17 - '@types/prismjs': - specifier: ^1.26.5 - version: 1.26.5 - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - 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) - '@typescript-eslint/parser': - specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.1)(typescript@5.8.3) - copyfiles: - specifier: ~2.4.1 - version: 2.4.1 - eslint: - specifier: ^8.57.1 - version: 8.57.1 - eslint-plugin-react: - specifier: ^7.37.5 - version: 7.37.5(eslint@8.57.1) - eslint-plugin-react-hooks: - specifier: ^5.2.0 - version: 5.2.0(eslint@8.57.1) - eslint-plugin-storybook: - specifier: ^9.0.12 - version: 9.0.12(eslint@8.57.1)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3) - gh-pages: - specifier: ^6.3.0 - version: 6.3.0 - glob: - specifier: ^11.0.2 - version: 11.0.3 - http-server: - specifier: ^14.1.1 - version: 14.1.1 - react-error-boundary: - specifier: ^6.0.0 - version: 6.0.0(react@18.2.0) - storybook: - specifier: ^9.0.12 - version: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - typescript: - specifier: 5.8.3 - version: 5.8.3 - - workspaces/mi/mi-component-diagram: - dependencies: - '@emotion/react': - specifier: ^11.9.3 - version: 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': - specifier: ^11.10.5 - version: 11.14.0(@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': - specifier: ^6.7.4 - version: 6.7.4 - '@projectstorm/react-canvas-core': - specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(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.0(@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': - specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(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.0(@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': - 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.0(@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) - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../../common-libs/ui-toolkit - dagre: - specifier: ~0.8.5 - version: 0.8.5 - lodash: - specifier: ~4.17.21 - version: 4.17.21 - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - devDependencies: - '@storybook/react': - specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.100.2))(webpack-hot-middleware@2.26.1) - '@types/dagre': - specifier: ~0.7.52 - version: 0.7.52 - '@types/lodash': - specifier: ~4.14.202 - version: 4.14.202 - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - specifier: 18.2.0 - version: 18.2.0 - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - typescript: - specifier: 5.8.3 - version: 5.8.3 - - workspaces/mi/mi-core: - dependencies: - '@types/vscode-webview': - specifier: ^1.57.5 - version: 1.57.5 - '@wso2/mi-syntax-tree': - specifier: workspace:* - version: link:../syntax-tree - vscode-languageserver-types: - specifier: ~3.17.5 - version: 3.17.5 - vscode-messenger-common: - specifier: ^0.5.1 - version: 0.5.1 - devDependencies: - '@eslint/eslintrc': - specifier: ~3.3.1 - version: 3.3.1 - '@eslint/js': - 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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - eslint: - specifier: ^9.27.0 - version: 9.27.0(jiti@2.4.2) - typescript: - specifier: 5.8.3 - version: 5.8.3 - - workspaces/mi/mi-data-mapper: - dependencies: - '@emotion/css': - specifier: ~11.13.5 - version: 11.13.5 - '@emotion/react': - specifier: ^11.14.0 - version: 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': - specifier: ^11.14.0 - version: 11.14.0(@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': - specifier: ^6.7.4 - version: 6.7.4 - '@projectstorm/react-canvas-core': - specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(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.0(@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': - specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(react@18.2.0)(resize-observer-polyfill@1.5.1) - '@tanstack/query-core': - specifier: ^5.76.2 - version: 5.81.2 - '@tanstack/react-query': - specifier: 5.76.2 - version: 5.76.2(react@18.2.0) - '@types/mousetrap': - specifier: ~1.6.15 - version: 1.6.15 - '@vscode/webview-ui-toolkit': - specifier: ^1.2.0 - version: 1.4.0(react@18.2.0) - '@wso2/mi-core': - specifier: workspace:* - version: link:../mi-core - '@wso2/mi-rpc-client': - specifier: workspace:* - version: link:../mi-rpc-client - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../../common-libs/ui-toolkit - ajv: - specifier: ~8.17.1 - version: 8.17.1 - ajv-formats: - specifier: ~3.0.1 - version: 3.0.1(ajv@8.17.1) - blueimp-md5: - specifier: ^2.19.0 - version: 2.19.0 - classnames: - specifier: ^2.5.1 - version: 2.5.1 - lodash: - specifier: ^4.17.21 - version: 4.17.21 - lodash.debounce: - specifier: ^4.0.8 - version: 4.0.8 - mousetrap: - specifier: ^1.6.5 - version: 1.6.5 - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - resize-observer-polyfill: - specifier: ^1.5.1 - version: 1.5.1 - vscode-languageserver-types: - specifier: ^3.17.5 - version: 3.17.5 - zustand: - specifier: ^5.0.5 - version: 5.0.5(@types/react@18.2.0)(immer@9.0.21)(react@18.2.0)(use-sync-external-store@1.5.0(react@18.2.0)) - devDependencies: - '@types/blueimp-md5': - specifier: ^2.18.2 - version: 2.18.2 - '@types/lodash': - specifier: 4.17.17 - version: 4.17.17 - '@types/lodash.debounce': - specifier: ^4.0.9 - version: 4.0.9 - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - 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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': - specifier: ~8.32.1 - version: 8.32.1(eslint@9.27.0(jiti@2.4.2))(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.100.2) - eslint: - specifier: ^9.27.0 - version: 9.27.0(jiti@2.4.2) - eslint-plugin-react-hooks: - specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.4.2)) - eslint-plugin-react-refresh: - specifier: ^0.4.20 - version: 0.4.20(eslint@9.27.0(jiti@2.4.2)) - file-loader: - specifier: ^6.2.0 - version: 6.2.0(webpack@5.100.2) - react-hook-form: - specifier: 7.56.4 - version: 7.56.4(react@18.2.0) - ts-loader: - specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) - ts-morph: - specifier: ^22.0.0 - version: 22.0.0 - tslib: - specifier: ^2.8.1 - version: 2.8.1 - tslint: - specifier: ^6.1.3 - version: 6.1.3(typescript@5.8.3) - tslint-react: - specifier: ^5.0.0 - version: 5.0.0(tslint@6.1.3(typescript@5.8.3))(typescript@5.8.3) - tslint-react-hooks: - specifier: ^2.2.2 - version: 2.2.2(tslint@6.1.3(typescript@5.8.3))(typescript@5.8.3) - typescript: - specifier: 5.8.3 - version: 5.8.3 - - workspaces/mi/mi-data-mapper-utils: {} - - workspaces/mi/mi-diagram: - dependencies: - '@emotion/css': - specifier: ^11.13.5 - version: 11.13.5 - '@emotion/react': - specifier: ~11.14.0 - version: 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': - specifier: ~11.14.0 - version: 11.14.0(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) - '@hookform/resolvers': - specifier: ^2.8.0 - version: 2.9.11(react-hook-form@7.56.4(react@18.2.0)) - '@projectstorm/geometry': - specifier: ^7.0.3 - version: 7.0.3 - '@projectstorm/react-canvas-core': - specifier: ^7.0.3 - version: 7.0.3(@types/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) - '@projectstorm/react-diagrams-core': - specifier: ^7.0.3 - version: 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': - specifier: ^7.1.3 - version: 7.1.3(@types/react@18.2.0) - '@projectstorm/react-diagrams-routing': - specifier: ^7.1.3 - version: 7.1.3(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) - '@types/lodash': - specifier: ~4.17.17 - version: 4.17.17 - '@types/mousetrap': - specifier: ~1.6.15 - version: 1.6.15 - '@types/mustache': - specifier: ~4.2.5 - version: 4.2.6 - '@types/node': - specifier: ~22.15.21 - version: 22.15.32 - '@vscode/webview-ui-toolkit': - specifier: ~1.4.0 - version: 1.4.0(react@18.2.0) - '@wso2/mi-core': - specifier: workspace:* - version: link:../mi-core - '@wso2/mi-rpc-client': - specifier: workspace:* - version: link:../mi-rpc-client - '@wso2/mi-syntax-tree': - specifier: workspace:* - version: link:../syntax-tree - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../../common-libs/ui-toolkit - copyfiles: - specifier: ~2.4.1 - version: 2.4.1 - eslint-plugin-react-hooks: - specifier: ~5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.4.2)) - 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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2)) - html-to-image: - specifier: 1.11.11 - version: 1.11.11 - lodash: - specifier: ~4.17.21 - version: 4.17.21 - mousetrap: - specifier: ~1.6.5 - version: 1.6.5 - mustache: - specifier: ~4.2.0 - version: 4.2.0 - path: - specifier: ~0.12.7 - version: 0.12.7 - react: - specifier: 18.2.0 - version: 18.2.0 - react-dnd: - specifier: 16.0.1 - version: 16.0.1(@types/hoist-non-react-statics@3.3.6)(@types/node@22.15.32)(@types/react@18.2.0)(react@18.2.0) - react-dnd-html5-backend: - specifier: 16.0.1 - version: 16.0.1 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - react-hook-form: - specifier: 7.56.4 - version: 7.56.4(react@18.2.0) - react-json-view: - specifier: latest - version: 1.21.3(@types/react@18.2.0)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react-json-view-lite: - specifier: latest - version: 2.4.1(react@18.2.0) - react-markdown: - specifier: ~10.1.0 - version: 10.1.0(@types/react@18.2.0)(react@18.2.0) - vscode-languageserver-types: - specifier: ~3.17.5 - version: 3.17.5 - xmlbuilder2: - specifier: ~3.1.1 - version: 3.1.1 - yup: - specifier: ~1.6.1 - version: 1.6.1 - devDependencies: - '@babel/core': - specifier: ~7.27.1 - version: 7.27.4 - '@babel/preset-env': - specifier: ~7.27.2 - version: 7.27.2(@babel/core@7.27.4) - '@storybook/addon-essentials': - specifier: ^8.6.14 - version: 8.6.14(@types/react@18.2.0)(storybook@8.6.14(prettier@3.6.2)) - '@storybook/addon-interactions': - specifier: ^8.6.14 - version: 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@storybook/addon-links': - specifier: ^8.6.14 - version: 8.6.14(react@18.2.0)(storybook@8.6.14(prettier@3.6.2)) - '@storybook/addon-onboarding': - specifier: ^8.6.14 - version: 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@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.6.2)) - '@storybook/react': - specifier: ^8.6.14 - version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.6.2)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.6.2))(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.6.2)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.6.2))(typescript@5.8.3) - '@storybook/test': - specifier: ^8.6.14 - version: 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@testing-library/dom': - specifier: ~10.4.0 - version: 10.4.0 - '@testing-library/jest-dom': - specifier: ~6.6.3 - version: 6.6.3 - '@testing-library/react': - specifier: ~16.3.0 - version: 16.3.0(@testing-library/dom@10.4.0)(@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 - '@types/jest': - specifier: 29.5.14 - version: 29.5.14 - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-test-renderer': - specifier: ~19.1.0 - version: 19.1.0 - '@types/xml2js': - 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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - babel-jest: - specifier: 29.7.0 - version: 29.7.0(@babel/core@7.27.4) - deep-equal: - specifier: ~2.2.3 - version: 2.2.3 - identity-obj-proxy: - specifier: ~3.0.0 - version: 3.0.0 - jest: - specifier: 29.7.0 - version: 29.7.0(@types/node@22.15.32)(babel-plugin-macros@3.1.0) - jest-environment-jsdom: - specifier: 29.7.0 - version: 29.7.0 - pretty-format: - specifier: ~29.7.0 - version: 29.7.0 - react-test-renderer: - specifier: ~19.1.0 - version: 19.1.0(react@18.2.0) - storybook: - specifier: ^8.6.14 - version: 8.6.14(prettier@3.6.2) - ts-jest: - specifier: 29.3.4 - version: 29.3.4(@babel/core@7.27.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.4))(jest@29.7.0(@types/node@22.15.32)(babel-plugin-macros@3.1.0))(typescript@5.8.3) - typescript: - specifier: 5.8.3 - version: 5.8.3 - vscode-jsonrpc: - specifier: ^8.2.1 - version: 8.2.1 - vscode-languageclient: - specifier: ^9.0.1 - version: 9.0.1 - vscode-languageserver-protocol: - specifier: ^3.17.5 - version: 3.17.5 - xml2js: - specifier: ~0.6.2 - version: 0.6.2 - - workspaces/mi/mi-extension: - dependencies: - '@apidevtools/json-schema-ref-parser': - specifier: 12.0.2 - version: 12.0.2 - '@babel/core': - specifier: ^7.27.1 - version: 7.27.4 - '@babel/plugin-transform-typescript': - specifier: ^7.27.1 - version: 7.27.1(@babel/core@7.27.4) - '@iarna/toml': - specifier: ^2.2.5 - version: 2.2.5 - '@types/fs-extra': - specifier: ~11.0.4 - version: 11.0.4 - '@types/json-schema': - specifier: 7.0.15 - version: 7.0.15 - '@types/lodash': - specifier: ~4.17.17 - version: 4.17.17 - '@types/mustache': - specifier: ~4.2.6 - version: 4.2.6 - '@types/tmp': - specifier: ~0.2.6 - version: 0.2.6 - '@types/xml2js': - specifier: ~0.4.12 - version: 0.4.14 - '@vscode/vsce': - specifier: ~3.4.2 - version: 3.4.2 - '@wso2/font-wso2-vscode': - specifier: workspace:* - version: link:../../common-libs/font-wso2-vscode - '@wso2/mi-core': - specifier: workspace:* - version: link:../mi-core - '@wso2/mi-diagram': - specifier: workspace:* - version: link:../mi-diagram - '@wso2/mi-rpc-client': - specifier: workspace:* - version: link:../mi-rpc-client - '@wso2/mi-syntax-tree': - specifier: workspace:* - version: link:../syntax-tree - '@wso2/playwright-vscode-tester': - specifier: workspace:* - version: link:../../common-libs/playwright-vscode-tester - adm-zip: - specifier: ~0.5.16 - version: 0.5.16 - axios: - specifier: ~1.9.0 - version: 1.9.0 - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - cors-anywhere: - specifier: ^0.4.4 - version: 0.4.4 - dotenv: - specifier: ~16.5.0 - version: 16.5.0 - fast-xml-parser: - specifier: ~5.2.3 - version: 5.2.5 - find-process: - specifier: ~1.4.10 - version: 1.4.10 - fs-extra: - specifier: ~11.3.0 - version: 11.3.0 - json-schema: - specifier: 0.4.0 - version: 0.4.0 - json-schema-to-ts: - specifier: 3.1.1 - version: 3.1.1 - jsonix: - specifier: ~3.0.0 - version: 3.0.0 - lodash: - specifier: ~4.17.21 - version: 4.17.21 - mustache: - specifier: ~4.2.0 - version: 4.2.0 - node-fetch: - specifier: ~3.3.2 - version: 3.3.2 - node-loader: - specifier: ~2.1.0 - version: 2.1.0(webpack@5.100.2) - portfinder: - specifier: ^1.0.37 - version: 1.0.37 - recast: - specifier: ^0.23.11 - version: 0.23.11 - tmp: - specifier: ~0.2.3 - version: 0.2.3 - to-json-schema: - specifier: 0.2.5 - version: 0.2.5 - tree-kill: - specifier: ~1.2.2 - version: 1.2.2 - unzipper: - specifier: ~0.12.3 - version: 0.12.3 - upath: - specifier: ~2.0.1 - version: 2.0.1 - uuid: - specifier: ~11.1.0 - version: 11.1.0 - vscode-debugadapter: - specifier: ^1.51.0 - version: 1.51.0 - vscode-debugprotocol: - specifier: ^1.51.0 - version: 1.51.0 - vscode-extension-tester: - specifier: ~8.14.1 - version: 8.14.1(mocha@11.7.0)(typescript@5.8.3) - vscode-languageclient: - specifier: ^9.0.1 - version: 9.0.1 - vscode-languageserver-protocol: - specifier: ^3.17.5 - version: 3.17.5 - vscode-messenger: - specifier: ^0.5.1 - version: 0.5.1 - vscode-messenger-common: - specifier: ^0.5.1 - version: 0.5.1 - xml2js: - specifier: 0.6.2 - version: 0.6.2 - xstate: - specifier: ^4.38.3 - version: 4.38.3 - devDependencies: - '@playwright/test': - specifier: ~1.52.0 - version: 1.52.0 - '@types/mocha': - specifier: ^10.0.1 - version: 10.0.10 - '@types/node': - specifier: 22.15.21 - version: 22.15.21 - '@types/vscode': - specifier: ^1.100.0 - version: 1.101.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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@vscode/test-electron': - specifier: ^2.5.2 - version: 2.5.2 - '@wso2/mi-data-mapper-utils': - specifier: workspace:* - version: link:../mi-data-mapper-utils - '@wso2/mi-visualizer': - specifier: workspace:* - version: link:../mi-visualizer - '@wso2/wso2-platform-core': - specifier: workspace:* - version: link:../../wso2-platform/wso2-platform-core - await-notify: - specifier: ^1.0.1 - version: 1.0.1 - eslint: - specifier: ^9.27.0 - version: 9.27.0(jiti@2.4.2) - glob: - specifier: ^11.0.2 - version: 11.0.3 - mocha: - specifier: ^11.4.0 - version: 11.7.0 - playwright-core: - specifier: ~1.52.0 - version: 1.52.0 - rimraf: - specifier: ~6.0.1 - version: 6.0.1 - ts-loader: - specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) - ts-morph: - specifier: ^26.0.0 - version: 26.0.0 - typescript: - specifier: 5.8.3 - version: 5.8.3 - webpack: - specifier: ^5.94.0 - version: 5.100.2(webpack-cli@4.10.0) - webpack-cli: - specifier: ^4.10.0 - version: 4.10.0(webpack@5.100.2) - yaml: - specifier: ~2.8.0 - version: 2.8.0 - - workspaces/mi/mi-rpc-client: - dependencies: - '@types/vscode-webview': - specifier: ^1.57.5 - version: 1.57.5 - '@wso2/mi-core': - specifier: workspace:* - version: link:../mi-core - '@wso2/mi-syntax-tree': - specifier: workspace:* - version: link:../syntax-tree - react: - specifier: 19.1.0 - version: 19.1.0 - react-dom: - specifier: 19.1.0 - version: 19.1.0(react@19.1.0) - vscode-messenger-common: - specifier: ^0.5.1 - version: 0.5.1 - vscode-messenger-webview: - specifier: ^0.5.1 - version: 0.5.1 - devDependencies: - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - 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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - eslint: - specifier: ^9.27.0 - version: 9.27.0(jiti@2.4.2) - typescript: - specifier: 5.8.3 - version: 5.8.3 - - workspaces/mi/mi-visualizer: - dependencies: - '@codemirror/lang-xml': - specifier: ~6.1.0 - version: 6.1.0 - '@codemirror/lint': - specifier: ~6.8.5 - version: 6.8.5 - '@codemirror/theme-one-dark': - specifier: ~6.1.2 - version: 6.1.3 - '@emotion/css': - specifier: ^11.13.5 - version: 11.13.5 - '@emotion/react': - specifier: ^11.14.0 - version: 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': - specifier: ^11.14.0 - version: 11.14.0(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) - '@hookform/resolvers': - specifier: ^2.8.0 - version: 2.9.11(react-hook-form@7.56.4(react@18.2.0)) - '@playwright/test': - specifier: 1.52.0 - version: 1.52.0 - '@pmmmwh/react-refresh-webpack-plugin': - specifier: ~0.6.0 - version: 0.6.0(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.17.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.100.2) - '@tanstack/query-core': - specifier: ^5.76.0 - version: 5.81.2 - '@tanstack/react-query': - specifier: 5.76.1 - version: 5.76.1(react@18.2.0) - '@types/react-collapse': - specifier: ~5.0.4 - version: 5.0.4 - '@types/react-split-pane': - specifier: ~0.1.67 - version: 0.1.67(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@types/react-syntax-highlighter': - specifier: ~15.5.13 - version: 15.5.13 - '@types/swagger-ui-react': - specifier: ^5.18.0 - version: 5.18.0 - '@types/uuid': - specifier: ~10.0.0 - version: 10.0.0 - '@types/vscode-webview': - specifier: ^1.57.5 - version: 1.57.5 - '@uiw/react-codemirror': - specifier: ~4.23.12 - version: 4.23.13(@babel/runtime@7.27.6)(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.11.1)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.37.2)(codemirror@5.65.19)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@vscode/webview-ui-toolkit': - specifier: ^1.4.0 - version: 1.4.0(react@18.2.0) - '@wso2/mi-component-diagram': - specifier: workspace:* - version: link:../mi-component-diagram - '@wso2/mi-core': - specifier: workspace:* - version: link:../mi-core - '@wso2/mi-data-mapper': - specifier: workspace:* - version: link:../mi-data-mapper - '@wso2/mi-diagram': - specifier: workspace:* - version: link:../mi-diagram - '@wso2/mi-rpc-client': - specifier: workspace:* - version: link:../mi-rpc-client - '@wso2/mi-syntax-tree': - specifier: workspace:* - version: link:../syntax-tree - '@wso2/service-designer': - specifier: workspace:* - version: link:../../common-libs/service-designer - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../../common-libs/ui-toolkit - '@wso2/wso2-platform-core': - specifier: workspace:* - version: link:../../wso2-platform/wso2-platform-core - cron-expression-validator: - specifier: ~1.0.20 - version: 1.0.20 - fast-xml-parser: - specifier: ~5.2.3 - version: 5.2.5 - lodash: - specifier: ~4.17.21 - version: 4.17.21 - mustache: - specifier: ~4.2.0 - version: 4.2.0 - path: - specifier: ~0.12.7 - version: 0.12.7 - process: - specifier: ~0.11.10 - version: 0.11.10 - react: - specifier: 18.2.0 - version: 18.2.0 - react-collapse: - specifier: ~5.1.1 - version: 5.1.1(react@18.2.0) - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - react-hook-form: - specifier: 7.56.4 - version: 7.56.4(react@18.2.0) - react-hot-loader: - specifier: ~4.13.1 - version: 4.13.1(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react-markdown: - specifier: ~10.1.0 - version: 10.1.0(@types/react@18.2.0)(react@18.2.0) - react-split-pane: - specifier: ~0.1.92 - version: 0.1.92(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react-syntax-highlighter: - specifier: ~15.6.1 - version: 15.6.1(react@18.2.0) - swagger-ui-react: - specifier: 5.21.0 - version: 5.21.0(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - upath: - specifier: ~2.0.1 - version: 2.0.1 - uuid: - specifier: ~11.1.0 - version: 11.1.0 - xmlbuilder2: - specifier: ~3.1.1 - version: 3.1.1 - yup: - specifier: ~1.6.1 - version: 1.6.1 - devDependencies: - '@babel/plugin-syntax-flow': - specifier: ~7.27.1 - version: 7.27.1(@babel/core@7.28.0) - '@babel/preset-typescript': - specifier: ~7.27.1 - version: 7.27.1(@babel/core@7.28.0) - '@headlessui/react': - specifier: ~2.2.4 - version: 2.2.4(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@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/addon-essentials': - specifier: ~8.6.14 - version: 8.6.14(@types/react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/addon-links': - specifier: ~8.6.14 - version: 8.6.14(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/react-webpack5': - specifier: ~8.6.14 - version: 8.6.14(@storybook/test@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3)(webpack-cli@5.1.4) - '@types/lodash': - specifier: ~4.17.17 - version: 4.17.17 - '@types/mustache': - specifier: ~4.2.6 - version: 4.2.6 - '@types/node': - specifier: ^22.15.21 - version: 22.15.32 - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - specifier: 18.2.0 - version: 18.2.0 - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - css-loader: - specifier: ^7.1.2 - version: 7.1.2(webpack@5.100.2) - sass-loader: - specifier: ^16.0.5 - version: 16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.100.2) - source-map-loader: - specifier: ^5.0.0 - version: 5.0.0(webpack@5.100.2) - style-loader: - specifier: ^4.0.0 - version: 4.0.0(webpack@5.100.2) - ts-loader: - specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) - typescript: - specifier: 5.8.3 - version: 5.8.3 - vscode-languageserver-types: - specifier: ~3.17.5 - version: 3.17.5 - webpack: - specifier: ^5.94.0 - version: 5.100.2(webpack-cli@5.1.4) - webpack-cli: - specifier: ~5.1.4 - version: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.100.2) - webpack-dev-server: - specifier: ^5.2.1 - version: 5.2.2(webpack-cli@5.1.4)(webpack@5.100.2) - yaml: - specifier: ~2.8.0 - version: 2.8.0 - - workspaces/mi/syntax-tree: - dependencies: - '@types/node': - specifier: ~22.15.21 - version: 22.15.32 - eslint: - specifier: ~9.27.0 - version: 9.27.0(jiti@2.4.2) - jsonix: - specifier: ~3.0.0 - version: 3.0.0 - tslint: - specifier: ~6.1.3 - version: 6.1.3(typescript@5.8.3) - vscode-languageserver-types: - specifier: ~3.17.5 - version: 3.17.5 - devDependencies: - '@size-limit/preset-small-lib': - 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@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - eslint-plugin-react-hooks: - specifier: ~5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.4.2)) - eslint-plugin-unused-imports: - specifier: ~4.1.4 - version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2)) - husky: - specifier: ^9.1.7 - version: 9.1.7 - rimraf: - specifier: ^6.0.1 - version: 6.0.1 - size-limit: - specifier: ^11.2.0 - version: 11.2.0 - tsdx: - specifier: ^0.14.1 - version: 0.14.1(@types/babel__core@7.20.5)(@types/node@22.15.32) - tslib: - specifier: ^2.5.0 - version: 2.8.1 - typescript: - specifier: 5.8.3 - version: 5.8.3 - - workspaces/wso2-platform/wso2-platform-core: - dependencies: - vscode-messenger-common: - specifier: ^0.5.1 - version: 0.5.1 - vscode-messenger-webview: - specifier: ^0.5.1 - version: 0.5.1 - devDependencies: - '@biomejs/biome': - specifier: ^1.9.4 - version: 1.9.4 - typescript: - specifier: 5.8.3 - version: 5.8.3 - - workspaces/wso2-platform/wso2-platform-extension: - dependencies: - '@aws-sdk/client-s3': - specifier: ^3.817.0 - version: 3.832.0 - '@vscode-logging/logger': - specifier: ^2.0.0 - version: 2.0.0 - '@vscode-logging/types': - specifier: ^2.0.0 - version: 2.0.0 - '@vscode-logging/wrapper': - specifier: ^2.0.0 - version: 2.0.0 - '@vscode/extension-telemetry': - specifier: ~1.0.0 - version: 1.0.0(tslib@2.8.1) - '@vscode/iconv-lite-umd': - specifier: ^0.7.0 - version: 0.7.0 - '@vscode/webview-ui-toolkit': - specifier: ^1.4.0 - version: 1.4.0(react@19.1.0) - '@wso2/wso2-platform-core': - specifier: workspace:* - version: link:../wso2-platform-core - '@wso2/wso2-platform-vscode-webviews': - specifier: workspace:* - version: link:../wso2-platform-webviews - byline: - specifier: ^5.0.0 - version: 5.0.0 - dotenv: - specifier: ^16.0.3 - version: 16.3.2 - file-type: - specifier: ^18.2.1 - version: 18.7.0 - js-yaml: - specifier: ^4.1.0 - version: 4.1.0 - jschardet: - specifier: ^3.1.4 - version: 3.1.4 - vscode-jsonrpc: - specifier: ^8.2.1 - version: 8.2.1 - vscode-messenger: - specifier: ^0.5.1 - version: 0.5.1 - vscode-messenger-common: - specifier: ^0.5.1 - version: 0.5.1 - which: - specifier: ^5.0.0 - version: 5.0.0 - yaml: - specifier: ^2.8.0 - version: 2.8.0 - zod: - specifier: ^3.22.4 - version: 3.25.76 - zustand: - specifier: ^5.0.5 - version: 5.0.5(@types/react@18.2.0)(immer@9.0.21)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)) - devDependencies: - '@biomejs/biome': - specifier: ^1.9.4 - version: 1.9.4 - '@playwright/test': - specifier: 1.52.0 - version: 1.52.0 - '@types/byline': - specifier: ^4.2.36 - version: 4.2.36 - '@types/js-yaml': - specifier: ^4.0.9 - version: 4.0.9 - '@types/mocha': - specifier: ~10.0.1 - version: 10.0.10 - '@types/node': - specifier: ^22.15.21 - version: 22.15.32 - '@types/vscode': - specifier: ^1.100.0 - version: 1.101.0 - '@types/which': - specifier: ^3.0.4 - version: 3.0.4 - '@vscode/vsce': - specifier: ^3.4.2 - version: 3.4.2 - '@wso2/playwright-vscode-tester': - specifier: workspace:* - version: link:../../common-libs/playwright-vscode-tester - axios: - specifier: ^1.9.0 - version: 1.9.0 - copy-webpack-plugin: - specifier: ^13.0.0 - version: 13.0.0(webpack@5.100.2) - copyfiles: - specifier: ^2.4.1 - version: 2.4.1 - del-cli: - specifier: ^6.0.0 - version: 6.0.0 - mocha: - specifier: ^11.5.0 - version: 11.7.0 - terser-webpack-plugin: - specifier: ^5.3.14 - version: 5.3.14(webpack@5.100.2) - ts-loader: - specifier: ~9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) - typescript: - specifier: ^5.8.3 - version: 5.8.3 - vscode-extension-tester: - specifier: ^8.14.1 - version: 8.14.1(mocha@11.7.0)(typescript@5.8.3) - webpack: - specifier: ^5.94.0 - version: 5.100.2(webpack-cli@6.0.1) - webpack-cli: - specifier: ^6.0.1 - version: 6.0.1(webpack@5.100.2) - webpack-permissions-plugin: - specifier: ^1.0.10 - version: 1.0.10 - - workspaces/wso2-platform/wso2-platform-webviews: - dependencies: - '@biomejs/biome': - specifier: ^1.9.4 - version: 1.9.4 - '@formkit/auto-animate': - specifier: 0.8.2 - version: 0.8.2 - '@headlessui/react': - specifier: ^2.1.2 - version: 2.2.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@hookform/resolvers': - specifier: ^5.0.1 - version: 5.0.1(react-hook-form@7.56.4(react@18.2.0)) - '@tanstack/react-query': - specifier: ~4.28.0 - version: 4.28.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@tanstack/react-query-persist-client': - specifier: ~4.28.0 - version: 4.28.0(@tanstack/react-query@4.28.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)) - '@vscode/webview-ui-toolkit': - specifier: ^1.4.0 - version: 1.4.0(react@18.2.0) - '@wso2/ui-toolkit': - specifier: workspace:* - version: link:../../common-libs/ui-toolkit - '@wso2/wso2-platform-core': - specifier: workspace:* - version: link:../wso2-platform-core - classnames: - specifier: ~2.5.1 - version: 2.5.1 - clipboardy: - specifier: ^4.0.0 - version: 4.0.0 - js-yaml: - specifier: ^4.1.0 - version: 4.1.0 - lodash.debounce: - specifier: ~4.0.8 - version: 4.0.8 - prism-react-renderer: - specifier: ^2.4.1 - version: 2.4.1(react@18.2.0) - react: - specifier: 18.2.0 - version: 18.2.0 - react-dom: - specifier: 18.2.0 - version: 18.2.0(react@18.2.0) - react-hook-form: - specifier: 7.56.4 - version: 7.56.4(react@18.2.0) - react-markdown: - specifier: ^7.1.0 - version: 7.1.2(@types/react@18.2.0)(react@18.2.0) - rehype-raw: - specifier: ^6.1.0 - version: 6.1.1 - remark-gfm: - specifier: ^4.0.1 - version: 4.0.1 - swagger-ui-react: - specifier: ^5.22.0 - version: 5.25.2(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - timezone-support: - specifier: ^3.1.0 - version: 3.1.0 - vscode-messenger-common: - specifier: ^0.5.1 - version: 0.5.1 - vscode-messenger-webview: - specifier: ^0.5.1 - version: 0.5.1 - zod: - specifier: ^3.22.4 - version: 3.25.67 - devDependencies: - '@types/js-yaml': - specifier: ^4.0.5 - version: 4.0.9 - '@types/lodash.debounce': - specifier: ^4.0.6 - version: 4.0.9 - '@types/node': - specifier: ^22.15.21 - version: 22.15.32 - '@types/react': - specifier: 18.2.0 - version: 18.2.0 - '@types/react-dom': - specifier: 18.2.0 - version: 18.2.0 - '@types/swagger-ui-react': - specifier: ^5.18.0 - version: 5.18.0 - '@types/vscode-webview': - specifier: ^1.57.5 - version: 1.57.5 - autoprefixer: - specifier: ^10.4.19 - version: 10.4.21(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.100.2) - file-loader: - specifier: ^6.2.0 - version: 6.2.0(webpack@5.100.2) - node-sass: - specifier: ^9.0.0 - version: 9.0.0 - path: - specifier: ^0.12.7 - version: 0.12.7 - postcss: - specifier: ^8.5.3 - version: 8.5.6 - postcss-loader: - specifier: ^8.1.1 - version: 8.1.1(postcss@8.5.6)(typescript@5.8.3)(webpack@5.100.2) - sass-loader: - specifier: ^16.0.5 - version: 16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.100.2) - source-map-loader: - specifier: ^5.0.0 - version: 5.0.0(webpack@5.100.2) - style-loader: - specifier: ^4.0.0 - version: 4.0.0(webpack@5.100.2) - tailwindcss: - specifier: ^4.1.7 - version: 4.1.10 - ts-loader: - specifier: ^9.5.2 - version: 9.5.2(typescript@5.8.3)(webpack@5.100.2) - typescript: - specifier: 5.8.3 - version: 5.8.3 - webpack: - specifier: ^5.94.0 - version: 5.100.2(webpack-cli@6.0.1) - webpack-cli: - specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2) - webpack-dev-server: - specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) - -packages: - - '@adobe/css-tools@4.4.3': - resolution: {integrity: sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==} - - '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - - '@apidevtools/json-schema-ref-parser@12.0.2': - resolution: {integrity: sha512-SoZWqQz4YMKdw4kEMfG5w6QAy+rntjsoAT1FtvZAnVEnCR4uy9YSuDBNoVAFHgzSz0dJbISLLCSrGR2Zd7bcvA==} - engines: {node: '>= 16'} - - '@aw-web-design/x-default-browser@1.4.126': - resolution: {integrity: sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==} - hasBin: true - - '@aws-crypto/crc32@5.2.0': - resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} - engines: {node: '>=16.0.0'} - - '@aws-crypto/crc32c@5.2.0': - resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} - - '@aws-crypto/sha1-browser@5.2.0': - resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} - - '@aws-crypto/sha256-browser@5.2.0': - resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} - - '@aws-crypto/sha256-js@5.2.0': - resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} - engines: {node: '>=16.0.0'} - - '@aws-crypto/supports-web-crypto@5.2.0': - resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} - - '@aws-crypto/util@5.2.0': - resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - - '@aws-sdk/client-s3@3.832.0': - resolution: {integrity: sha512-S+md1zCe71SEuaRDuLHq4mzhYYkVxR1ENa8NwrgInfYoC4xo8/pESoR6i0ZZpcLs0Jw4EyVInWYs4GgDHW70qQ==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/client-sso@3.830.0': - resolution: {integrity: sha512-5zCEpfI+zwX2SIa258L+TItNbBoAvQQ6w74qdFM6YJufQ1F9tvwjTX8T+eSTT9nsFIvfYnUaGalWwJVfmJUgVQ==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/core@3.826.0': - resolution: {integrity: sha512-BGbQYzWj3ps+dblq33FY5tz/SsgJCcXX0zjQlSC07tYvU1jHTUvsefphyig+fY38xZ4wdKjbTop+KUmXUYrOXw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-env@3.826.0': - resolution: {integrity: sha512-DK3pQY8+iKK3MGDdC3uOZQ2psU01obaKlTYhEwNu4VWzgwQL4Vi3sWj4xSWGEK41vqZxiRLq6fOq7ysRI+qEZA==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-http@3.826.0': - resolution: {integrity: sha512-N+IVZBh+yx/9GbMZTKO/gErBi/FYZQtcFRItoLbY+6WU+0cSWyZYfkoeOxHmQV3iX9k65oljERIWUmL9x6OSQg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-ini@3.830.0': - resolution: {integrity: sha512-zeQenzvh8JRY5nULd8izdjVGoCM1tgsVVsrLSwDkHxZTTW0hW/bmOmXfvdaE0wDdomXW7m2CkQDSmP7XdvNXZg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-node@3.830.0': - resolution: {integrity: sha512-X/2LrTgwtK1pkWrvofxQBI8VTi6QVLtSMpsKKPPnJQ0vgqC0e4czSIs3ZxiEsOkCBaQ2usXSiKyh0ccsQ6k2OA==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-process@3.826.0': - resolution: {integrity: sha512-kURrc4amu3NLtw1yZw7EoLNEVhmOMRUTs+chaNcmS+ERm3yK0nKjaJzmKahmwlTQTSl3wJ8jjK7x962VPo+zWw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-sso@3.830.0': - resolution: {integrity: sha512-+VdRpZmfekzpySqZikAKx6l5ndnLGluioIgUG4ZznrButgFD/iogzFtGmBDFB3ZLViX1l4pMXru0zFwJEZT21Q==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/credential-provider-web-identity@3.830.0': - resolution: {integrity: sha512-hPYrKsZeeOdLROJ59T6Y8yZ0iwC/60L3qhZXjapBFjbqBtMaQiMTI645K6xVXBioA6vxXq7B4aLOhYqk6Fy/Ww==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-bucket-endpoint@3.830.0': - resolution: {integrity: sha512-ElVeCReZSH5Ds+/pkL5ebneJjuo8f49e9JXV1cYizuH0OAOQfYaBU9+M+7+rn61pTttOFE8W//qKzrXBBJhfMg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-expect-continue@3.821.0': - resolution: {integrity: sha512-zAOoSZKe1njOrtynvK6ZORU57YGv5I7KP4+rwOvUN3ZhJbQ7QPf8gKtFUCYAPRMegaXCKF/ADPtDZBAmM+zZ9g==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-flexible-checksums@3.826.0': - resolution: {integrity: sha512-Fz9w8CFYPfSlHEB6feSsi06hdS+s+FB8k5pO4L7IV0tUa78mlhxF/VNlAJaVWYyOkZXl4HPH2K48aapACSQOXw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-host-header@3.821.0': - resolution: {integrity: sha512-xSMR+sopSeWGx5/4pAGhhfMvGBHioVBbqGvDs6pG64xfNwM5vq5s5v6D04e2i+uSTj4qGa71dLUs5I0UzAK3sw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-location-constraint@3.821.0': - resolution: {integrity: sha512-sKrm80k0t3R0on8aA/WhWFoMaAl4yvdk+riotmMElLUpcMcRXAd1+600uFVrxJqZdbrKQ0mjX0PjT68DlkYXLg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-logger@3.821.0': - resolution: {integrity: sha512-0cvI0ipf2tGx7fXYEEN5fBeZDz2RnHyb9xftSgUsEq7NBxjV0yTZfLJw6Za5rjE6snC80dRN8+bTNR1tuG89zA==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-recursion-detection@3.821.0': - resolution: {integrity: sha512-efmaifbhBoqKG3bAoEfDdcM8hn1psF+4qa7ykWuYmfmah59JBeqHLfz5W9m9JoTwoKPkFcVLWZxnyZzAnVBOIg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-sdk-s3@3.826.0': - resolution: {integrity: sha512-8F0qWaYKfvD/de1AKccXuigM+gb/IZSncCqxdnFWqd+TFzo9qI9Hh+TpUhWOMYSgxsMsYQ8ipmLzlD/lDhjrmA==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-ssec@3.821.0': - resolution: {integrity: sha512-YYi1Hhr2AYiU/24cQc8HIB+SWbQo6FBkMYojVuz/zgrtkFmALxENGF/21OPg7f/QWd+eadZJRxCjmRwh5F2Cxg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/middleware-user-agent@3.828.0': - resolution: {integrity: sha512-nixvI/SETXRdmrVab4D9LvXT3lrXkwAWGWk2GVvQvzlqN1/M/RfClj+o37Sn4FqRkGH9o9g7Fqb1YqZ4mqDAtA==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/nested-clients@3.830.0': - resolution: {integrity: sha512-5N5YTlBr1vtxf7+t+UaIQ625KEAmm7fY9o1e3MgGOi/paBoI0+axr3ud24qLIy0NSzFlAHEaxUSWxcERNjIoZw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/region-config-resolver@3.821.0': - resolution: {integrity: sha512-t8og+lRCIIy5nlId0bScNpCkif8sc0LhmtaKsbm0ZPm3sCa/WhCbSZibjbZ28FNjVCV+p0D9RYZx0VDDbtWyjw==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/signature-v4-multi-region@3.826.0': - resolution: {integrity: sha512-3fEi/zy6tpMzomYosksGtu7jZqGFcdBXoL7YRsG7OEeQzBbOW9B+fVaQZ4jnsViSjzA/yKydLahMrfPnt+iaxg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/token-providers@3.830.0': - resolution: {integrity: sha512-aJ4guFwj92nV9D+EgJPaCFKK0I3y2uMchiDfh69Zqnmwfxxxfxat6F79VA7PS0BdbjRfhLbn+Ghjftnomu2c1g==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/types@3.821.0': - resolution: {integrity: sha512-Znroqdai1a90TlxGaJ+FK1lwC0fHpo97Xjsp5UKGR5JODYm7f9+/fF17ebO1KdoBr/Rm0UIFiF5VmI8ts9F1eA==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/util-arn-parser@3.804.0': - resolution: {integrity: sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/util-endpoints@3.828.0': - resolution: {integrity: sha512-RvKch111SblqdkPzg3oCIdlGxlQs+k+P7Etory9FmxPHyPDvsP1j1c74PmgYqtzzMWmoXTjd+c9naUHh9xG8xg==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/util-locate-window@3.804.0': - resolution: {integrity: sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==} - engines: {node: '>=18.0.0'} - - '@aws-sdk/util-user-agent-browser@3.821.0': - resolution: {integrity: sha512-irWZHyM0Jr1xhC+38OuZ7JB6OXMLPZlj48thElpsO1ZSLRkLZx5+I7VV6k3sp2yZ7BYbKz/G2ojSv4wdm7XTLw==} - - '@aws-sdk/util-user-agent-node@3.828.0': - resolution: {integrity: sha512-LdN6fTBzTlQmc8O8f1wiZN0qF3yBWVGis7NwpWK7FUEzP9bEZRxYfIkV9oV9zpt6iNRze1SedK3JQVB/udxBoA==} - engines: {node: '>=18.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true - - '@aws-sdk/xml-builder@3.821.0': - resolution: {integrity: sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==} - engines: {node: '>=18.0.0'} - - '@azu/format-text@1.0.2': - resolution: {integrity: sha512-Swi4N7Edy1Eqq82GxgEECXSSLyn6GOb5htRFPzBDdUkECGXtlf12ynO5oJSpWKPwCaUssOu7NfhDcCWpIC6Ywg==} - - '@azu/style-format@1.0.1': - resolution: {integrity: sha512-AHcTojlNBdD/3/KxIKlg8sxIWHfOtQszLvOpagLTO+bjC3u7SAszu1lf//u7JJC50aUSH+BVWDD/KvaA6Gfn5g==} - - '@azure/abort-controller@2.1.2': - resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} - engines: {node: '>=18.0.0'} - - '@azure/core-auth@1.9.0': - resolution: {integrity: sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==} - engines: {node: '>=18.0.0'} - - '@azure/core-client@1.9.4': - resolution: {integrity: sha512-f7IxTD15Qdux30s2qFARH+JxgwxWLG2Rlr4oSkPGuLWm+1p5y1+C04XGLA0vmX6EtqfutmjvpNmAfgwVIS5hpw==} - engines: {node: '>=18.0.0'} - - '@azure/core-rest-pipeline@1.21.0': - resolution: {integrity: sha512-a4MBwe/5WKbq9MIxikzgxLBbruC5qlkFYlBdI7Ev50Y7ib5Vo/Jvt5jnJo7NaWeJ908LCHL0S1Us4UMf1VoTfg==} - engines: {node: '>=18.0.0'} - - '@azure/core-tracing@1.2.0': - resolution: {integrity: sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==} - engines: {node: '>=18.0.0'} - - '@azure/core-util@1.12.0': - resolution: {integrity: sha512-13IyjTQgABPARvG90+N2dXpC+hwp466XCdQXPCRlbWHgd3SJd5Q1VvaBGv6k1BIa4MQm6hAF1UBU1m8QUxV8sQ==} - engines: {node: '>=18.0.0'} - - '@azure/identity@4.10.1': - resolution: {integrity: sha512-YM/z6RxRtFlXUH2egAYF/FDPes+MUE6ZoknjEdaq7ebJMMNUzn9zCJ3bd2ZZZlkP0r1xKa88kolhFH/FGV7JnA==} - engines: {node: '>=18.0.0'} - - '@azure/logger@1.2.0': - resolution: {integrity: sha512-0hKEzLhpw+ZTAfNJyRrn6s+V0nDWzXk9OjBr2TiGIu0OfMr5s2V4FpKLTAK3Ca5r5OKLbf4hkOGDPyiRjie/jA==} - engines: {node: '>=18.0.0'} - - '@azure/msal-browser@4.13.2': - resolution: {integrity: sha512-lS75bF6FYZRwsacKLXc8UYu/jb+gOB7dtZq5938chCvV/zKTFDnzuXxCXhsSUh0p8s/P8ztgbfdueD9lFARQlQ==} - engines: {node: '>=0.8.0'} - - '@azure/msal-common@15.7.1': - resolution: {integrity: sha512-a0eowoYfRfKZEjbiCoA5bPT3IlWRAdGSvi63OU23Hv+X6EI8gbvXCoeqokUceFMoT9NfRUWTJSx5FiuzruqT8g==} - engines: {node: '>=0.8.0'} - - '@azure/msal-node@3.6.1': - resolution: {integrity: sha512-ctcVz4xS+st5KxOlQqgpvA+uDFAa59CvkmumnuhlD2XmNczloKBdCiMQG7/TigSlaeHe01qoOlDjz3TyUAmKUg==} - engines: {node: '>=16'} - - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.27.5': - resolution: {integrity: sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.12.9': - resolution: {integrity: sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.27.4': - resolution: {integrity: sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.28.0': - resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.27.5': - resolution: {integrity: sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.28.0': - resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} - 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==} - engines: {node: '>=6.9.0'} - - '@babel/helper-create-class-features-plugin@7.27.1': - resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-create-regexp-features-plugin@7.27.1': - resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-define-polyfill-provider@0.0.3': - resolution: {integrity: sha512-dULDd/APiP4JowYDAMosecKOi/1v+UId99qhBGiO3myM29KtAVKS/R3x3OJJNBR0FeYB1BcYb2dCwkhqvxWXXQ==} - peerDependencies: - '@babel/core': ^7.4.0-0 - - '@babel/helper-define-polyfill-provider@0.1.5': - resolution: {integrity: sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==} - peerDependencies: - '@babel/core': ^7.4.0-0 - - '@babel/helper-define-polyfill-provider@0.6.4': - resolution: {integrity: sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-member-expression-to-functions@7.27.1': - resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.27.3': - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} - engines: {node: '>=6.9.0'} - - '@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==} - engines: {node: '>=6.9.0'} - - '@babel/helper-remap-async-to-generator@7.27.1': - resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-replace-supers@7.27.1': - resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-wrap-function@7.27.1': - resolution: {integrity: sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.27.6': - resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.27.5': - resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/parser@7.28.0': - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': - resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': - resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': - resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': - resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1': - resolution: {integrity: sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-proposal-class-properties@7.18.6': - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-decorators@7.27.1': - resolution: {integrity: sha512-DTxe4LBPrtFdsWzgpmbBKevg3e9PBy+dXRt19kSbucbZvL2uqtdqwwpluL1jfxYE0wIDTFp1nTy/q6gNLsxXrg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-export-default-from@7.27.1': - resolution: {integrity: sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6': - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-object-rest-spread@7.12.1': - resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-object-rest-spread@7.20.7': - resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-optional-chaining@7.21.0': - resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-private-methods@7.18.6': - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-proposal-private-property-in-object@7.21.11': - resolution: {integrity: sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==} - engines: {node: '>=6.9.0'} - deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead. - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-async-generators@7.8.4': - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-bigint@7.8.3': - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-properties@7.12.13': - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-static-block@7.14.5': - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-decorators@7.27.1': - resolution: {integrity: sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-dynamic-import@7.8.3': - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-flow@7.27.1': - resolution: {integrity: sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-assertions@7.27.1': - resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} - 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==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-json-strings@7.8.3': - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-jsx@7.12.1': - resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-jsx@7.27.1': - resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-private-property-in-object@7.14.5': - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-typescript@7.27.1': - resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-arrow-functions@7.27.1': - resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-async-generator-functions@7.27.1': - resolution: {integrity: sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==} - 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==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-block-scoped-functions@7.27.1': - resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-block-scoping@7.27.5': - resolution: {integrity: sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ==} - 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==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-class-static-block@7.27.1': - resolution: {integrity: sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - - '@babel/plugin-transform-classes@7.27.1': - resolution: {integrity: sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==} - 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==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-destructuring@7.27.3': - resolution: {integrity: sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-dotall-regex@7.27.1': - resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-duplicate-keys@7.27.1': - resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-dynamic-import@7.27.1': - resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-exponentiation-operator@7.27.1': - resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-export-namespace-from@7.27.1': - resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-flow-strip-types@7.27.1': - resolution: {integrity: sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-for-of@7.27.1': - resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-function-name@7.27.1': - resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-json-strings@7.27.1': - resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-literals@7.27.1': - resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-logical-assignment-operators@7.27.1': - resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-member-expression-literals@7.27.1': - resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-amd@7.27.1': - resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-commonjs@7.27.1': - resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-systemjs@7.27.1': - resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-umd@7.27.1': - resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-new-target@7.27.1': - resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': - resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} - 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==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-rest-spread@7.27.3': - resolution: {integrity: sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-super@7.27.1': - resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-catch-binding@7.27.1': - resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-chaining@7.27.1': - resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-parameters@7.27.1': - resolution: {integrity: sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-methods@7.27.1': - resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} - 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==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-property-literals@7.27.1': - resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-display-name@7.27.1': - resolution: {integrity: sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-development@7.27.1': - resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-self@7.27.1': - resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-source@7.27.1': - resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx@7.27.1': - resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-pure-annotations@7.27.1': - resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regenerator@7.27.5': - resolution: {integrity: sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q==} - 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==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-reserved-words@7.27.1': - resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-shorthand-properties@7.27.1': - resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-spread@7.27.1': - resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-sticky-regex@7.27.1': - resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-template-literals@7.27.1': - resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typeof-symbol@7.27.1': - resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typescript@7.27.1': - resolution: {integrity: sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-escapes@7.27.1': - resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-property-regex@7.27.1': - resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-regex@7.27.1': - resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-sets-regex@7.27.1': - resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/preset-env@7.27.2': - resolution: {integrity: sha512-Ma4zSuYSlGNRlCLO+EAzLnCmJK2vdstgv+n7aUP+/IKZrOfWHOJVdSJtuub8RzHTj3ahD37k5OKJWvzf16TQyQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-flow@7.27.1': - resolution: {integrity: sha512-ez3a2it5Fn6P54W8QkbfIyyIbxlXvcxyWHHvno1Wg0Ej5eiJY5hBb8ExttoIOJJk7V2dZE6prP7iby5q2aQ0Lg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-modules@0.1.6-no-external-plugins': - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - - '@babel/preset-react@7.27.1': - resolution: {integrity: sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-typescript@7.27.1': - resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/register@7.27.1': - resolution: {integrity: sha512-K13lQpoV54LATKkzBpBAEu1GGSIRzxR9f4IN4V8DCDgiUMo2UDGagEZr3lPeVNJPLkWUi5JE4hCHKneVTwQlYQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/runtime-corejs3@7.27.6': - resolution: {integrity: sha512-vDVrlmRAY8z9Ul/HxT+8ceAru95LQgkSKiXkSYZvqtbkPSfhZJgpRp45Cldbh1GJ1kxzQkI70AqyrTI58KpaWQ==} - engines: {node: '>=6.9.0'} - - '@babel/runtime@7.27.6': - resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.27.4': - resolution: {integrity: sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.28.0': - resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.27.6': - resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.28.1': - resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} - engines: {node: '>=6.9.0'} - - '@base2/pretty-print-object@1.0.1': - resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} - - '@bazel/runfiles@6.3.1': - resolution: {integrity: sha512-1uLNT5NZsUVIGS4syuHwTzZ8HycMPyr6POA3FCE4GbMtc4rhoJk8aZKtNIRthJYfL+iioppi+rTfH3olMPr9nA==} - - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - - '@bcoe/v8-coverage@1.0.2': - resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} - engines: {node: '>=18'} - - '@biomejs/biome@1.9.4': - resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} - engines: {node: '>=14.21.3'} - hasBin: true - - '@biomejs/cli-darwin-arm64@1.9.4': - resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [darwin] - - '@biomejs/cli-darwin-x64@1.9.4': - resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [darwin] - - '@biomejs/cli-linux-arm64-musl@1.9.4': - resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - - '@biomejs/cli-linux-arm64@1.9.4': - resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - - '@biomejs/cli-linux-x64-musl@1.9.4': - resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - - '@biomejs/cli-linux-x64@1.9.4': - resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - - '@biomejs/cli-win32-arm64@1.9.4': - resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [win32] - - '@biomejs/cli-win32-x64@1.9.4': - resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [win32] - - '@cnakazawa/watch@1.0.4': - resolution: {integrity: sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==} - engines: {node: '>=0.1.95'} - hasBin: true - - '@codemirror/autocomplete@6.18.6': - resolution: {integrity: sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==} - - '@codemirror/commands@6.8.1': - resolution: {integrity: sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==} - - '@codemirror/lang-xml@6.1.0': - resolution: {integrity: sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==} - - '@codemirror/language@6.11.1': - resolution: {integrity: sha512-5kS1U7emOGV84vxC+ruBty5sUgcD0te6dyupyRVG2zaSjhTDM73LhVKUtVwiqSe6QwmEoA4SCiU8AKPFyumAWQ==} - - '@codemirror/lint@6.8.5': - resolution: {integrity: sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==} - - '@codemirror/search@6.5.11': - resolution: {integrity: sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==} - - '@codemirror/state@6.5.2': - resolution: {integrity: sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==} - - '@codemirror/theme-one-dark@6.1.3': - resolution: {integrity: sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==} - - '@codemirror/view@6.37.2': - resolution: {integrity: sha512-XD3LdgQpxQs5jhOOZ2HRVT+Rj59O4Suc7g2ULvZ+Yi8eCkickrkZ5JFuoDhs2ST1mNI5zSsNYgR3NGa4OUrbnw==} - - '@colors/colors@1.5.0': - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - - '@colors/colors@1.6.0': - resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} - engines: {node: '>=0.1.90'} - - '@csstools/css-parser-algorithms@3.0.5': - resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-tokenizer': ^3.0.4 - - '@csstools/css-tokenizer@3.0.4': - resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} - engines: {node: '>=18'} - - '@csstools/media-query-list-parser@4.0.3': - resolution: {integrity: sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.5 - '@csstools/css-tokenizer': ^3.0.4 - - '@csstools/selector-specificity@5.0.0': - resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} - engines: {node: '>=18'} - peerDependencies: - postcss-selector-parser: ^7.0.0 - - '@dabh/diagnostics@2.0.3': - resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} - - '@date-io/core@3.2.0': - resolution: {integrity: sha512-hqwXvY8/YBsT9RwQITG868ZNb1MVFFkF7W1Ecv4P472j/ZWa7EFcgSmxy8PUElNVZfvhdvfv+a8j6NWJqOX5mA==} - - '@date-io/date-fns@3.2.1': - resolution: {integrity: sha512-CtXgTOAamkImI+CmbWRNdBi4ljj9xm/tdoPa+eeeiygduzubJTsXp18vYz+Vs/9yLho1zUOXlxpsfsF7PsXSWQ==} - peerDependencies: - date-fns: ^3.2.0 || ^4.1.0 - peerDependenciesMeta: - date-fns: - optional: true - - '@discoveryjs/json-ext@0.5.7': - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - - '@discoveryjs/json-ext@0.6.3': - resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} - engines: {node: '>=14.17.0'} - - '@dual-bundle/import-meta-resolve@4.1.0': - resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} - - '@emotion/babel-plugin@11.13.5': - resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} - - '@emotion/cache@11.14.0': - resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} - - '@emotion/css@11.13.5': - resolution: {integrity: sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==} - - '@emotion/hash@0.9.2': - resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} - - '@emotion/is-prop-valid@0.8.8': - resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} - - '@emotion/is-prop-valid@1.3.1': - resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} - - '@emotion/memoize@0.7.4': - resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} - - '@emotion/memoize@0.9.0': - resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} - - '@emotion/react@11.14.0': - resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} - peerDependencies: - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true - - '@emotion/serialize@1.3.3': - resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} - - '@emotion/sheet@1.4.0': - resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} - - '@emotion/styled@11.14.0': - resolution: {integrity: sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==} - peerDependencies: - '@emotion/react': ^11.0.0-rc.0 - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@types/react': - optional: true - - '@emotion/unitless@0.10.0': - resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} - - '@emotion/use-insertion-effect-with-fallbacks@1.2.0': - resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} - peerDependencies: - react: '>=16.8.0' - - '@emotion/utils@1.4.2': - resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} - - '@emotion/weak-memoize@0.4.0': - resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} - - '@esbuild/aix-ppc64@0.25.5': - resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/aix-ppc64@0.25.6': - resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.25.5': - resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.25.6': - resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.25.5': - resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.25.6': - resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.25.5': - resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.25.6': - resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.5': - resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.25.6': - resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.5': - resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.6': - resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.25.5': - resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.25.6': - resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.5': - resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.6': - resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.5': - resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.25.6': - resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.25.5': - resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.25.6': - resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.25.5': - resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.25.6': - resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.25.5': - resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.25.6': - resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.5': - resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.25.6': - resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.25.5': - resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.25.6': - resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.5': - resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.6': - resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.25.5': - resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.25.6': - resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.25.5': - resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.25.6': - resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.25.5': - resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-arm64@0.25.6': - resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.5': - resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.6': - resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.5': - resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-arm64@0.25.6': - resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.5': - resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.6': - resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openharmony-arm64@0.25.6': - resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.25.5': - resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.25.6': - resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.25.5': - resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.25.6': - resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.25.5': - resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.25.6': - resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.25.5': - resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.25.6': - resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - 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==} - 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==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.15.1': - resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} - 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/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} - 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/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/plugin-kit@0.3.4': - resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@fal-works/esbuild-plugin-global-externals@2.1.2': - resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} - - '@floating-ui/core@1.7.1': - resolution: {integrity: sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==} - - '@floating-ui/core@1.7.2': - resolution: {integrity: sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==} - - '@floating-ui/dom@1.7.1': - resolution: {integrity: sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==} - - '@floating-ui/dom@1.7.2': - resolution: {integrity: sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==} - - '@floating-ui/react-dom@2.1.3': - resolution: {integrity: sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/react-dom@2.1.4': - resolution: {integrity: sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/react@0.26.28': - resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/utils@0.2.10': - resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} - - '@floating-ui/utils@0.2.9': - resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} - - '@formatjs/ecma402-abstract@2.3.4': - resolution: {integrity: sha512-qrycXDeaORzIqNhBOx0btnhpD1c+/qFIHAN9znofuMJX6QBwtbrmlpWfD4oiUUD2vJUOIYFA/gYtg2KAMGG7sA==} - - '@formatjs/fast-memoize@2.2.7': - resolution: {integrity: sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==} - - '@formatjs/icu-messageformat-parser@2.11.2': - resolution: {integrity: sha512-AfiMi5NOSo2TQImsYAg8UYddsNJ/vUEv/HaNqiFjnI3ZFfWihUtD5QtuX6kHl8+H+d3qvnE/3HZrfzgdWpsLNA==} - - '@formatjs/icu-skeleton-parser@1.8.14': - resolution: {integrity: sha512-i4q4V4qslThK4Ig8SxyD76cp3+QJ3sAqr7f6q9VVfeGtxG9OhiAk3y9XF6Q41OymsKzsGQ6OQQoJNY4/lI8TcQ==} - - '@formatjs/intl-localematcher@0.6.1': - resolution: {integrity: sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg==} - - '@formatjs/intl@3.1.6': - resolution: {integrity: sha512-tDkXnA4qpIFcDWac8CyVJq6oW8DR7W44QDUBsfXWIIJD/FYYen0QoH46W7XsVMFfPOVKkvbufjboZrrWbEfmww==} - peerDependencies: - typescript: ^5.6.0 - peerDependenciesMeta: - typescript: - optional: true - - '@formkit/auto-animate@0.8.2': - resolution: {integrity: sha512-SwPWfeRa5veb1hOIBMdzI+73te5puUBHmqqaF1Bu7FjvxlYSz/kJcZKSa9Cg60zL0uRNeJL2SbRxV6Jp6Q1nFQ==} - - '@gar/promisify@1.1.3': - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - - '@graphiql/react@0.26.2': - resolution: {integrity: sha512-aO4GWf/kJmqrjO+PORT/NPxwGvPGlg+mwye1v8xAlf8Q9j7P0hVtVBawYaSLUCCfJ/QnH7JAP+0VRamyooZZCw==} - peerDependencies: - graphql: ^15.5.0 || ^16.0.0 || ^17.0.0-alpha.2 - react: ^16.8.0 || ^17 || ^18 - react-dom: ^16.8.0 || ^17 || ^18 - - '@graphiql/toolkit@0.11.3': - resolution: {integrity: sha512-Glf0fK1cdHLNq52UWPzfSrYIJuNxy8h4451Pw1ZVpJ7dtU+tm7GVVC64UjEDQ/v2j3fnG4cX8jvR75IvfL6nzQ==} - peerDependencies: - graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 - graphql-ws: '>= 4.5.0' - peerDependenciesMeta: - graphql-ws: - optional: true - - '@hapi/hoek@9.3.0': - resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} - - '@hapi/topo@5.1.0': - resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - - '@headlessui/react@1.7.19': - resolution: {integrity: sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==} - engines: {node: '>=10'} - peerDependencies: - react: ^16 || ^17 || ^18 - react-dom: ^16 || ^17 || ^18 - - '@headlessui/react@2.2.4': - resolution: {integrity: sha512-lz+OGcAH1dK93rgSMzXmm1qKOJkBUqZf1L4M8TWLNplftQD3IkoEDdUFNfAn4ylsN6WOTVtWaLmvmaHOUk1dTA==} - engines: {node: '>=10'} - peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - react-dom: ^18 || ^19 || ^19.0.0-rc - - '@hookform/resolvers@2.9.11': - resolution: {integrity: sha512-bA3aZ79UgcHj7tFV7RlgThzwSSHZgvfbt2wprldRkYBcMopdMvHyO17Wwp/twcJasNFischFfS7oz8Katz8DdQ==} - peerDependencies: - react-hook-form: ^7.0.0 - - '@hookform/resolvers@5.0.1': - resolution: {integrity: sha512-u/+Jp83luQNx9AdyW2fIPGY6Y7NG68eN2ZW8FOJYL+M0i4s49+refdJdOp/A9n9HFQtQs3HIDHQvX3ZET2o7YA==} - peerDependencies: - react-hook-form: ^7.55.0 - - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} - engines: {node: '>=18.18.0'} - - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} - 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.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - - '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} - - '@iarna/toml@2.2.5': - resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} - - '@isaacs/balanced-match@4.0.1': - resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} - engines: {node: 20 || >=22} - - '@isaacs/brace-expansion@5.0.0': - resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} - engines: {node: 20 || >=22} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@istanbuljs/load-nyc-config@1.1.0': - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - - '@jest/console@25.5.0': - resolution: {integrity: sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==} - engines: {node: '>= 8.3'} - - '@jest/console@29.7.0': - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/core@25.5.4': - resolution: {integrity: sha512-3uSo7laYxF00Dg/DMgbn4xMJKmDdWvZnf89n8Xj/5/AeQ2dOQmn6b6Hkj/MleyzZWXpwv+WSdYWl4cLsy2JsoA==} - engines: {node: '>= 8.3'} - - '@jest/core@29.7.0': - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - '@jest/environment@25.5.0': - resolution: {integrity: sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA==} - engines: {node: '>= 8.3'} - - '@jest/environment@29.7.0': - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/expect-utils@29.7.0': - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/expect@29.7.0': - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/fake-timers@25.5.0': - resolution: {integrity: sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ==} - engines: {node: '>= 8.3'} - - '@jest/fake-timers@29.7.0': - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/globals@25.5.2': - resolution: {integrity: sha512-AgAS/Ny7Q2RCIj5kZ+0MuKM1wbF0WMLxbCVl/GOMoCNbODRdJ541IxJ98xnZdVSZXivKpJlNPIWa3QmY0l4CXA==} - engines: {node: '>= 8.3'} - - '@jest/globals@29.7.0': - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/reporters@25.5.1': - resolution: {integrity: sha512-3jbd8pPDTuhYJ7vqiHXbSwTJQNavczPs+f1kRprRDxETeE3u6srJ+f0NPuwvOmk+lmunZzPkYWIFZDLHQPkviw==} - engines: {node: '>= 8.3'} - - '@jest/reporters@29.7.0': - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/source-map@25.5.0': - resolution: {integrity: sha512-eIGx0xN12yVpMcPaVpjXPnn3N30QGJCJQSkEDUt9x1fI1Gdvb07Ml6K5iN2hG7NmMP6FDmtPEssE3z6doOYUwQ==} - engines: {node: '>= 8.3'} - - '@jest/source-map@29.6.3': - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/test-result@25.5.0': - resolution: {integrity: sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==} - engines: {node: '>= 8.3'} - - '@jest/test-result@29.7.0': - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/test-sequencer@25.5.4': - resolution: {integrity: sha512-pTJGEkSeg1EkCO2YWq6hbFvKNXk8ejqlxiOg1jBNLnWrgXOkdY6UmqZpwGFXNnRt9B8nO1uWMzLLZ4eCmhkPNA==} - engines: {node: '>= 8.3'} - - '@jest/test-sequencer@29.7.0': - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/transform@25.5.1': - resolution: {integrity: sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==} - engines: {node: '>= 8.3'} - - '@jest/transform@26.6.2': - resolution: {integrity: sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==} - engines: {node: '>= 10.14.2'} - - '@jest/transform@29.7.0': - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/types@25.5.0': - resolution: {integrity: sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==} - engines: {node: '>= 8.3'} - - '@jest/types@26.6.2': - resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} - engines: {node: '>= 10.14.2'} - - '@jest/types@29.6.3': - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1': - resolution: {integrity: sha512-J4BaTocTOYFkMHIra1JDWrMWpNmBl4EkplIwHEsV8aeUOtdWjwSnln9U7twjMFTAEB7mptNtSKyVi1Y2W9sDJw==} - peerDependencies: - typescript: '>= 4.3.x' - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - peerDependenciesMeta: - typescript: - optional: true - - '@jridgewell/gen-mapping@0.3.12': - resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} - - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/sourcemap-codec@1.5.4': - resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@jridgewell/trace-mapping@0.3.29': - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} - - '@jsdevtools/ono@7.1.3': - resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} - - '@jsonjoy.com/base64@1.1.2': - resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/json-pack@1.2.0': - resolution: {integrity: sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/util@1.6.0': - resolution: {integrity: sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@juggle/resize-observer@3.4.0': - resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} - - '@keyv/serialize@1.0.3': - resolution: {integrity: sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==} - - '@leichtgewicht/ip-codec@2.0.5': - resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} - - '@lezer/common@1.2.3': - resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} - - '@lezer/highlight@1.2.1': - resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==} - - '@lezer/lr@1.4.2': - resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} - - '@lezer/xml@1.0.6': - resolution: {integrity: sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==} - - '@marijn/find-cluster-break@1.0.2': - resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} - - '@mdx-js/mdx@1.6.22': - resolution: {integrity: sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==} - - '@mdx-js/react@1.6.22': - resolution: {integrity: sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==} - peerDependencies: - react: ^16.13.1 || ^17.0.0 - - '@mdx-js/react@2.3.0': - resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} - peerDependencies: - react: '>=16' - - '@mdx-js/react@3.1.0': - resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} - peerDependencies: - '@types/react': '>=16' - react: '>=16' - - '@mdx-js/util@1.6.22': - resolution: {integrity: sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==} - - '@microsoft/1ds-core-js@4.3.8': - resolution: {integrity: sha512-5y7pmcqoYmh+461xyUog4aQAZ2ZIoYlAg7VkHU0G+dpOwAmwN3WECnsO/8RNagNiVwsFOBeN5e2OxKm3vruJWw==} - - '@microsoft/1ds-post-js@4.3.8': - resolution: {integrity: sha512-9Jq6PqEs/wImx246xhOU6WyrhBVMLZPp1MGCKKGexxOQKhHSbK6RzOguSYKT15nfO7JVDde3+nCGc6EPxAagaA==} - - '@microsoft/applicationinsights-channel-js@3.3.8': - resolution: {integrity: sha512-uj60YhHTxcHLjLUHRPe2Y9VVdDOcam4/pdBBCbJ6/hkBWh6KZznnM3vb6JRbBVwD69Iq6tdGNWJRSCWNpZhLaA==} - peerDependencies: - tslib: '>= 1.0.0' - - '@microsoft/applicationinsights-common@3.3.8': - resolution: {integrity: sha512-yfcU3g05Z36S3r4SDtV+LGkoubT3px6Yt4fwINIGDixbTJB6VZXQxLwkTAzWxKwxuvBX2L8PP9O1LY4D7gGrrA==} - peerDependencies: - tslib: '>= 1.0.0' - - '@microsoft/applicationinsights-core-js@3.3.8': - resolution: {integrity: sha512-k1uQCRSbV0aUF4DxgTFAbbk1IlsihLoldgQCMIVwHdnS3X80NjtSDWQPy0n+Hbw1XNlpky9p8jxNDJlZ9PoFDg==} - peerDependencies: - tslib: '>= 1.0.0' - - '@microsoft/applicationinsights-shims@3.0.1': - resolution: {integrity: sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==} - - '@microsoft/applicationinsights-web-basic@3.3.8': - resolution: {integrity: sha512-etHqbg6zwDxObY7GUF1CZZtoNIzzfjzvJyOEvixwnio4ehHyxZLQXBTavoUL424/A2MgWTBQjj6AV2ezayoz4A==} - peerDependencies: - tslib: '>= 1.0.0' - - '@microsoft/dynamicproto-js@2.0.3': - resolution: {integrity: sha512-JTWTU80rMy3mdxOjjpaiDQsTLZ6YSGGqsjURsY6AUQtIj0udlF/jYmhdLZu8693ZIC0T1IwYnFa0+QeiMnziBA==} - - '@microsoft/fast-element@1.14.0': - resolution: {integrity: sha512-zXvuSOzvsu8zDTy9eby8ix8VqLop2rwKRgp++ZN2kTCsoB3+QJVoaGD2T/Cyso2ViZQFXNpiNCVKfnmxBvmWkQ==} - - '@microsoft/fast-foundation@2.50.0': - resolution: {integrity: sha512-8mFYG88Xea1jZf2TI9Lm/jzZ6RWR8x29r24mGuLojNYqIR2Bl8+hnswoV6laApKdCbGMPKnsAL/O68Q0sRxeVg==} - - '@microsoft/fast-react-wrapper@0.3.25': - resolution: {integrity: sha512-jKzmk2xJV93RL/jEFXEZgBvXlKIY4N4kXy3qrjmBfFpqNi3VjY+oUTWyMnHRMC5EUhIFxD+Y1VD4u9uIPX3jQw==} - peerDependencies: - react: '>=16.9.0' - - '@microsoft/fast-web-utilities@5.4.1': - resolution: {integrity: sha512-ReWYncndjV3c8D8iq9tp7NcFNc1vbVHvcBFPME2nNFKNbS1XCesYZGlIlf3ot5EmuOXPlrzUHOWzQ2vFpIkqDg==} - - '@modelcontextprotocol/sdk@1.13.0': - resolution: {integrity: sha512-P5FZsXU0kY881F6Hbk9GhsYx02/KgWK1DYf7/tyE/1lcFKhDYPQR9iYjhQXJn+Sg6hQleMo3DB7h7+p4wgp2Lw==} - engines: {node: '>=18'} - - '@monaco-editor/loader@1.5.0': - resolution: {integrity: sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==} - - '@monaco-editor/react@4.7.0': - resolution: {integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==} - peerDependencies: - monaco-editor: '>= 0.25.0 < 1' - 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 - - '@motionone/animation@10.18.0': - resolution: {integrity: sha512-9z2p5GFGCm0gBsZbi8rVMOAJCtw1WqBTIPw3ozk06gDvZInBPIsQcHgYogEJ4yuHJ+akuW8g1SEIOpTOvYs8hw==} - - '@motionone/dom@10.12.0': - resolution: {integrity: sha512-UdPTtLMAktHiqV0atOczNYyDd/d8Cf5fFsd1tua03PqTwwCe/6lwhLSQ8a7TbnQ5SN0gm44N1slBfj+ORIhrqw==} - - '@motionone/easing@10.18.0': - resolution: {integrity: sha512-VcjByo7XpdLS4o9T8t99JtgxkdMcNWD3yHU/n6CLEz3bkmKDRZyYQ/wmSf6daum8ZXqfUAgFeCZSpJZIMxaCzg==} - - '@motionone/generators@10.18.0': - resolution: {integrity: sha512-+qfkC2DtkDj4tHPu+AFKVfR/C30O1vYdvsGYaR13W/1cczPrrcjdvYCj0VLFuRMN+lP1xvpNZHCRNM4fBzn1jg==} - - '@motionone/types@10.17.1': - resolution: {integrity: sha512-KaC4kgiODDz8hswCrS0btrVrzyU2CSQKO7Ps90ibBVSQmjkrt2teqta6/sOG59v7+dPnKMAg13jyqtMKV2yJ7A==} - - '@motionone/utils@10.18.0': - resolution: {integrity: sha512-3XVF7sgyTSI2KWvTf6uLlBJ5iAgRgmvp3bpuOiQJvInd4nZ19ET8lX5unn30SlmRH7hXbBbH+Gxd0m0klJ3Xtw==} - - '@mrmlnc/readdir-enhanced@2.2.1': - resolution: {integrity: sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==} - engines: {node: '>=4'} - - '@n1ru4l/push-pull-async-iterable-iterator@3.2.0': - resolution: {integrity: sha512-3fkKj25kEjsfObL6IlKPAlHYPq/oYwUkkQ03zsTTiDjD7vg/RxjdiLeCydqtxHZP0JgsXL3D/X5oAkMGzuUp/Q==} - engines: {node: '>=12'} - - '@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-utils@0.12.5': - resolution: {integrity: sha512-JPQZWPKQJjj7kAftdEZL0XDFfbMgXCGiUAZe0d7EhLC3QlXTlZdSckGqqRIQ2QNl0VTEZyZUvRBw6Ednw089Fw==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@1.1.3': - resolution: {integrity: sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==} - engines: {node: '>= 6'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@npmcli/fs@1.1.1': - resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} - - '@npmcli/fs@2.1.2': - resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - '@npmcli/move-file@1.1.2': - resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} - engines: {node: '>=10'} - deprecated: This functionality has been moved to @npmcli/fs - - '@npmcli/move-file@2.0.1': - resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This functionality has been moved to @npmcli/fs - - '@oozcitak/dom@1.15.10': - resolution: {integrity: sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==} - engines: {node: '>=8.0'} - - '@oozcitak/infra@1.0.8': - resolution: {integrity: sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==} - engines: {node: '>=6.0'} - - '@oozcitak/url@1.0.4': - resolution: {integrity: sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==} - engines: {node: '>=8.0'} - - '@oozcitak/util@8.3.8': - resolution: {integrity: sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==} - engines: {node: '>=8.0'} - - '@parcel/watcher-android-arm64@2.5.1': - resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [android] - - '@parcel/watcher-darwin-arm64@2.5.1': - resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [darwin] - - '@parcel/watcher-darwin-x64@2.5.1': - resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [darwin] - - '@parcel/watcher-freebsd-x64@2.5.1': - resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [freebsd] - - '@parcel/watcher-linux-arm-glibc@2.5.1': - resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} - 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==} - 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==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - - '@parcel/watcher-linux-arm64-musl@2.5.1': - resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - - '@parcel/watcher-linux-x64-glibc@2.5.1': - resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - - '@parcel/watcher-linux-x64-musl@2.5.1': - resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - - '@parcel/watcher-win32-arm64@2.5.1': - resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [win32] - - '@parcel/watcher-win32-ia32@2.5.1': - resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} - engines: {node: '>= 10.0.0'} - cpu: [ia32] - os: [win32] - - '@parcel/watcher-win32-x64@2.5.1': - resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [win32] - - '@parcel/watcher@2.5.1': - resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} - engines: {node: '>= 10.0.0'} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@playwright/test@1.52.0': - resolution: {integrity: sha512-uh6W7sb55hl7D6vsAeA+V2p5JnlAqzhqFyF0VcJkKZXkgnFcVG9PziERRHQfPLfNGx1C292a4JqbWzhR8L4R1g==} - engines: {node: '>=18'} - hasBin: true - - '@pmmmwh/react-refresh-webpack-plugin@0.5.16': - resolution: {integrity: sha512-kLQc9xz6QIqd2oIYyXRUiAp79kGpFBm3fEM9ahfG1HI0WI5gdZ2OVHWdmZYnwODt7ISck+QuQ6sBPrtvUBML7Q==} - engines: {node: '>= 10.13'} - peerDependencies: - '@types/webpack': 4.x || 5.x - react-refresh: '>=0.10.0 <1.0.0' - sockjs-client: ^1.4.0 - type-fest: '>=0.17.0 <5.0.0' - webpack: ^5.94.0 - webpack-dev-server: ^5.2.1 - webpack-hot-middleware: 2.x - webpack-plugin-serve: 0.x || 1.x - peerDependenciesMeta: - '@types/webpack': - optional: true - sockjs-client: - optional: true - type-fest: - optional: true - webpack-dev-server: - optional: true - webpack-hot-middleware: - optional: true - webpack-plugin-serve: - optional: true - - '@pmmmwh/react-refresh-webpack-plugin@0.6.0': - resolution: {integrity: sha512-AAc+QWfZ1KQ/e1C6OHWVlxU+ks6zFGOA44IJUlvju7RlDS8nsX6poPFOIlsg/rTofO9vKov12+WCjMhKkRKD5g==} - engines: {node: '>=18.12'} - peerDependencies: - '@types/webpack': 5.x - react-refresh: '>=0.10.0 <1.0.0' - sockjs-client: ^1.4.0 - type-fest: '>=0.17.0 <5.0.0' - webpack: ^5.94.0 - webpack-dev-server: ^5.2.1 - webpack-hot-middleware: 2.x - webpack-plugin-serve: 1.x - peerDependenciesMeta: - '@types/webpack': - optional: true - sockjs-client: - optional: true - type-fest: - optional: true - webpack-dev-server: - optional: true - webpack-hot-middleware: - optional: true - webpack-plugin-serve: - optional: true - - '@projectstorm/geometry@6.7.4': - resolution: {integrity: sha512-9jTcQPzg+qT9OUMCUGmpkyk0ChHMobFL5d542dY5sb54bki35cawvQj2gMsIdNJ4WGxnuM+DKSSzm4JX35lGtw==} - - '@projectstorm/geometry@7.0.3': - resolution: {integrity: sha512-cwQ9IiOcLhMwVh9NsX0srcACGkpasXY1NA6659Tc9PeSYtAGySH5XC8DfL/nvPMXEdrBYS0S5zAdPC3RPcewog==} - - '@projectstorm/react-canvas-core@6.7.4': - resolution: {integrity: sha512-sY32kT//gQe5aw6RHkmKrbzBq9iWyfwyvvfRTplGPE1ll3zOBVCjbf3tdfw6vATCden+WR0TmirtBo2j3exiBg==} - peerDependencies: - lodash: 4.* - react: 16.* || 17.* - - '@projectstorm/react-canvas-core@7.0.3': - resolution: {integrity: sha512-Vm19AprUGx3ea0uWSMPFfpTRclaEW/7s1/hbnRDFu9WSF1VScYhw2f/cVC95qfiedip/usn4YMsg3Av6M84d0g==} - - '@projectstorm/react-diagrams-core@6.7.4': - resolution: {integrity: sha512-AeqH1u58Ugk8mif/GgLEUeOMmTPaWDpl1isA1OJHCPGMbvAytRfv5mrGMvG2E+pYDB29BQ4Yo2z9/TbAy6/nvA==} - peerDependencies: - lodash: 4.* - react: 18.* - resize-observer-polyfill: ^1.5.1 - - '@projectstorm/react-diagrams-core@7.0.3': - resolution: {integrity: sha512-sbCy5Bk4OLfEvTtYrFK/qDc1WdgMhZzVY1rxmToVnCMP6bYiThHdopYNBX59fPHqKQebAHYER0vmlWyepqEZLQ==} - - '@projectstorm/react-diagrams-defaults@6.7.4': - resolution: {integrity: sha512-j3pRlZq1Z5yIGKpI7VtVkvNK/kXKB2abNMVXTSLUECA4iRubPKDn08w6q4jg1nBZXLGidrHsrELqW+53G9VvLA==} - peerDependencies: - '@emotion/react': ^11.* - '@emotion/styled': ^11.* - lodash: 4.* - react: 18.* - - '@projectstorm/react-diagrams-defaults@7.1.3': - resolution: {integrity: sha512-T4KGgKiy4sUiH4pIq8VjR7Q+iM5SMDnVWyiwzpVFsx3D98V6r2w9qzWt3+9St/uZOKLrXj8VSCy73lmmkfNomQ==} - - '@projectstorm/react-diagrams-routing@6.7.4': - resolution: {integrity: sha512-mB8YaRkNF6gdTlYvL0Cxc6m6XLwh7wvmjIsiEO6kW3j1uSvH7R7Gbl/iDYOdc0zUMqH9+pD+M064tWC4oAXa9A==} - peerDependencies: - dagre: ^0.8.5 - lodash: 4.* - pathfinding: ^0.4.18 - paths-js: ^0.4.11 - react: 18.* - - '@projectstorm/react-diagrams-routing@7.1.3': - resolution: {integrity: sha512-/Gbc7+8zoKQ3int6vVxoYMZ4hnqhIFwgulXUCuzYs21M7llnlaeOjOBEoifa3cNH6f8M4ht8xMhvEgg/gHiLiw==} - - '@projectstorm/react-diagrams@6.7.4': - resolution: {integrity: sha512-xK/bi7DqHKv15XZRESeSpvSmAVArJIXkV6E1mybSc/24toGmoE2imcS+puxG6wGS56NhR0gIrUiT5UYwBvyD5A==} - - '@projectstorm/react-diagrams@7.0.4': - resolution: {integrity: sha512-GJLpo3zhJzjcmx3PfztNDTS7jpePj9TPjXV2CgJmCDZAPHDU8q/f4AyXoJfqvoWlmVnjrzQgtcOU2KbUlNu3dQ==} - - '@radix-ui/number@1.0.1': - resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} - - '@radix-ui/primitive@1.0.1': - resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} - - '@radix-ui/primitive@1.1.2': - resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==} - - '@radix-ui/react-arrow@1.0.3': - resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-arrow@1.1.7': - resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-collection@1.0.3': - resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-collection@1.1.7': - resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-compose-refs@1.0.1': - resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-compose-refs@1.1.2': - resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-context@1.0.1': - resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-context@1.1.2': - resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-dialog@1.1.14': - resolution: {integrity: sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-direction@1.0.1': - resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-direction@1.1.1': - resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-dismissable-layer@1.0.4': - resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-dismissable-layer@1.1.10': - resolution: {integrity: sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-dropdown-menu@2.1.15': - resolution: {integrity: sha512-mIBnOjgwo9AH3FyKaSWoSu/dYj6VdhJ7frEPiGTeXCdUFHjl9h3mFh2wwhEtINOmYXWhdpf1rY2minFsmaNgVQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-focus-guards@1.0.1': - resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-focus-guards@1.1.2': - resolution: {integrity: sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-focus-scope@1.0.3': - resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-focus-scope@1.1.7': - resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-id@1.0.1': - resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-id@1.1.1': - resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-menu@2.1.15': - resolution: {integrity: sha512-tVlmA3Vb9n8SZSd+YSbuFR66l87Wiy4du+YE+0hzKQEANA+7cWKH1WgqcEX4pXqxUFQKrWQGHdvEfw00TjFiew==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-popper@1.1.2': - resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-popper@1.2.7': - resolution: {integrity: sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-portal@1.0.3': - resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-portal@1.1.9': - resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-presence@1.1.4': - resolution: {integrity: sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-primitive@1.0.3': - resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-primitive@2.1.3': - resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-roving-focus@1.1.10': - resolution: {integrity: sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-select@1.2.2': - resolution: {integrity: sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-separator@1.1.7': - resolution: {integrity: sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-slot@1.0.2': - resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-slot@1.2.3': - resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-toggle-group@1.1.10': - resolution: {integrity: sha512-kiU694Km3WFLTC75DdqgM/3Jauf3rD9wxeS9XtyWFKsBUeZA337lC+6uUazT7I1DhanZ5gyD5Stf8uf2dbQxOQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-toggle@1.1.9': - resolution: {integrity: sha512-ZoFkBBz9zv9GWer7wIjvdRxmh2wyc2oKWw6C6CseWd6/yq1DK/l5lJ+wnsmFwJZbBYqr02mrf8A2q/CVCuM3ZA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-toolbar@1.1.10': - resolution: {integrity: sha512-jiwQsduEL++M4YBIurjSa+voD86OIytCod0/dbIxFZDLD8NfO1//keXYMfsW8BPcfqwoNjt+y06XcJqAb4KR7A==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-tooltip@1.2.7': - resolution: {integrity: sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-use-callback-ref@1.0.1': - resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-callback-ref@1.1.1': - resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-controllable-state@1.0.1': - resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-controllable-state@1.2.2': - resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-effect-event@0.0.2': - resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-escape-keydown@1.0.3': - resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-escape-keydown@1.1.1': - resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-layout-effect@1.0.1': - resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-layout-effect@1.1.1': - resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-previous@1.0.1': - resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-rect@1.0.1': - resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-rect@1.1.1': - resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-size@1.0.1': - resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-size@1.1.1': - resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-visually-hidden@1.0.3': - resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-visually-hidden@1.2.3': - resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/rect@1.0.1': - resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} - - '@radix-ui/rect@1.1.1': - resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - - '@react-aria/focus@3.20.5': - resolution: {integrity: sha512-JpFtXmWQ0Oca7FcvkqgjSyo6xEP7v3oQOLUId6o0xTvm4AD5W0mU2r3lYrbhsJ+XxdUUX4AVR5473sZZ85kU4A==} - 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.3': - resolution: {integrity: sha512-J1bhlrNtjPS/fe5uJQ+0c7/jiXniwa4RQlP+Emjfc/iuqpW2RhbF9ou5vROcLzWIyaW8tVMZ468J68rAs/aZ5A==} - 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/ssr@3.9.9': - resolution: {integrity: sha512-2P5thfjfPy/np18e5wD4WPt8ydNXhij1jwA8oehxZTFqlgVMGXzcWKxTb4RtJrLFsqPO7RUQTiY8QJk0M4Vy2g==} - engines: {node: '>= 12'} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-aria/utils@3.29.1': - resolution: {integrity: sha512-yXMFVJ73rbQ/yYE/49n5Uidjw7kh192WNN9PNQGV0Xoc7EJUlSOxqhnpHmYTyO0EotJ8fdM1fMH8durHjUSI8g==} - 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-dnd/asap@5.0.2': - resolution: {integrity: sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==} - - '@react-dnd/invariant@4.0.2': - resolution: {integrity: sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==} - - '@react-dnd/shallowequal@4.0.2': - resolution: {integrity: sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==} - - '@react-stately/flags@3.1.2': - resolution: {integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==} - - '@react-stately/utils@3.10.7': - resolution: {integrity: sha512-cWvjGAocvy4abO9zbr6PW6taHgF24Mwy/LbQ4TC4Aq3tKdKDntxyD+sh7AkSRfJRT2ccMVaHVv2+FfHThd3PKQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@react-types/shared@3.30.0': - resolution: {integrity: sha512-COIazDAx1ncDg046cTJ8SFYsX8aS3lB/08LDnbkH/SkdYrFPWDlXMrO/sUam8j1WWM+PJ+4d1mj7tODIKNiFog==} - peerDependencies: - react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - - '@redhat-developer/locators@1.13.0': - resolution: {integrity: sha512-+v+FtxaPnCDguiwiU+UpWiNFaEyBXpRQMbf35SlJVAT5Yszb6qnDOFf9iTwtZNeeny4Cv+PVlYmoe/u9bRqByw==} - peerDependencies: - '@redhat-developer/page-objects': '>=1.0.0' - selenium-webdriver: '>=4.6.1' - - '@redhat-developer/page-objects@1.13.0': - resolution: {integrity: sha512-k53UVbw/5cD1dh1uagwGX48t7vtx9mqysaKEnx9hjuAaxHJ7aKF5KfF25mi31fvn6xvEdEvpBPrV2yoRgyD6Gg==} - peerDependencies: - selenium-webdriver: '>=4.6.1' - typescript: '>=4.6.2' - - '@rolldown/pluginutils@1.0.0-beta.11': - resolution: {integrity: sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag==} - - '@rollup/plugin-babel@5.3.1': - resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} - engines: {node: '>= 10.0.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@types/babel__core': ^7.1.9 - rollup: ^1.20.0||^2.0.0 - peerDependenciesMeta: - '@types/babel__core': - optional: true - - '@rollup/plugin-commonjs@11.1.0': - resolution: {integrity: sha512-Ycr12N3ZPN96Fw2STurD21jMqzKwL9QuFhms3SD7KKRK7oaXUsBU9Zt0jL/rOPHiPYisI21/rXGO3jr9BnLHUA==} - engines: {node: '>= 8.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 - - '@rollup/plugin-commonjs@28.0.6': - resolution: {integrity: sha512-XSQB1K7FUU5QP+3lOQmVCE3I0FcbbNvmNT4VJSj93iUjayaARrTQeoRdiYQoftAJBLrR9t2agwAd3ekaTgHNlw==} - engines: {node: '>=16.0.0 || 14 >= 14.17'} - peerDependencies: - rollup: ^2.68.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/plugin-json@4.1.0': - resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} - peerDependencies: - rollup: ^1.20.0 || ^2.0.0 - - '@rollup/plugin-json@6.1.0': - resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/plugin-node-resolve@16.0.1': - resolution: {integrity: sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^2.78.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/plugin-node-resolve@9.0.0': - resolution: {integrity: sha512-gPz+utFHLRrd41WMP13Jq5mqqzHL3OXrfj3/MkSyB6UBIcuNt9j60GCbarzMzdf1VHFpOxfQh/ez7wyadLMqkg==} - engines: {node: '>= 10.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 - - '@rollup/plugin-replace@2.4.2': - resolution: {integrity: sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==} - peerDependencies: - rollup: ^1.20.0 || ^2.0.0 - - '@rollup/pluginutils@3.1.0': - resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} - engines: {node: '>= 8.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0 - - '@rollup/pluginutils@4.2.1': - resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} - engines: {node: '>= 8.0.0'} - - '@rollup/pluginutils@5.2.0': - resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} - engines: {node: '>=14.0.0'} - peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 - peerDependenciesMeta: - rollup: - optional: true - - '@rollup/rollup-android-arm-eabi@4.44.0': - resolution: {integrity: sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.44.0': - resolution: {integrity: sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.44.0': - resolution: {integrity: sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.44.0': - resolution: {integrity: sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.44.0': - resolution: {integrity: sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.44.0': - resolution: {integrity: sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.44.0': - resolution: {integrity: sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.44.0': - resolution: {integrity: sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.44.0': - resolution: {integrity: sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.44.0': - resolution: {integrity: sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-loongarch64-gnu@4.44.0': - resolution: {integrity: sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-powerpc64le-gnu@4.44.0': - resolution: {integrity: sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.44.0': - resolution: {integrity: sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-musl@4.44.0': - resolution: {integrity: sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.44.0': - resolution: {integrity: sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.44.0': - resolution: {integrity: sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.44.0': - resolution: {integrity: sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-win32-arm64-msvc@4.44.0': - resolution: {integrity: sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.44.0': - resolution: {integrity: sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.44.0': - resolution: {integrity: sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==} - cpu: [x64] - os: [win32] - - '@rtsao/scc@1.1.0': - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - - '@scarf/scarf@1.4.0': - resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} - - '@sec-ant/readable-stream@0.4.1': - resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - - '@secretlint/config-creator@9.3.4': - resolution: {integrity: sha512-GRMYfHJ+rewwB26CC3USVObqSQ/mDLXzXcUMJw/wJisPr3HDZmdsYlcsNnaAcGN+EZmvqSDkgSibQm1hyZpzbg==} - engines: {node: ^14.13.1 || >=16.0.0} - - '@secretlint/config-loader@9.3.4': - resolution: {integrity: sha512-sy+yWDWh4cbAbpQYLiO39DjwNGEK1EUhTqNamLLBo163BdJP10FIWhqpe8mtGQBSBXRtxr8Hg/gc3Xe4meIoww==} - engines: {node: ^14.13.1 || >=16.0.0} - - '@secretlint/core@9.3.4': - resolution: {integrity: sha512-ErIVHI6CJd191qdNKuMkH3bZQo9mWJsrSg++bQx64o0WFuG5nPvkYrDK0p/lebf+iQuOnzvl5HrZU6GU9a6o+Q==} - engines: {node: ^14.13.1 || >=16.0.0} - - '@secretlint/formatter@9.3.4': - resolution: {integrity: sha512-ARpoBOKz6WP3ocLITCFkR1/Lj636ugpBknylhlpc45r5aLdvmyvWAJqodlw5zmUCfgD6JXeAMf3Hi60aAiuqWQ==} - engines: {node: ^14.13.1 || >=16.0.0} - - '@secretlint/node@9.3.4': - resolution: {integrity: sha512-S0u8i+CnPmyAKtuccgot9L5cmw6DqJc0F+b3hhVIALd8kkeLt3RIXOOej15tU7N0V1ISph90Gz92V72ovsprgQ==} - engines: {node: ^14.13.1 || >=16.0.0} - - '@secretlint/profiler@9.3.4': - resolution: {integrity: sha512-99WmaHd4dClNIm5BFsG++E6frNIZ3qVwg6s804Ql/M19pDmtZOoVCl4/UuzWpwNniBqLIgn9rHQZ/iGlIW3wyw==} - - '@secretlint/resolver@9.3.4': - resolution: {integrity: sha512-L1lIrcjzqcspPzZttmOvMmOFDpJTYFyRBONg94TZBWrpv4x0w5G2SYR+K7EE1SbYQAiPxw1amoXT1YRP8cZF2A==} - - '@secretlint/secretlint-formatter-sarif@9.3.4': - resolution: {integrity: sha512-IpAl5gzKwpTRqoivKOTJB89l6b7uvBwjSNKzJb3oIGD9Jg3vXcQunSntvLv5XGynYtdi1NhANfEpbhavlmMSyA==} - - '@secretlint/secretlint-rule-no-dotenv@9.3.4': - resolution: {integrity: sha512-lMSVwTrJiZ/zL9VIzpT7tMcb0ClI6u4cyJo2YKGSbuJErJG1zB4gQKtjIwCSt7px5JF6U+aFtpb9M8+s40WWCQ==} - engines: {node: ^14.13.1 || >=16.0.0} - - '@secretlint/secretlint-rule-preset-recommend@9.3.4': - resolution: {integrity: sha512-RvzrLNN2A0B2bYQgRSRjh2dkdaIDuhXjj4SO5bElK1iBtJNiD6VBTxSSY1P3hXYaBeva7MEF+q1PZ3cCL8XYOA==} - engines: {node: ^14.13.1 || >=16.0.0} - - '@secretlint/source-creator@9.3.4': - resolution: {integrity: sha512-I9ZA1gm9HJNaAhZiQdInY9VM04VTAGDV4bappVbEJzMUDnK/LTbYqfQ88RPqgCGCqa6ee8c0/j5Bn7ypweouIw==} - engines: {node: ^14.13.1 || >=16.0.0} - - '@secretlint/types@9.3.4': - resolution: {integrity: sha512-z9rdKHNeL4xa48+367RQJVw1d7/Js9HIQ+gTs/angzteM9osfgs59ad3iwVRhCGYbeUoUUDe2yxJG2ylYLaH3Q==} - engines: {node: ^14.13.1 || >=16.0.0} - - '@sentry/cli@1.77.3': - resolution: {integrity: sha512-c3eDqcDRmy4TFz2bFU5Y6QatlpoBPPa8cxBooaS4aMQpnIdLYPF1xhyyiW0LQlDUNc3rRjNF7oN5qKoaRoMTQQ==} - engines: {node: '>= 8'} - hasBin: true - - '@sentry/webpack-plugin@1.21.0': - resolution: {integrity: sha512-x0PYIMWcsTauqxgl7vWUY6sANl+XGKtx7DCVnnY7aOIIlIna0jChTAPANTfA2QrK+VK+4I/4JxatCEZBnXh3Og==} - engines: {node: '>= 8'} - - '@sideway/address@4.1.5': - resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} - - '@sideway/formula@3.0.1': - resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} - - '@sideway/pinpoint@2.0.0': - resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - - '@sindresorhus/is@5.6.0': - resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} - engines: {node: '>=14.16'} - - '@sindresorhus/is@7.0.2': - resolution: {integrity: sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==} - engines: {node: '>=18'} - - '@sindresorhus/merge-streams@2.3.0': - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} - engines: {node: '>=18'} - - '@sinonjs/commons@1.8.6': - resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} - - '@sinonjs/commons@3.0.1': - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - - '@sinonjs/fake-timers@10.3.0': - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - - '@size-limit/esbuild@11.2.0': - resolution: {integrity: sha512-vSg9H0WxGQPRzDnBzeDyD9XT0Zdq0L+AI3+77/JhxznbSCMJMMr8ndaWVQRhOsixl97N0oD4pRFw2+R1Lcvi6A==} - engines: {node: ^18.0.0 || >=20.0.0} - peerDependencies: - size-limit: 11.2.0 - - '@size-limit/file@11.2.0': - resolution: {integrity: sha512-OZHE3putEkQ/fgzz3Tp/0hSmfVo3wyTpOJSRNm6AmcwX4Nm9YtTfbQQ/hZRwbBFR23S7x2Sd9EbqYzngKwbRoA==} - engines: {node: ^18.0.0 || >=20.0.0} - peerDependencies: - size-limit: 11.2.0 - - '@size-limit/preset-small-lib@11.2.0': - resolution: {integrity: sha512-RFbbIVfv8/QDgTPyXzjo5NKO6CYyK5Uq5xtNLHLbw5RgSKrgo8WpiB/fNivZuNd/5Wk0s91PtaJ9ThNcnFuI3g==} - peerDependencies: - size-limit: 11.2.0 - - '@smithy/abort-controller@4.0.4': - resolution: {integrity: sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==} - engines: {node: '>=18.0.0'} - - '@smithy/chunked-blob-reader-native@4.0.0': - resolution: {integrity: sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==} - engines: {node: '>=18.0.0'} - - '@smithy/chunked-blob-reader@5.0.0': - resolution: {integrity: sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==} - engines: {node: '>=18.0.0'} - - '@smithy/config-resolver@4.1.4': - resolution: {integrity: sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==} - engines: {node: '>=18.0.0'} - - '@smithy/core@3.5.3': - resolution: {integrity: sha512-xa5byV9fEguZNofCclv6v9ra0FYh5FATQW/da7FQUVTic94DfrN/NvmKZjrMyzbpqfot9ZjBaO8U1UeTbmSLuA==} - engines: {node: '>=18.0.0'} - - '@smithy/credential-provider-imds@4.0.6': - resolution: {integrity: sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-codec@4.0.4': - resolution: {integrity: sha512-7XoWfZqWb/QoR/rAU4VSi0mWnO2vu9/ltS6JZ5ZSZv0eovLVfDfu0/AX4ub33RsJTOth3TiFWSHS5YdztvFnig==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-browser@4.0.4': - resolution: {integrity: sha512-3fb/9SYaYqbpy/z/H3yIi0bYKyAa89y6xPmIqwr2vQiUT2St+avRt8UKwsWt9fEdEasc5d/V+QjrviRaX1JRFA==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-config-resolver@4.1.2': - resolution: {integrity: sha512-JGtambizrWP50xHgbzZI04IWU7LdI0nh/wGbqH3sJesYToMi2j/DcoElqyOcqEIG/D4tNyxgRuaqBXWE3zOFhQ==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-node@4.0.4': - resolution: {integrity: sha512-RD6UwNZ5zISpOWPuhVgRz60GkSIp0dy1fuZmj4RYmqLVRtejFqQ16WmfYDdoSoAjlp1LX+FnZo+/hkdmyyGZ1w==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-universal@4.0.4': - resolution: {integrity: sha512-UeJpOmLGhq1SLox79QWw/0n2PFX+oPRE1ZyRMxPIaFEfCqWaqpB7BU9C8kpPOGEhLF7AwEqfFbtwNxGy4ReENA==} - engines: {node: '>=18.0.0'} - - '@smithy/fetch-http-handler@5.0.4': - resolution: {integrity: sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==} - engines: {node: '>=18.0.0'} - - '@smithy/hash-blob-browser@4.0.4': - resolution: {integrity: sha512-WszRiACJiQV3QG6XMV44i5YWlkrlsM5Yxgz4jvsksuu7LDXA6wAtypfPajtNTadzpJy3KyJPoWehYpmZGKUFIQ==} - engines: {node: '>=18.0.0'} - - '@smithy/hash-node@4.0.4': - resolution: {integrity: sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==} - engines: {node: '>=18.0.0'} - - '@smithy/hash-stream-node@4.0.4': - resolution: {integrity: sha512-wHo0d8GXyVmpmMh/qOR0R7Y46/G1y6OR8U+bSTB4ppEzRxd1xVAQ9xOE9hOc0bSjhz0ujCPAbfNLkLrpa6cevg==} - engines: {node: '>=18.0.0'} - - '@smithy/invalid-dependency@4.0.4': - resolution: {integrity: sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==} - engines: {node: '>=18.0.0'} - - '@smithy/is-array-buffer@2.2.0': - resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} - engines: {node: '>=14.0.0'} - - '@smithy/is-array-buffer@4.0.0': - resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} - engines: {node: '>=18.0.0'} - - '@smithy/md5-js@4.0.4': - resolution: {integrity: sha512-uGLBVqcOwrLvGh/v/jw423yWHq/ofUGK1W31M2TNspLQbUV1Va0F5kTxtirkoHawODAZcjXTSGi7JwbnPcDPJg==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-content-length@4.0.4': - resolution: {integrity: sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-endpoint@4.1.11': - resolution: {integrity: sha512-zDogwtRLzKl58lVS8wPcARevFZNBOOqnmzWWxVe9XiaXU2CADFjvJ9XfNibgkOWs08sxLuSr81NrpY4mgp9OwQ==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-retry@4.1.12': - resolution: {integrity: sha512-wvIH70c4e91NtRxdaLZF+mbLZ/HcC6yg7ySKUiufL6ESp6zJUSnJucZ309AvG9nqCFHSRB5I6T3Ez1Q9wCh0Ww==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-serde@4.0.8': - resolution: {integrity: sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-stack@4.0.4': - resolution: {integrity: sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==} - engines: {node: '>=18.0.0'} - - '@smithy/node-config-provider@4.1.3': - resolution: {integrity: sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==} - engines: {node: '>=18.0.0'} - - '@smithy/node-http-handler@4.0.6': - resolution: {integrity: sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==} - engines: {node: '>=18.0.0'} - - '@smithy/property-provider@4.0.4': - resolution: {integrity: sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==} - engines: {node: '>=18.0.0'} - - '@smithy/protocol-http@5.1.2': - resolution: {integrity: sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==} - engines: {node: '>=18.0.0'} - - '@smithy/querystring-builder@4.0.4': - resolution: {integrity: sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==} - engines: {node: '>=18.0.0'} - - '@smithy/querystring-parser@4.0.4': - resolution: {integrity: sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==} - engines: {node: '>=18.0.0'} - - '@smithy/service-error-classification@4.0.5': - resolution: {integrity: sha512-LvcfhrnCBvCmTee81pRlh1F39yTS/+kYleVeLCwNtkY8wtGg8V/ca9rbZZvYIl8OjlMtL6KIjaiL/lgVqHD2nA==} - engines: {node: '>=18.0.0'} - - '@smithy/shared-ini-file-loader@4.0.4': - resolution: {integrity: sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==} - engines: {node: '>=18.0.0'} - - '@smithy/signature-v4@5.1.2': - resolution: {integrity: sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==} - engines: {node: '>=18.0.0'} - - '@smithy/smithy-client@4.4.3': - resolution: {integrity: sha512-xxzNYgA0HD6ETCe5QJubsxP0hQH3QK3kbpJz3QrosBCuIWyEXLR/CO5hFb2OeawEKUxMNhz3a1nuJNN2np2RMA==} - engines: {node: '>=18.0.0'} - - '@smithy/types@4.3.1': - resolution: {integrity: sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==} - engines: {node: '>=18.0.0'} - - '@smithy/url-parser@4.0.4': - resolution: {integrity: sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-base64@4.0.0': - resolution: {integrity: sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==} - engines: {node: '>=18.0.0'} - - '@smithy/util-body-length-browser@4.0.0': - resolution: {integrity: sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==} - engines: {node: '>=18.0.0'} - - '@smithy/util-body-length-node@4.0.0': - resolution: {integrity: sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==} - engines: {node: '>=18.0.0'} - - '@smithy/util-buffer-from@2.2.0': - resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} - engines: {node: '>=14.0.0'} - - '@smithy/util-buffer-from@4.0.0': - resolution: {integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==} - engines: {node: '>=18.0.0'} - - '@smithy/util-config-provider@4.0.0': - resolution: {integrity: sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==} - engines: {node: '>=18.0.0'} - - '@smithy/util-defaults-mode-browser@4.0.19': - resolution: {integrity: sha512-mvLMh87xSmQrV5XqnUYEPoiFFeEGYeAKIDDKdhE2ahqitm8OHM3aSvhqL6rrK6wm1brIk90JhxDf5lf2hbrLbQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-defaults-mode-node@4.0.19': - resolution: {integrity: sha512-8tYnx+LUfj6m+zkUUIrIQJxPM1xVxfRBvoGHua7R/i6qAxOMjqR6CpEpDwKoIs1o0+hOjGvkKE23CafKL0vJ9w==} - engines: {node: '>=18.0.0'} - - '@smithy/util-endpoints@3.0.6': - resolution: {integrity: sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==} - engines: {node: '>=18.0.0'} - - '@smithy/util-hex-encoding@4.0.0': - resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} - engines: {node: '>=18.0.0'} - - '@smithy/util-middleware@4.0.4': - resolution: {integrity: sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-retry@4.0.5': - resolution: {integrity: sha512-V7MSjVDTlEt/plmOFBn1762Dyu5uqMrV2Pl2X0dYk4XvWfdWJNe9Bs5Bzb56wkCuiWjSfClVMGcsuKrGj7S/yg==} - engines: {node: '>=18.0.0'} - - '@smithy/util-stream@4.2.2': - resolution: {integrity: sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==} - engines: {node: '>=18.0.0'} - - '@smithy/util-uri-escape@4.0.0': - resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} - engines: {node: '>=18.0.0'} - - '@smithy/util-utf8@2.3.0': - resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} - engines: {node: '>=14.0.0'} - - '@smithy/util-utf8@4.0.0': - resolution: {integrity: sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==} - engines: {node: '>=18.0.0'} - - '@smithy/util-waiter@4.0.5': - resolution: {integrity: sha512-4QvC49HTteI1gfemu0I1syWovJgPvGn7CVUoN9ZFkdvr/cCFkrEL7qNCdx/2eICqDWEGnnr68oMdSIPCLAriSQ==} - engines: {node: '>=18.0.0'} - - '@standard-schema/utils@0.3.0': - resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} - - '@storybook/addon-actions@6.5.16': - resolution: {integrity: sha512-aADjilFmuD6TNGz2CRPSupnyiA/IGkPJHDBTqMpsDXTUr8xnuD122xkIhg6UxmCM2y1c+ncwYXy3WPK2xXK57g==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@storybook/addon-actions@7.4.6': - resolution: {integrity: sha512-SsqZr3js5NinKPnC8AeNI7Ij+Q6fIl9tRdRmSulEgjksjOg7E5S1/Wsn5Bb2CCgj7MaX6VxGyC7s3XskQtDiIQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@storybook/addon-actions@8.6.14': - resolution: {integrity: sha512-mDQxylxGGCQSK7tJPkD144J8jWh9IU9ziJMHfB84PKpI/V5ZgqMDnpr2bssTrUaGDqU5e1/z8KcRF+Melhs9pQ==} - peerDependencies: - storybook: ^8.6.14 - - '@storybook/addon-backgrounds@6.5.16': - resolution: {integrity: sha512-t7qooZ892BruhilFmzYPbysFwpULt/q4zYXNSmKVbAYta8UVvitjcU4F18p8FpWd9WvhiTr0SDlyhNZuzvDfug==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@storybook/addon-backgrounds@7.4.6': - resolution: {integrity: sha512-+LHTZB/ZYMAzkyD5ZxSriBsqmsrvIaW/Nnd/BeuXGbkrVKKqM0qAKiFZAfjc2WchA1piVNy0/1Rsf+kuYCEiJw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@storybook/addon-backgrounds@8.6.14': - resolution: {integrity: sha512-l9xS8qWe5n4tvMwth09QxH2PmJbCctEvBAc1tjjRasAfrd69f7/uFK4WhwJAstzBTNgTc8VXI4w8ZR97i1sFbg==} - peerDependencies: - storybook: ^8.6.14 - - '@storybook/addon-controls@6.5.16': - resolution: {integrity: sha512-kShSGjq1MjmmyL3l8i+uPz6yddtf82mzys0l82VKtcuyjrr5944wYFJ5NTXMfZxrO/U6FeFsfuFZE/k6ex3EMg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@storybook/addon-controls@7.4.6': - resolution: {integrity: sha512-4lq3sycEUIsK8SUWDYc60QgF4vV9FZZ3lDr6M7j2W9bOnvGw49d2fbdlnq+bX1ZprZZ9VgglQpBAorQB3BXZRw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@storybook/addon-controls@8.6.14': - resolution: {integrity: sha512-IiQpkNJdiRyA4Mq9mzjZlvQugL/aE7hNgVxBBGPiIZG6wb6Ht9hNnBYpap5ZXXFKV9p2qVI0FZK445ONmAa+Cw==} - peerDependencies: - storybook: ^8.6.14 - - '@storybook/addon-docs@6.5.16': - resolution: {integrity: sha512-QM9WDZG9P02UvbzLu947a8ZngOrQeAKAT8jCibQFM/+RJ39xBlfm8rm+cQy3dm94wgtjmVkA3mKGOV/yrrsddg==} - peerDependencies: - '@storybook/mdx2-csf': ^0.0.3 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@storybook/mdx2-csf': - optional: true - react: - optional: true - react-dom: - optional: true - - '@storybook/addon-docs@7.4.6': - resolution: {integrity: sha512-dLaub+XWFq4hChw+xfuF9yYg0Txp77FUawKoAigccfjWXx+OOhRV3XTuAcknpXkYq94GWynHgUFXosXT9kbDNA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/addon-docs@8.6.14': - resolution: {integrity: sha512-Obpd0OhAF99JyU5pp5ci17YmpcQtMNgqW2pTXV8jAiiipWpwO++hNDeQmLmlSXB399XjtRDOcDVkoc7rc6JzdQ==} - peerDependencies: - storybook: ^8.6.14 - - '@storybook/addon-docs@9.0.12': - resolution: {integrity: sha512-bAuFy4BWGEBIC0EAS4N+V8mHj7NZiSdDnJUSr4Al3znEVzNHLpQAMRznkga2Ok8x+gwcyBG7W47dLbDXVqLZDg==} - peerDependencies: - storybook: ^9.0.12 - - '@storybook/addon-essentials@6.5.16': - resolution: {integrity: sha512-TeoMr6tEit4Pe91GH6f8g/oar1P4M0JL9S6oMcFxxrhhtOGO7XkWD5EnfyCx272Ok2VYfE58FNBTGPNBVIqYKQ==} - peerDependencies: - '@babel/core': ^7.9.6 - '@storybook/angular': '*' - '@storybook/builder-manager4': '*' - '@storybook/builder-manager5': '*' - '@storybook/builder-webpack4': '*' - '@storybook/builder-webpack5': '*' - '@storybook/html': '*' - '@storybook/vue': '*' - '@storybook/vue3': '*' - '@storybook/web-components': '*' - lit: '*' - lit-html: '*' - react: '*' - react-dom: '*' - svelte: '*' - sveltedoc-parser: '*' - vue: '*' - webpack: '*' - peerDependenciesMeta: - '@storybook/angular': - optional: true - '@storybook/builder-manager4': - optional: true - '@storybook/builder-manager5': - optional: true - '@storybook/builder-webpack4': - optional: true - '@storybook/builder-webpack5': - optional: true - '@storybook/html': - optional: true - '@storybook/vue': - optional: true - '@storybook/vue3': - optional: true - '@storybook/web-components': - optional: true - lit: - optional: true - lit-html: - optional: true - react: - optional: true - react-dom: - optional: true - svelte: - optional: true - sveltedoc-parser: - optional: true - vue: - optional: true - webpack: - optional: true - - '@storybook/addon-essentials@7.4.6': - resolution: {integrity: sha512-dWodufrt71TK7ELkeIvVae/x4PzECUlbOm57Iqqt4yQCyR291CgvI4PjeB8un2HbpcXCGZ+N/Oj3YkytvzBi4A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/addon-essentials@8.6.14': - resolution: {integrity: sha512-5ZZSHNaW9mXMOFkoPyc3QkoNGdJHETZydI62/OASR0lmPlJ1065TNigEo5dJddmZNn0/3bkE8eKMAzLnO5eIdA==} - peerDependencies: - storybook: ^8.6.14 - - '@storybook/addon-highlight@7.4.6': - resolution: {integrity: sha512-zCufxxD2KS5VwczxfkcBxe1oR/juTTn2H1Qm8kYvWCJQx3UxzX0+G9cwafbpV7eivqaufLweEwROkH+0KjAtkQ==} - - '@storybook/addon-highlight@8.6.14': - resolution: {integrity: sha512-4H19OJlapkofiE9tM6K/vsepf4ir9jMm9T+zw5L85blJZxhKZIbJ6FO0TCG9PDc4iPt3L6+aq5B0X29s9zicNQ==} - peerDependencies: - storybook: ^8.6.14 - - '@storybook/addon-interactions@8.6.14': - resolution: {integrity: sha512-8VmElhm2XOjh22l/dO4UmXxNOolGhNiSpBcls2pqWSraVh4a670EyYBZsHpkXqfNHo2YgKyZN3C91+9zfH79qQ==} - peerDependencies: - storybook: ^8.6.14 - - '@storybook/addon-links@6.5.16': - resolution: {integrity: sha512-P/mmqK57NGXnR0i3d/T5B0rIt0Lg8Yq+qionRr3LK3AwG/4yGnYt4GNomLEknn/eEwABYq1Q/Z1aOpgIhNdq5A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@storybook/addon-links@7.4.6': - resolution: {integrity: sha512-BPygElZKX+CPI9Se6GJNk1dYc5oxuhA+vHigO1tBqhiM6VkHyFP3cvezJNQvpNYhkUnu3cxnZXb3UJnlRbPY3g==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@storybook/addon-links@8.6.14': - resolution: {integrity: sha512-DRlXHIyZzOruAZkxmXfVgTF+4d6K27pFcH4cUsm3KT1AXuZbr23lb5iZHpUZoG6lmU85Sru4xCEgewSTXBIe1w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.14 - peerDependenciesMeta: - react: - optional: true - - '@storybook/addon-measure@6.5.16': - resolution: {integrity: sha512-DMwnXkmM2L6POTh4KaOWvOAtQ2p9Tr1UUNxz6VXiN5cKFohpCs6x0txdLU5WN8eWIq0VFsO7u5ZX34CGCc6gCg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@storybook/addon-measure@7.4.6': - resolution: {integrity: sha512-nCymMLaHnxv8TE3yEM1A9Tulb1NuRXRNmtsdHTkjv7P1aWCxZo8A/GZaottKe/GLT8jSRjZ+dnpYWrbAhw6wTQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@storybook/addon-measure@8.6.14': - resolution: {integrity: sha512-1Tlyb72NX8aAqm6I6OICsUuGOP6hgnXcuFlXucyhKomPa6j3Eu2vKu561t/f0oGtAK2nO93Z70kVaEh5X+vaGw==} - peerDependencies: - storybook: ^8.6.14 - - '@storybook/addon-onboarding@8.6.14': - resolution: {integrity: sha512-bHdHiGJFigVcSzMIsNLHY5IODZHr+nKwyz5/QOZLMkLcGH2IaUbOJfm4RyGOaTTPsUtAKbdsVXNEG3Otf+qO9A==} - peerDependencies: - storybook: ^8.6.14 - - '@storybook/addon-outline@6.5.16': - resolution: {integrity: sha512-0du96nha4qltexO0Xq1xB7LeRSbqjC9XqtZLflXG7/X3ABoPD2cXgOV97eeaXUodIyb2qYBbHUfftBeA75x0+w==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@storybook/addon-outline@7.4.6': - resolution: {integrity: sha512-errNUblRVDLpuEaHQPr/nsrnsUkD2ARmXawkRvizgDWLIDMDJYjTON3MUCaVx3x+hlZ3I6X//G5TVcma8tCc8A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@storybook/addon-outline@8.6.14': - resolution: {integrity: sha512-CW857JvN6OxGWElqjlzJO2S69DHf+xO3WsEfT5mT3ZtIjmsvRDukdWfDU9bIYUFyA2lFvYjncBGjbK+I91XR7w==} - peerDependencies: - storybook: ^8.6.14 - - '@storybook/addon-toolbars@6.5.16': - resolution: {integrity: sha512-y3PuUKiwOWrAvqx1YdUvArg0UaAwmboXFeR2bkrowk1xcT+xnRO3rML4npFeUl26OQ1FzwxX/cw6nknREBBLEA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@storybook/addon-toolbars@7.4.6': - resolution: {integrity: sha512-L9m2FBcKeteGq7qIYsMJr0LEfiH7Wdrv5IDcldZTn68eZUJTh1p4GdJZcOmzX1P5IFRr76hpu03iWsNlWQjpbQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@storybook/addon-toolbars@8.6.14': - resolution: {integrity: sha512-W/wEXT8h3VyZTVfWK/84BAcjAxTdtRiAkT2KAN0nbSHxxB5KEM1MjKpKu2upyzzMa3EywITqbfy4dP6lpkVTwQ==} - peerDependencies: - storybook: ^8.6.14 - - '@storybook/addon-viewport@6.5.16': - resolution: {integrity: sha512-1Vyqf1U6Qng6TXlf4SdqUKyizlw1Wn6+qW8YeA2q1lbkJqn3UlnHXIp8Q0t/5q1dK5BFtREox3+jkGwbJrzkmA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@storybook/addon-viewport@7.4.6': - resolution: {integrity: sha512-INDtk54j7bi7NgxMfd2ATmbA0J7nAd6X8itMkLIyPuPJtx8bYHPDORyemDOd0AojgmAdTOAyUtDYdI/PFeo4Cw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@storybook/addon-viewport@8.6.14': - resolution: {integrity: sha512-gNzVQbMqRC+/4uQTPI2ZrWuRHGquTMZpdgB9DrD88VTEjNudP+J6r8myLfr2VvGksBbUMHkGHMXHuIhrBEnXYA==} - peerDependencies: - storybook: ^8.6.14 - - '@storybook/addons@6.5.16': - resolution: {integrity: sha512-p3DqQi+8QRL5k7jXhXmJZLsE/GqHqyY6PcoA1oNTJr0try48uhTGUOYkgzmqtDaa/qPFO5LP+xCPzZXckGtquQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/addons@7.4.6': - resolution: {integrity: sha512-c+4awrtwNlJayFdgLkEXa5H2Gj+KNlxuN+Z5oDAdZBLqXI8g0gn7eYO2F/eCSIDWdd/+zcU2uq57XPFKc8veHQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/api@6.5.16': - resolution: {integrity: sha512-HOsuT8iomqeTMQJrRx5U8nsC7lJTwRr1DhdD0SzlqL4c80S/7uuCy4IZvOt4sYQjOzW5fOo/kamcoBXyLproTA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/blocks@7.4.6': - resolution: {integrity: sha512-HxBSAeOiTZW2jbHQlo1upRWFgoMsaAyKijUFf5MwwMNIesXCuuTGZDJ3xTABwAVLK2qC9Ektfbo0CZCiPVuDRQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/blocks@8.6.14': - resolution: {integrity: sha512-rBMHAfA39AGHgkrDze4RmsnQTMw1ND5fGWobr9pDcJdnDKWQWNRD7Nrlxj0gFlN3n4D9lEZhWGdFrCbku7FVAQ==} - 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.14 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - - '@storybook/builder-manager@7.6.20': - resolution: {integrity: sha512-e2GzpjLaw6CM/XSmc4qJRzBF8GOoOyotyu3JrSPTYOt4RD8kjUsK4QlismQM1DQRu8i39aIexxmRbiJyD74xzQ==} - - '@storybook/builder-vite@9.0.17': - resolution: {integrity: sha512-lyuvgGhb0NaVk1tdB4xwzky6+YXQfxlxfNQqENYZ9uYQZdPfErMa4ZTXVQTV+CQHAa2NL+p/dG2JPAeu39e9UA==} - peerDependencies: - storybook: ^9.0.17 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - - '@storybook/builder-webpack4@6.5.16': - resolution: {integrity: sha512-YqDIrVNsUo8r9xc6AxsYDLxVYtMgl5Bxk+8/h1adsOko+jAFhdg6hOcAVxEmoSI0TMASOOVMFlT2hr23ppN2rQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@storybook/builder-webpack5@6.5.16': - resolution: {integrity: sha512-kh8Sofm1sbijaHDWtm0sXabqACHVFjikU/fIkkW786kpjoPIPIec1a+hrLgDsZxMU3I7XapSOaCFzWt6FjVXjg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@storybook/builder-webpack5@7.4.6': - resolution: {integrity: sha512-j7AyDPlUuO2GiH6riB8iGbT7blQpyVGB+rMHXPSm7v6/U7IITbNzxFwe+sSMLoFr8K1e2VXpgqQ9p3rHFey+nw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@storybook/builder-webpack5@8.6.14': - resolution: {integrity: sha512-YZYAqc6NBKoMTKZpjxnkMch6zDtMkBZdS/yaji1+wJX2QPFBwTbSh7SpeBxDp1S11gXSAJ4f1btUWeqSqo8nJA==} - peerDependencies: - storybook: ^8.6.14 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@storybook/channel-postmessage@6.5.16': - resolution: {integrity: sha512-fZZSN29dsUArWOx7e7lTdMA9+7zijVwCwbvi2Fo4fqhRLh1DsTb/VXfz1FKMCWAjNlcX7QQvV25tnxbqsD6lyw==} - - '@storybook/channel-websocket@6.5.16': - resolution: {integrity: sha512-wJg2lpBjmRC2GJFzmhB9kxlh109VE58r/0WhFtLbwKvPqsvGf82xkBEl6BtBCvIQ4stzYnj/XijjA8qSi2zpOg==} - - '@storybook/channels@6.5.16': - resolution: {integrity: sha512-VylzaWQZaMozEwZPJdyJoz+0jpDa8GRyaqu9TGG6QGv+KU5POoZaGLDkRE7TzWkyyP0KQLo80K99MssZCpgSeg==} - - '@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/cli@7.6.20': - resolution: {integrity: sha512-ZlP+BJyqg7HlnXf7ypjG2CKMI/KVOn03jFIiClItE/jQfgR6kRFgtjRU7uajh427HHfjv9DRiur8nBzuO7vapA==} - hasBin: true - - '@storybook/cli@9.0.17': - resolution: {integrity: sha512-e/eFng34IiEGtyqxtwgG+wQeQf3h41XIf5GKNI0mEUwSRRdqYg6m2MGolF41miZ681x35QnABfoh02R5M02OMQ==} - hasBin: true - - '@storybook/client-api@6.5.16': - resolution: {integrity: sha512-i3UwkzzUFw8I+E6fOcgB5sc4oU2fhvaKnqC1mpd9IYGJ9JN9MnGIaVl3Ko28DtFItu/QabC9JsLIJVripFLktQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/client-api@7.4.6': - resolution: {integrity: sha512-O8yA/xEzPW9Oe3s5VJAFor2d2KwXHjUZ1gvou3o14zu/TJLgXwol0qBBr+YLRO2rcNNJ51pAIGwAT5bgmpUaeg==} - - '@storybook/client-logger@6.5.16': - resolution: {integrity: sha512-pxcNaCj3ItDdicPTXTtmYJE3YC1SjxFrBmHcyrN+nffeNyiMuViJdOOZzzzucTUG0wcOOX8jaSyak+nnHg5H1Q==} - - '@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/codemod@7.6.20': - resolution: {integrity: sha512-8vmSsksO4XukNw0TmqylPmk7PxnfNfE21YsxFa7mnEBmEKQcZCQsNil4ZgWfG0IzdhTfhglAN4r++Ew0WE+PYA==} - - '@storybook/codemod@9.0.17': - resolution: {integrity: sha512-mTtj4avQS3Y5ROBbIs4srCBbu8Fqpq5oVLwzNvwXysAFpWX/FWccRQ7VM+2UQE906qk3SA59HjI8s9JlcmWvcg==} - - '@storybook/components@6.5.16': - resolution: {integrity: sha512-LzBOFJKITLtDcbW9jXl0/PaG+4xAz25PK8JxPZpIALbmOpYWOAPcO6V9C2heX6e6NgWFMUxjplkULEk9RCQMNA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/components@7.4.6': - resolution: {integrity: sha512-nIRBhewAgrJJVafyCzuaLx1l+YOfvvD5dOZ0JxZsxJsefOdw1jFpUqUZ5fIpQ2moyvrR0mAUFw378rBfMdHz5Q==} - peerDependencies: - 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==} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - - '@storybook/core-client@6.5.16': - resolution: {integrity: sha512-14IRaDrVtKrQ+gNWC0wPwkCNfkZOKghYV/swCUnQX3rP99defsZK8Hc7xHIYoAiOP5+sc3sweRAxgmFiJeQ1Ig==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - typescript: '*' - webpack: ^5.94.0 - peerDependenciesMeta: - typescript: - optional: true - - '@storybook/core-client@7.4.6': - resolution: {integrity: sha512-tfgxAHeCvMcs6DsVgtb4hQSDaCHeAPJOsoyhb47eDQfk4OmxzriM0qWucJV5DePSMi+KutX/rN2u0JxfOuN68g==} - - '@storybook/core-common@6.5.16': - resolution: {integrity: sha512-2qtnKP3TTOzt2cp6LXKRTh7XrI9z5VanMnMTgeoFcA5ebnndD4V6BExQUdYPClE/QooLx6blUWNgS9dFEpjSqQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@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-events@6.5.16': - resolution: {integrity: sha512-qMZQwmvzpH5F2uwNUllTPg6eZXr2OaYZQRRN8VZJiuorZzDNdAFmiVWMWdkThwmyLEJuQKXxqCL8lMj/7PPM+g==} - - '@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-server@6.5.16': - resolution: {integrity: sha512-/3NPfmNyply395Dm0zaVZ8P9aruwO+tPx4D6/jpw8aqrRSwvAMndPMpoMCm0NXcpSm5rdX+Je4S3JW6JcggFkA==} - peerDependencies: - '@storybook/builder-webpack5': '*' - '@storybook/manager-webpack5': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - typescript: '*' - peerDependenciesMeta: - '@storybook/builder-webpack5': - optional: true - '@storybook/manager-webpack5': - optional: true - typescript: - optional: true - - '@storybook/core-server@7.6.20': - resolution: {integrity: sha512-qC5BdbqqwMLTdCwMKZ1Hbc3+3AaxHYWLiJaXL9e8s8nJw89xV8c8l30QpbJOGvcDmsgY6UTtXYaJ96OsTr7MrA==} - - '@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==} - peerDependencies: - storybook: ^8.6.14 - - '@storybook/core@6.5.16': - resolution: {integrity: sha512-CEF3QFTsm/VMnMKtRNr4rRdLeIkIG0g1t26WcmxTdSThNPBd8CsWzQJ7Jqu7CKiut+MU4A1LMOwbwCE5F2gmyA==} - peerDependencies: - '@storybook/builder-webpack5': '*' - '@storybook/manager-webpack5': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - typescript: '*' - webpack: ^5.94.0 - peerDependenciesMeta: - '@storybook/builder-webpack5': - optional: true - '@storybook/manager-webpack5': - optional: true - typescript: - optional: true - - '@storybook/core@8.6.14': - resolution: {integrity: sha512-1P/w4FSNRqP8j3JQBOi3yGt8PVOgSRbP66Ok520T78eJBeqx9ukCfl912PQZ7SPbW3TIunBwLXMZOjZwBB/JmA==} - peerDependencies: - prettier: ^2 || ^3 - peerDependenciesMeta: - prettier: - optional: true - - '@storybook/csf-plugin@7.4.6': - resolution: {integrity: sha512-yi7Qa4NSqKOyiJTWCxlB0ih2ijXq6oY5qZKW6MuMMBP14xJNRGLbH5KabpfXgN2T7YECcOWG1uWaGj2veJb1KA==} - - '@storybook/csf-plugin@8.6.14': - resolution: {integrity: sha512-dErtc9teAuN+eelN8FojzFE635xlq9cNGGGEu0WEmMUQ4iJ8pingvBO1N8X3scz4Ry7KnxX++NNf3J3gpxS8qQ==} - peerDependencies: - storybook: ^8.6.14 - - '@storybook/csf-plugin@9.0.12': - resolution: {integrity: sha512-5EueJQJAu77Lh+EedG4Q/kEOZNlTY/g+fWsT7B5DTtLVy0ypnghsHY8X3KYT/0+NNgTtoO0if4F+ejVYaLnMzA==} - peerDependencies: - storybook: ^9.0.12 - - '@storybook/csf-plugin@9.0.17': - resolution: {integrity: sha512-6Q4eo1ObrLlsnB6bIt6T8+45XAb4to2pQGNrI7QPkLQRLrZinrJcNbLY7AGkyIoCOEsEbq08n09/nClQUbu8HA==} - peerDependencies: - storybook: ^9.0.17 - - '@storybook/csf-tools@6.5.16': - resolution: {integrity: sha512-+WD4sH/OwAfXZX3IN6/LOZ9D9iGEFcN+Vvgv9wOsLRgsAZ10DG/NK6c1unXKDM/ogJtJYccNI8Hd+qNE/GFV6A==} - peerDependencies: - '@storybook/mdx2-csf': ^0.0.3 - peerDependenciesMeta: - '@storybook/mdx2-csf': - optional: true - - '@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@0.0.2--canary.4566f4d.1': - resolution: {integrity: sha512-9OVvMVh3t9znYZwb0Svf/YQoxX2gVOeQTGe2bses2yj+a3+OJnCrUF3/hGv6Em7KujtOdL2LL+JnG49oMVGFgQ==} - - '@storybook/csf@0.1.13': - resolution: {integrity: sha512-7xOOwCLGB3ebM87eemep89MYRFTko+D8qE7EdAAq74lgdqRR5cOUtYWJLjO2dLtP94nqoOdHJo6MdLLKzg412Q==} - - '@storybook/docs-mdx@0.1.0': - resolution: {integrity: sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==} - - '@storybook/docs-tools@6.5.16': - resolution: {integrity: sha512-o+rAWPRGifjBF5xZzTKOqnHN3XQWkl0QFJYVDIiJYJrVll7ExCkpEq/PahOGzIBBV+tpMstJgmKM3lr/lu/jmg==} - - '@storybook/docs-tools@7.4.6': - resolution: {integrity: sha512-nZj1L/8WwKWWJ41FW4MaKGajZUtrhnr9UwflRCkQJaWhAKmDfOb5M5TqI93uCOULpFPOm5wpoMBz2IHInQ2Lrg==} - - '@storybook/global@5.0.0': - resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - - '@storybook/icons@1.4.0': - resolution: {integrity: sha512-Td73IeJxOyalzvjQL+JXx72jlIYHgs+REaHiREOqfpo3A2AYYG71AUbcv+lg7mEDIweKVCxsMQ0UKo634c8XeA==} - engines: {node: '>=14.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/instrumenter@8.6.14': - resolution: {integrity: sha512-iG4MlWCcz1L7Yu8AwgsnfVAmMbvyRSk700Mfy2g4c8y5O+Cv1ejshE1LBBsCwHgkuqU0H4R0qu4g23+6UnUemQ==} - peerDependencies: - storybook: ^8.6.14 - - '@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==} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - - '@storybook/manager-webpack4@6.5.16': - resolution: {integrity: sha512-5VJZwmQU6AgdsBPsYdu886UKBHQ9SJEnFMaeUxKEclXk+iRsmbzlL4GHKyVd6oGX/ZaecZtcHPR6xrzmA4Ziew==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@storybook/manager-webpack5@6.5.16': - resolution: {integrity: sha512-OtxXv8JCe0r/0rE5HxaFicsNsXA+fqZxzokxquFFgrYf/1Jg4d7QX6/pG5wINF+5qInJfVkRG6xhPzv1s5bk9Q==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@storybook/manager@7.6.20': - resolution: {integrity: sha512-0Cf6WN0t7yEG2DR29tN5j+i7H/TH5EfPppg9h9/KiQSoFHk+6KLoy2p5do94acFU+Ro4+zzxvdCGbcYGKuArpg==} - - '@storybook/mdx1-csf@0.0.1': - resolution: {integrity: sha512-4biZIWWzoWlCarMZmTpqcJNgo/RBesYZwGFbQeXiGYsswuvfWARZnW9RE9aUEMZ4XPn7B1N3EKkWcdcWe/K2tg==} - - '@storybook/mdx2-csf@1.1.0': - resolution: {integrity: sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==} - - '@storybook/node-logger@6.5.16': - resolution: {integrity: sha512-YjhBKrclQtjhqFNSO+BZK+RXOx6EQypAELJKoLFaawg331e8VUfvUuRCNB3fcEWp8G9oH13PQQte0OTjLyyOYg==} - - '@storybook/node-logger@7.4.6': - resolution: {integrity: sha512-djZb310Q27GviDug1XBv0jOEDLCiwr4hhDE0aifCEKZpfNCi/EaP31nbWimFzZwxu4hE/YAPWExzScruR1zw9Q==} - - '@storybook/node-logger@7.6.20': - resolution: {integrity: sha512-l2i4qF1bscJkOplNffcRTsgQWYR7J51ewmizj5YrTM8BK6rslWT1RntgVJWB1RgPqvx6VsCz1gyP3yW1oKxvYw==} - - '@storybook/postinstall@6.5.16': - resolution: {integrity: sha512-08K2q+qN6pqyPW7PHLCZ5G5Xa6Wosd6t0F16PQ4abX2ItlJLabVoJN5mZ0gm/aeLTjD8QYr8IDvacu4eXh0SVA==} - - '@storybook/postinstall@7.4.6': - resolution: {integrity: sha512-TqI5BucPAGRWrkh55BYiG2/gHLFtC0In4cuu0GsUzB/1jc4i51npLRorCwhmT7r7YliGl5F7JaP0Bni/qHN3Lg==} - - '@storybook/preset-react-webpack@7.4.6': - resolution: {integrity: sha512-FfJvlk3bJfg66t06YLiyu+1o/DZN3uNfFP37zv5cJux7TpdmJRV/4m9LKQPJOvcnWBQYem8xX8k5cRS29vdW5g==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@babel/core': ^7.22.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - typescript: '*' - peerDependenciesMeta: - '@babel/core': - optional: true - typescript: - optional: true - - '@storybook/preset-react-webpack@8.6.14': - resolution: {integrity: sha512-M7Q6ErNx7N2hQorTz0OLa3YV8nc8OcvkDlCxqqnkHPGQNEIWEpeDvq3wn2OvZlrHDpchyuiquGXZ8aztVtBP2g==} - 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 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@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@8.6.14': - resolution: {integrity: sha512-2GhcCd4dNMrnD7eooEfvbfL4I83qAqEyO0CO7JQAmIO6Rxb9BsOLLI/GD5HkvQB73ArTJ+PT50rfaO820IExOQ==} - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - - '@storybook/preview-web@6.5.16': - resolution: {integrity: sha512-IJnvfe2sKCfk7apN9Fu9U8qibbarrPX5JB55ZzK1amSHVmSDuYk5MIMc/U3NnSQNnvd1DO5v/zMcGgj563hrtg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/preview@7.4.6': - resolution: {integrity: sha512-2RPXusJ4CTDrIipIKKvbotD7fP0+8VzoFjImunflIrzN9rni+2rq5eMjqlXAaB+77w064zIR4uDUzI9fxsMDeQ==} - - '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0': - resolution: {integrity: sha512-eVg3BxlOm2P+chijHBTByr90IZVUtgRW56qEOLX7xlww2NBuKrcavBlcmn+HH7GIUktquWkMPtvy6e0W0NgA5w==} - peerDependencies: - typescript: '>= 3.x' - webpack: ^5.94.0 - - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0': - resolution: {integrity: sha512-KUqXC3oa9JuQ0kZJLBhVdS4lOneKTOopnNBK4tUAgoxWQ3u/IjzdueZjFr7gyBrXMoU6duutk3RQR9u8ZpYJ4Q==} - peerDependencies: - typescript: '>= 4.x' - webpack: ^5.94.0 - - '@storybook/react-dom-shim@7.4.6': - resolution: {integrity: sha512-DSq8l9FDocUF1ooVI+TF83pddj1LynE/Hv0/y8XZhc3IgJ/HkuOQuUmfz29ezgfAi9gFYUR8raTIBi3/xdoRmw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/react-dom-shim@8.6.14': - resolution: {integrity: sha512-0hixr3dOy3f3M+HBofp3jtMQMS+sqzjKNgl7Arfuj3fvjmyXOks/yGjDImySR4imPtEllvPZfhiQNlejheaInw==} - 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/react-dom-shim@9.0.12': - resolution: {integrity: sha512-OMBitzkJRga/UJF1ScSnaxgBSlAVePCK8wzPkGDn0MmsjZ4oDWuNZeKnVO1+tb6n2rZHws7RmKGxHzHAZTY+zQ==} - 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: ^9.0.12 - - '@storybook/react-dom-shim@9.0.17': - resolution: {integrity: sha512-ak/x/m6MDDxdE6rCDymTltaiQF3oiKrPHSwfM+YPgQR6MVmzTTs4+qaPfeev7FZEHq23IkfDMTmSTTJtX7Vs9A==} - 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: ^9.0.17 - - '@storybook/react-vite@9.0.17': - resolution: {integrity: sha512-wx1yKScni4ifOC/ccqpnnpceQbyF2xto+jHGsyua+M4UUCQdS2NYPDR8JFWp1YvBhVt2cQiD6SAltVGM9QLGnQ==} - engines: {node: '>=20.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: ^9.0.17 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - - '@storybook/react-webpack5@7.4.6': - resolution: {integrity: sha512-OSwf+E2tRcfBmzCH+WwM7JlfEYjg5Womi1yrtotfcjVXAU6ubHOk2G87zsrKLp/TeCOFM2aHohHBTyWUCejQKQ==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@babel/core': ^7.22.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - typescript: '*' - peerDependenciesMeta: - '@babel/core': - optional: true - typescript: - optional: true - - '@storybook/react-webpack5@8.6.14': - resolution: {integrity: sha512-ka0q9tQBLruhO38sybP/MkZzejqAltce7HJTJ2KKbUYUlbvuG7m56tBX7DVC5JaImbsO3b8fqOrKH7gRt4KYrQ==} - 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 - typescript: '>= 4.2.x' - peerDependenciesMeta: - typescript: - optional: true - - '@storybook/react@6.5.16': - resolution: {integrity: sha512-cBtNlOzf/MySpNLBK22lJ8wFU22HnfTB2xJyBk7W7Zi71Lm7Uxkhv1Pz8HdiQndJ0SlsAAQOWjQYsSZsGkZIaA==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - '@babel/core': ^7.11.5 - '@storybook/builder-webpack4': '*' - '@storybook/builder-webpack5': '*' - '@storybook/manager-webpack4': '*' - '@storybook/manager-webpack5': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - require-from-string: ^2.0.2 - typescript: '*' - peerDependenciesMeta: - '@babel/core': - optional: true - '@storybook/builder-webpack4': - optional: true - '@storybook/builder-webpack5': - optional: true - '@storybook/manager-webpack4': - optional: true - '@storybook/manager-webpack5': - optional: true - typescript: - optional: true - - '@storybook/react@7.4.6': - resolution: {integrity: sha512-w0dVo64baFFPTGpUOWFqkKsu6pQincoymegSNgqaBd5DxEyMDRiRoTWSJHMKE9BwgE8SyWhRkP1ak1mkccSOhQ==} - engines: {node: '>=16.0.0'} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@storybook/react@8.6.14': - resolution: {integrity: sha512-BOepx5bBFwl/CPI+F+LnmMmsG1wQYmrX/UQXgUbHQUU9Tj7E2ndTnNbpIuSLc8IrM03ru+DfwSg1Co3cxWtT+g==} - engines: {node: '>=18.0.0'} - peerDependencies: - '@storybook/test': 8.6.14 - 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 - typescript: '>= 4.2.x' - peerDependenciesMeta: - '@storybook/test': - optional: true - typescript: - optional: true - - '@storybook/react@9.0.12': - resolution: {integrity: sha512-rDrf5MDfsguNDTSOfGqhAjQDhp3jDMdzAoCqLjQ75M647C8nsv9i+fftO3k0rMxIJRrESpZWqVZ4tsjOX+J3DA==} - engines: {node: '>=20.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: ^9.0.12 - typescript: '>= 4.9.x' - peerDependenciesMeta: - typescript: - optional: true - - '@storybook/react@9.0.17': - resolution: {integrity: sha512-wssao+uXg72OHtEJdQmmQJGdX90x/aU/6avoP3fgVgepWdZXVgciS9mnqHjKRF/vP+vPOlNQcJjojF/zTtq5qg==} - engines: {node: '>=20.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: ^9.0.17 - typescript: '>= 4.9.x' - peerDependenciesMeta: - typescript: - optional: true - - '@storybook/router@6.5.16': - resolution: {integrity: sha512-ZgeP8a5YV/iuKbv31V8DjPxlV4AzorRiR8OuSt/KqaiYXNXlOoQDz/qMmiNcrshrfLpmkzoq7fSo4T8lWo2UwQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/router@7.4.6': - resolution: {integrity: sha512-Vl1esrHkcHxDKqc+HY7+6JQpBPW3zYvGk0cQ2rxVMhWdLZTAz1hss9DqzN9tFnPyfn0a1Q77EpMySkUrvWKKNQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/semver@7.3.2': - resolution: {integrity: sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==} - engines: {node: '>=10'} - hasBin: true - - '@storybook/source-loader@6.5.16': - resolution: {integrity: sha512-fyVl4jrM/5JLrb48aqXPu7sTsmySQaVGFp1zfeqvPPlJRFMastDrePm5XGPN7Qjv1wsKmpuBvuweFKOT1pru3g==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/store@6.5.16': - resolution: {integrity: sha512-g+bVL5hmMq/9cM51K04e37OviUPHT0rHHrRm5wj/hrf18Kd9120b3sxdQ5Dc+HZ292yuME0n+cyrQPTYx9Epmw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/store@7.4.6': - resolution: {integrity: sha512-tlm9rQ+djkYjEyCuEjaUv+c+jVgwnMEF9mZxnOoA6zrzU2g0S/1oE9/MdVLByGbH67U0NuuP0FcvsWLhAOQzjQ==} - - '@storybook/telemetry@6.5.16': - resolution: {integrity: sha512-CWr5Uko1l9jJW88yTXsZTj/3GTabPvw0o7pDPOXPp8JRZiJTxv1JFaFCafhK9UzYbgcRuGfCC8kEWPZims7iKA==} - - '@storybook/telemetry@7.6.20': - resolution: {integrity: sha512-dmAOCWmOscYN6aMbhCMmszQjoycg7tUPRVy2kTaWg6qX10wtMrvEtBV29W4eMvqdsoRj5kcvoNbzRdYcWBUOHQ==} - - '@storybook/test@8.6.14': - resolution: {integrity: sha512-GkPNBbbZmz+XRdrhMtkxPotCLOQ1BaGNp/gFZYdGDk2KmUWBKmvc5JxxOhtoXM2703IzNFlQHSSNnhrDZYuLlw==} - peerDependencies: - storybook: ^8.6.14 - - '@storybook/theming@6.5.16': - resolution: {integrity: sha512-hNLctkjaYLRdk1+xYTkC1mg4dYz2wSv6SqbLpcKMbkPHTE0ElhddGPHQqB362md/w9emYXNkt1LSMD8Xk9JzVQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - - '@storybook/theming@7.4.6': - resolution: {integrity: sha512-HW77iJ9ptCMqhoBOYFjRQw7VBap+38fkJGHP5KylEJCyYCgIAm2dEcQmtWpMVYFssSGcb6djfbtAMhYU4TL4Iw==} - peerDependencies: - 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==} - 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/ui@6.5.16': - resolution: {integrity: sha512-rHn/n12WM8BaXtZ3IApNZCiS+C4Oc5+Lkl4MoctX8V7QSml0SxZBB5hsJ/AiWkgbRxjQpa/L/Nt7/Qw0FjTH/A==} - peerDependencies: - 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-beta.43': - resolution: {integrity: sha512-4S/Reji9JFuFP3sEAjPpNHgoBV0Uck9FyOiCrlZgAqydvrsBfJ8VS5Xu2rP0aZNbOkY08whtSTeZMxjq/1chTw==} - - '@swagger-api/apidom-core@1.0.0-beta.43': - resolution: {integrity: sha512-NxBKA+gToSCWi9PUAeCyQg2WO/nmkqJ4XVGrUpSzqqJZL7UTtaTHqxBm9h8TdFvSxpeD/PmVijT+hcqVJhvTUA==} - - '@swagger-api/apidom-error@1.0.0-beta.43': - resolution: {integrity: sha512-3ycgT9wX+oWLNqRpLM44b7f38NEVqk+E6Ac67ybP6rVuxi9tiGTaDRsvMGoijbCsz8e6ebREbsLiwz0IvEXD1g==} - - '@swagger-api/apidom-json-pointer@1.0.0-beta.43': - resolution: {integrity: sha512-yUDfj/MFtUee/Pp24ubLMD/S1GuDk/vIkyKrCpNTXm9wmbs181G1tr9K3/7l7wFJknkvI6RRNXR6/9pTaITIXQ==} - - '@swagger-api/apidom-ns-api-design-systems@1.0.0-beta.43': - resolution: {integrity: sha512-Ad9SWEushiZ8G73R0g96RdV7pzW6eMuCCAnVpMjKPspLrRkQk+1wW0vQU2UOvJZXgxzob8Oq79YXWWnUDkwnLg==} - - '@swagger-api/apidom-ns-arazzo-1@1.0.0-beta.43': - resolution: {integrity: sha512-RQVAGmtS+0izlCnvGmRHWfZ0dvekZNRw/q+MhssNKTBA1dXcjqpHQ1+q6AUh7FsOg6+vO98iyRvF9K8EvRrLiw==} - - '@swagger-api/apidom-ns-asyncapi-2@1.0.0-beta.43': - resolution: {integrity: sha512-dp1PgbiwXLnU1XiTtzUPj4p/pbg4XEqNom8hWXORqph/539bRkZ8ce+HcjjE+aWZMDivRhO45IH9Qyrv5YnNvA==} - - '@swagger-api/apidom-ns-json-schema-2019-09@1.0.0-beta.43': - resolution: {integrity: sha512-m0jQXPhlAyUxn4A3Pn+SOmQY0U1wTAyPFx/Vb3EO0q0vYcvBF9YbGJ5rv9ey6c9PNmRX3p1A16oQhhCIGouq4w==} - - '@swagger-api/apidom-ns-json-schema-2020-12@1.0.0-beta.43': - resolution: {integrity: sha512-LdKzRytBqMF1Df9lqAPqm976u4L/E+La00UdJnd4Vj1bY4BrhKqToMwXZyLXMVCOCRKWbwK28Q62i2lAYE881A==} - - '@swagger-api/apidom-ns-json-schema-draft-4@1.0.0-beta.43': - resolution: {integrity: sha512-eQobpiECGLd0SwyJYNsnliIU33UcwubbIOl0HlWAM0kS/F7PUeA36beq4nZnpArTySBra4Ye+S9NW9nhQ8UHsw==} - - '@swagger-api/apidom-ns-json-schema-draft-6@1.0.0-beta.43': - resolution: {integrity: sha512-+cmcJ+lHtOdxlm/3a85cHjVp28C9WNUXHsBIUdaVUL2cEEue4d1CMZmBwBa6s4gUAEE+hluRxR+d6VZzIN8bPQ==} - - '@swagger-api/apidom-ns-json-schema-draft-7@1.0.0-beta.43': - resolution: {integrity: sha512-xkmILa+H8+3CNsYZXd1SGyHJQ854uJEO2k03QLtE+TiLvAd7yZAq68mqETTYeU1pyCV9Ksm+OByMHS3bF0GRGw==} - - '@swagger-api/apidom-ns-openapi-2@1.0.0-beta.43': - resolution: {integrity: sha512-+16xczQTr+C1GE3pa8TMDJbReLhIvwHS2VseADBQFgU+3zVSJhmfWTpI34zJ1v1bnTXZIB17PP9KUG2l/Q1/ww==} - - '@swagger-api/apidom-ns-openapi-3-0@1.0.0-beta.43': - resolution: {integrity: sha512-6T8O9C40yFHXASh00UV3AgVeClHPjfA3zKtAcgXpgI8ZvMZRbp5Z3lSuG35PYZmmmKgLuEclywjboIfUBA4dag==} - - '@swagger-api/apidom-ns-openapi-3-1@1.0.0-beta.43': - resolution: {integrity: sha512-9oqgKa1V6Zi1ezVh25GFw8Dty4kiScnnNyuULhYlIHspzkFSNaLKM75aonSAvL79YBEiF78q9cw6yfy0sy+CxQ==} - - '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.0.0-beta.43': - resolution: {integrity: sha512-AnPyqxa9mM2GlhSJ6/+FPG+tgfaHtxs3B5+NULAbXbZ+enkyhZOs3iF2wpIFO6JaW6litXrwKsJYV+ul7Igyew==} - - '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.0.0-beta.43': - resolution: {integrity: sha512-/G9T1y9rJl8d116iUWW99OznUVxjMVMA7iOCCHP7YppgLmFf/l8Eh5eHdaUXgsvlnYMwOqtflg+46lYi1oe7Uw==} - - '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.0.0-beta.43': - resolution: {integrity: sha512-aHOXZcNb6ciI6PUiYfW7LGCyWOcf2VTvl9k7Bnp78JCZ3S0BFOKiokH9E2MZSQuT6GkPkaEiUzKHsaYN0//Lhw==} - - '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.0.0-beta.43': - resolution: {integrity: sha512-ky9S4fNJSew6Z+LC3Kj/Fs4r0rKKFvbQhpsRnHau2m0Fg9GIKFB8XhNVy28vfJQ7V4YWHiSYm3Xf+0qla6h8+Q==} - - '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.0.0-beta.43': - resolution: {integrity: sha512-b1q2SK7t0EVU3TzmfX6/Qo9o3BtXbJLFqt9xihNeaNNzNx7gJmyvILNejWP/R9pv8GwWKZeDS3rKmrJMDrtloQ==} - - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.0.0-beta.43': - resolution: {integrity: sha512-7MzYHLPzvuj+QGp4C5HwSpuWIZ+ywio0IUn6RJIboN0YLWcsUaapTL63uQ59nIsInM1yEh0mXg1aikt/BY58cA==} - - '@swagger-api/apidom-parser-adapter-json@1.0.0-beta.43': - resolution: {integrity: sha512-Jm14OxAVEiaNfXXxio/BVUr0Znf1OLRVMCHAalCYgc1745p2R0BBzbESVOQrEblgfPJxdR6NDst6gESKad32Tg==} - - '@swagger-api/apidom-parser-adapter-openapi-json-2@1.0.0-beta.43': - resolution: {integrity: sha512-ZRmXBVgAxqMST9Dj+3mzQl7yqW/KT8+OnS8IrNjuDETkC/SjZ8oqKpnrOPCMfK6f++y/XPtjCMbomL5kZw/ZDQ==} - - '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.0.0-beta.43': - resolution: {integrity: sha512-Kvg0Yz1CTo1vED4T1yGnQuZqgs0VEKLfE5VjDN1tXrgoPcc8f+9Ve2omapIXz7UZ+WyYva9V+RDYPrzPLRevCw==} - - '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.0.0-beta.43': - resolution: {integrity: sha512-EorhEnAnmCOCtjzaWkIFPzFwndG62wfDXUh/rqcsaX95d7wN9LOxRGHsPMIL5S3qBhDYkXS7DHMiWOrRzGW+Cw==} - - '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.0.0-beta.43': - resolution: {integrity: sha512-7mfyAu0gY4QmbhTKe6m1k1Uj9/W6X2Iq8RY/lsz9NU5PHj7Q4VgyN1xYbx37fWzpIk+HQ/vB1ddCWi0uc3DwsA==} - - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.0.0-beta.43': - resolution: {integrity: sha512-LD62C+Q6lINNHTJ28JfgrllqWr9wbdRChHLP+nH0Bj0VbR6DKSKfSTyPbkN7FHM0qMcXOpj9kcmFY+e3p+u+NQ==} - - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.0.0-beta.43': - resolution: {integrity: sha512-jMCbdIY93WNuhcLnUQEtrH5tvuaoBW4lnJLSJEwCO9gbCTc/Y5bAGiOls5bsZcUMX3INLG7hqgc0vPY662D76w==} - - '@swagger-api/apidom-parser-adapter-yaml-1-2@1.0.0-beta.43': - resolution: {integrity: sha512-1izTQNYBQoWQ3BDKDMdV07vx7fBtqIrIwsvu7474GGQ2z4J0hgV1XJXPcmj59A/2GX2NuRRmw24eB4ZN1YN99Q==} - - '@swagger-api/apidom-reference@1.0.0-beta.43': - resolution: {integrity: sha512-XKg9Wxg0hrLQL969DWJCdGRnPg6k7P0MnaaN0jPy1gacHftkcdoY9rrIzfgCDIUrGxs9Xpks4V2F4MTS/tKh8Q==} - - '@swaggerexpert/cookie@2.0.2': - resolution: {integrity: sha512-DPI8YJ0Vznk4CT+ekn3rcFNq1uQwvUHZhH6WvTSPD0YKBIlMS9ur2RYKghXuxxOiqOam/i4lHJH4xTIiTgs3Mg==} - engines: {node: '>=12.20.0'} - - '@swaggerexpert/json-pointer@2.10.2': - resolution: {integrity: sha512-qMx1nOrzoB+PF+pzb26Q4Tc2sOlrx9Ba2UBNX9hB31Omrq+QoZ2Gly0KLrQWw4Of1AQ4J9lnD+XOdwOdcdXqqw==} - engines: {node: '>=12.20.0'} - - '@swc/core-darwin-arm64@1.12.5': - resolution: {integrity: sha512-3WF+naP/qkt5flrTfJr+p07b522JcixKvIivM7FgvllA6LjJxf+pheoILrTS8IwrNAK/XtHfKWYcGY+3eaA4mA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [darwin] - - '@swc/core-darwin-x64@1.12.5': - resolution: {integrity: sha512-GCcD3dft8YN7unTBcW02Fx41jXp2MNQHCjx5ceWSEYOGvn7vBSUp7k7LkfTxGN5Ftxb9a1mxhPq8r4rD2u/aPw==} - engines: {node: '>=10'} - cpu: [x64] - os: [darwin] - - '@swc/core-linux-arm-gnueabihf@1.12.5': - resolution: {integrity: sha512-jWlzP/Y4+wbE/EJM+WGIDQsklLFV3g5LmbYTBgrY4+5nb517P31mkBzf5y2knfNWPrL7HzNu0578j3Zi2E6Iig==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux] - - '@swc/core-linux-arm64-gnu@1.12.5': - resolution: {integrity: sha512-GkzgIUz+2r6J6Tn3hb7/4ByaWHRrRZt4vuN9BLAd+y65m2Bt0vlEpPtWhrB/TVe4hEkFR+W5PDETLEbUT4i0tQ==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - - '@swc/core-linux-arm64-musl@1.12.5': - resolution: {integrity: sha512-g0AJ7QmZPj3Uw+C5pDa48LAUG7JBgQmB0mN5cW+s2mjaFKT0mTSxYALtx/MDZwJExDPo0yJV8kSbFO1tvFPyhg==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux] - - '@swc/core-linux-x64-gnu@1.12.5': - resolution: {integrity: sha512-PeYoSziNy+iNiBHPtAsO84bzBne/mbCsG5ijYkAhS1GVsDgohClorUvRXXhcUZoX2gr8TfSI9WLHo30K+DKiHg==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-linux-x64-musl@1.12.5': - resolution: {integrity: sha512-EJrfCCIyuV5LLmYgKtIMwtgsnjVesdFe0IgQzEKs9OfB6cL6g7WO9conn8BkGX8jphVa7jChKxShDGkreWWDzA==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux] - - '@swc/core-win32-arm64-msvc@1.12.5': - resolution: {integrity: sha512-FnwT7fxkJJMgsfiDoZKEVGyCzrPFbzpflFAAoTCUCu3MaHw6mW55o/MAAfofvJ1iIcEpec4o93OilsmKtpyO5Q==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - - '@swc/core-win32-ia32-msvc@1.12.5': - resolution: {integrity: sha512-jW6l4KFt9mIXSpGseE6BQOEFmbIeXeShDuWgldEJXKeXf/uPs8wrqv80XBIUwVpK0ZbmJwPQ0waGVj8UM3th2Q==} - engines: {node: '>=10'} - cpu: [ia32] - os: [win32] - - '@swc/core-win32-x64-msvc@1.12.5': - resolution: {integrity: sha512-AZszwuEjlz1tSNLQRm3T5OZJ5eebxjJlDQnnzXJmg0B7DJMRoaAe1HTLOmejxjFK6yWr7fh+pSeCw2PgQLxgqA==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - - '@swc/core@1.12.5': - resolution: {integrity: sha512-KxA0PHHIuUBmQ/Oi+xFpVzILj2Oo37sTtftCbyowQlyx5YOknEOw1kLpas5hMcpznXgFyAWbpK71xQps4INPgA==} - engines: {node: '>=10'} - peerDependencies: - '@swc/helpers': '>=0.5.17' - peerDependenciesMeta: - '@swc/helpers': - optional: true - - '@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/types@0.1.23': - resolution: {integrity: sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==} - - '@szmarczak/http-timer@5.0.1': - resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} - engines: {node: '>=14.16'} - - '@tanstack/query-core@4.27.0': - resolution: {integrity: sha512-sm+QncWaPmM73IPwFlmWSKPqjdTXZeFf/7aEmWh00z7yl2FjqophPt0dE1EHW9P1giMC5rMviv7OUbSDmWzXXA==} - - '@tanstack/query-core@4.40.0': - resolution: {integrity: sha512-7MJTtZkCSuehMC7IxMOCGsLvHS3jHx4WjveSrGsG1Nc1UQLjaFwwkpLA2LmPfvOAxnH4mszMOBFD6LlZE+aB+Q==} - - '@tanstack/query-core@5.76.0': - resolution: {integrity: sha512-FN375hb8ctzfNAlex5gHI6+WDXTNpe0nbxp/d2YJtnP+IBM6OUm7zcaoCW6T63BawGOYZBbKC0iPvr41TteNVg==} - - '@tanstack/query-core@5.76.2': - resolution: {integrity: sha512-PFGwWh5ss9cJQ67l6bZ7hqXbisX2gy13G2jP+VGY1bgdbCfOMWh6UBVnN62QbFXro6CCoX9hYzTnZHr6Rz00YQ==} - - '@tanstack/query-core@5.77.1': - resolution: {integrity: sha512-nfxVhy4UynChMFfN4NxwI8pktV9R3Zt/ROxOAe6pdOf8CigDLn26p+ex1YW5uien26BBICLmN0dTvIELHCs5vw==} - - '@tanstack/query-core@5.81.2': - resolution: {integrity: sha512-QLYkPdrudoMATDFa3MiLEwRhNnAlzHWDf0LKaXUqJd0/+QxN8uTPi7bahRlxoAyH0UbLMBdeDbYzWALj7THOtw==} - - '@tanstack/query-persist-client-core@4.27.0': - resolution: {integrity: sha512-A+dPA7zG0MJOMDeBc/2WcKXW4wV2JMkeBVydobPW9G02M4q0yAj7vI+7SmM2dFuXyIvxXp4KulCywN6abRKDSQ==} - - '@tanstack/react-query-persist-client@4.28.0': - resolution: {integrity: sha512-xNpi3YdPOQIyYkKhByYDqTlyCeqICWFhV5PWkoVxYfzlRK6HYX4s+9Int407jEvhBz9cGC4OaL7rd6bynCFrYg==} - peerDependencies: - '@tanstack/react-query': 4.28.0 - - '@tanstack/react-query@4.0.10': - resolution: {integrity: sha512-Wn5QhZUE5wvr6rGClV7KeQIUsdTmYR9mgmMZen7DSRWauHW2UTynFg3Kkf6pw+XlxxOLsyLWwz/Q6q1lSpM3TQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-native: '*' - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true - - '@tanstack/react-query@4.28.0': - resolution: {integrity: sha512-8cGBV5300RHlvYdS4ea+G1JcZIt5CIuprXYFnsWggkmGoC0b5JaqG0fIX3qwDL9PTNkKvG76NGThIWbpXivMrQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-native: '*' - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true - - '@tanstack/react-query@5.76.1': - resolution: {integrity: sha512-YxdLZVGN4QkT5YT1HKZQWiIlcgauIXEIsMOTSjvyD5wLYK8YVvKZUPAysMqossFJJfDpJW3pFn7WNZuPOqq+fw==} - peerDependencies: - react: ^18 || ^19 - - '@tanstack/react-query@5.76.2': - resolution: {integrity: sha512-rGkWberCrFdIxMdvSAJM/UOKeu0O/JVTbMmfhQoJpiU9Uq0EDx2EMCadnNuJWbXR4smDA2t7DY3NKkYFmDVS5A==} - peerDependencies: - react: ^18 || ^19 - - '@tanstack/react-query@5.77.1': - resolution: {integrity: sha512-qBwpxFg0+MZF0fICQwgvzwrVbcs7TdQlLyEd1f1dN83oeIALofCIAJHV7sPWu+BCS5tcXkG5CvOuf7yla8GYqQ==} - peerDependencies: - react: ^18 || ^19 - - '@tanstack/react-virtual@3.13.10': - resolution: {integrity: sha512-nvrzk4E9mWB4124YdJ7/yzwou7IfHxlSef6ugCFcBfRmsnsma3heciiiV97sBNxyc3VuwtZvmwXd0aB5BpucVw==} - 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.10': - resolution: {integrity: sha512-sPEDhXREou5HyZYqSWIqdU580rsF6FGeN7vpzijmP3KTiOGjOMZASz4Y6+QKjiFQwhWrR58OP8izYaNGVxvViA==} - - '@testing-library/dom@10.4.0': - resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} - engines: {node: '>=18'} - - '@testing-library/jest-dom@6.5.0': - resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - - '@testing-library/jest-dom@6.6.3': - resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} - engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - - '@testing-library/react@16.3.0': - resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==} - engines: {node: '>=18'} - peerDependencies: - '@testing-library/dom': ^10.0.0 - '@types/react': ^18.0.0 || ^19.0.0 - '@types/react-dom': ^18.0.0 || ^19.0.0 - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@testing-library/user-event@14.5.2': - resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@testing-library/dom': '>=7.21.4' - - '@testing-library/user-event@14.6.1': - resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@testing-library/dom': '>=7.21.4' - - '@textlint/ast-node-types@14.8.4': - resolution: {integrity: sha512-+fI7miec/r9VeniFV9ppL4jRCmHNsTxieulTUf/4tvGII3db5hGriKHC4p/diq1SkQ9Sgs7kg6UyydxZtpTz1Q==} - - '@textlint/linter-formatter@14.8.4': - resolution: {integrity: sha512-sZ0UfYRDBNHnfMVBqLqqYnqTB7Ec169ljlmo+SEHR1T+dHUPYy1/DZK4p7QREXlBSFL4cnkswETCbc9xRodm4Q==} - - '@textlint/module-interop@14.8.4': - resolution: {integrity: sha512-1LdPYLAVpa27NOt6EqvuFO99s4XLB0c19Hw9xKSG6xQ1K82nUEyuWhzTQKb3KJ5Qx7qj14JlXZLfnEuL6A16Bw==} - - '@textlint/resolver@14.8.4': - resolution: {integrity: sha512-nMDOgDAVwNU9ommh+Db0U+MCMNDPbQ/1HBNjbnHwxZkCpcT6hsAJwBe38CW/DtWVUv8yeR4R40IYNPT84srNwA==} - - '@textlint/types@14.8.4': - resolution: {integrity: sha512-9nyY8vVXlr8hHKxa6+37omJhXWCwovMQcgMteuldYd4dOxGm14AK2nXdkgtKEUQnzLGaXy46xwLCfhQy7V7/YA==} - - '@tokenizer/token@0.3.0': - resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} - - '@tootallnate/once@1.1.2': - resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} - engines: {node: '>= 6'} - - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - - '@tree-sitter-grammars/tree-sitter-yaml@0.7.1': - resolution: {integrity: sha512-AynBwkIoQCTgjDR33bDUp9Mqq+YTco0is3n5hRApMqG9of/6A4eQsfC1/uSEeHSUyMQSYawcAWamsexnVpIP4Q==} - peerDependencies: - tree-sitter: ^0.22.4 - peerDependenciesMeta: - tree-sitter: - optional: true - - '@trysound/sax@0.2.0': - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} - - '@ts-morph/common@0.23.0': - resolution: {integrity: sha512-m7Lllj9n/S6sOkCkRftpM7L24uvmfXQFedlW/4hENcuJH1HHm9u5EgxZb9uVjQSCGrbBWBkOGgcTxNg36r6ywA==} - - '@ts-morph/common@0.27.0': - resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} - - '@types/aria-query@5.0.4': - resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} - - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - - '@types/babel__traverse@7.20.7': - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} - - '@types/blueimp-md5@2.18.2': - resolution: {integrity: sha512-dJ9yRry9Olt5GAWlgCtE5dK9d/Dfhn/V7hna86eEO2Pn76+E8Y0S0n61iEUEGhWXXgtKtHxtZLVNwL8X+vLHzg==} - - '@types/body-parser@1.19.6': - resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} - - '@types/bonjour@3.5.13': - resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} - - '@types/byline@4.2.36': - resolution: {integrity: sha512-dO55KDSaOSE+3T8TwP66mzn0u/PM/aSedVMr1tby7WBNjfLIuS6IbYXi1mlau49sVSVB+gXKJscWE0JO3tlXDw==} - - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/chai@5.2.2': - resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} - - '@types/classnames@2.3.4': - resolution: {integrity: sha512-dwmfrMMQb9ujX1uYGvB5ERDlOzBNywnZAZBtOe107/hORWP05ESgU4QyaanZMWYYfd2BzrG78y13/Bju8IQcMQ==} - deprecated: This is a stub types definition. classnames provides its own type definitions, so you do not need this installed. - - '@types/codemirror@0.0.90': - resolution: {integrity: sha512-8Z9+tSg27NPRGubbUPUCrt5DDG/OWzLph5BvcDykwR5D7RyZh5mhHG0uS1ePKV1YFCA+/cwc4Ey2AJAEFfV3IA==} - - '@types/codemirror@5.60.16': - resolution: {integrity: sha512-V/yHdamffSS075jit+fDxaOAmdP2liok8NSNJnAZfDJErzOheuygHZEhAJrfmk5TEyM32MhkZjwo/idX791yxw==} - - '@types/connect-history-api-fallback@1.5.4': - resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/cross-spawn@6.0.6': - resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} - - '@types/dagre@0.7.52': - resolution: {integrity: sha512-XKJdy+OClLk3hketHi9Qg6gTfe1F3y+UFnHxKA2rn9Dw+oXa4Gb378Ztz9HlMgZKSxpPmn4BNVh9wgkpvrK1uw==} - - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - - '@types/deep-equal@1.0.4': - resolution: {integrity: sha512-tqdiS4otQP4KmY0PR3u6KbZ5EWvhNdUoS/jc93UuK23C220lOZ/9TvjfxdPcKvqwwDVtmtSCrnr0p/2dirAxkA==} - - '@types/detect-port@1.3.5': - resolution: {integrity: sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==} - - '@types/doctrine@0.0.3': - resolution: {integrity: sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==} - - '@types/doctrine@0.0.9': - resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} - - '@types/ejs@3.1.5': - resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==} - - '@types/emscripten@1.40.1': - resolution: {integrity: sha512-sr53lnYkQNhjHNN0oJDdUm5564biioI5DuOpycufDVK7D3y+GR3oUswe2rlwY1nPNyusHbrJ9WoTyIHl4/Bpwg==} - - '@types/escodegen@0.0.6': - resolution: {integrity: sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==} - - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - - '@types/eslint-visitor-keys@1.0.0': - resolution: {integrity: sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==} - - '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - - '@types/estree-jsx@1.0.5': - resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - - '@types/estree@0.0.39': - resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} - - '@types/estree@0.0.51': - resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} - - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - - '@types/express-serve-static-core@4.19.6': - resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} - - '@types/express-serve-static-core@5.0.6': - resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} - - '@types/express@4.17.23': - resolution: {integrity: sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==} - - '@types/find-cache-dir@3.2.1': - resolution: {integrity: sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==} - - '@types/fs-extra@11.0.4': - resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} - - '@types/glob@7.2.0': - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} - - '@types/glob@8.1.0': - resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} - - '@types/graceful-fs@4.1.9': - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - - '@types/handlebars@4.1.0': - resolution: {integrity: sha512-gq9YweFKNNB1uFK71eRqsd4niVkXrxHugqWFQkeLRJvGjnxsLr16bYtcsG4tOFwmYi0Bax+wCkbf1reUfdl4kA==} - deprecated: This is a stub types definition. handlebars provides its own type definitions, so you do not need this installed. - - '@types/hast@2.3.10': - resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} - - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - - '@types/hoist-non-react-statics@3.3.6': - resolution: {integrity: sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==} - - '@types/html-minifier-terser@5.1.2': - resolution: {integrity: sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==} - - '@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-errors@2.0.5': - resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} - - '@types/http-proxy@1.17.16': - resolution: {integrity: sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==} - - '@types/is-function@1.0.3': - resolution: {integrity: sha512-/CLhCW79JUeLKznI6mbVieGbl4QU5Hfn+6udw1YHZoofASjbQ5zaP5LzAUZYDpRYEjS4/P+DhEgyJ/PQmGGTWw==} - - '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - - '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - - '@types/istanbul-reports@1.1.2': - resolution: {integrity: sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==} - - '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - - '@types/jest@25.2.3': - resolution: {integrity: sha512-JXc1nK/tXHiDhV55dvfzqtmP4S3sy3T3ouV2tkViZgxY/zeUkcpQcQPGRlgF4KmWzWW5oiWYSZwtCB+2RsE4Fw==} - - '@types/jest@29.5.14': - resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} - - '@types/js-yaml@4.0.9': - resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} - - '@types/jsdom@20.0.1': - resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/jsonfile@6.1.4': - resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} - - '@types/keyv@3.1.4': - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - - '@types/lodash.camelcase@4.3.9': - resolution: {integrity: sha512-ys9/hGBfsKxzmFI8hckII40V0ASQ83UM2pxfQRghHAwekhH4/jWtjz/3/9YDy7ZpUd/H0k2STSqmPR28dnj7Zg==} - - '@types/lodash.clonedeep@4.5.9': - resolution: {integrity: sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q==} - - '@types/lodash.debounce@4.0.9': - resolution: {integrity: sha512-Ma5JcgTREwpLRwMM+XwBR7DaWe96nC38uCBDFKZWbNKD+osjVzdpnUSwBcqCptrp16sSOLBAUb50Car5I0TCsQ==} - - '@types/lodash@4.14.202': - resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} - - '@types/lodash@4.17.16': - resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==} - - '@types/lodash@4.17.17': - resolution: {integrity: sha512-RRVJ+J3J+WmyOTqnz3PiBLA501eKwXl2noseKOrNo/6+XEHjTAxO4xHvxQB6QuNm+s4WRbn6rSiap8+EA+ykFQ==} - - '@types/mdast@3.0.15': - resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} - - '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - - '@types/mdurl@1.0.5': - resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} - - '@types/mdx@2.0.13': - resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} - - '@types/mime-types@2.1.4': - resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} - - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - - '@types/minimatch@5.1.2': - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - - '@types/minimist@1.2.5': - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - - '@types/mocha@10.0.10': - resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} - - '@types/mousetrap@1.6.15': - resolution: {integrity: sha512-qL0hyIMNPow317QWW/63RvL1x5MVMV+Ru3NaY9f/CuEpCqrmb7WeuK2071ZY5hczOnm38qExWM2i2WtkXLSqFw==} - - '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - - '@types/mustache@4.2.6': - resolution: {integrity: sha512-t+8/QWTAhOFlrF1IVZqKnMRJi84EgkIK5Kh0p2JV4OLywUvCwJPFxbJAl7XAow7DVIHsF+xW9f1MVzg0L6Szjw==} - - '@types/node-fetch@2.6.12': - resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} - - '@types/node-forge@1.3.11': - resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} - - '@types/node@16.18.126': - resolution: {integrity: sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==} - - '@types/node@18.19.112': - resolution: {integrity: sha512-i+Vukt9POdS/MBI7YrrkkI5fMfwFtOjphSmt4WXYLfwqsfr6z/HdCx7LqT9M7JktGob8WNgj8nFB4TbGNE4Cog==} - - '@types/node@22.15.18': - resolution: {integrity: sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==} - - '@types/node@22.15.21': - resolution: {integrity: sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==} - - '@types/node@22.15.32': - resolution: {integrity: sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA==} - - '@types/node@24.0.14': - resolution: {integrity: sha512-4zXMWD91vBLGRtHK3YbIoFMia+1nqEz72coM42C5ETjnNCa/heoj7NT1G67iAfOqMmcfhuCZ4uNpyz8EjlAejw==} - - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - - '@types/npmlog@4.1.6': - resolution: {integrity: sha512-0l3z16vnlJGl2Mi/rgJFrdwfLZ4jfNYgE6ZShEpjqhHuGTqdEzNles03NpYHwUMVYZa+Tj46UxKIEpE78lQ3DQ==} - - '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - - '@types/parse5@5.0.3': - resolution: {integrity: sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==} - - '@types/parse5@6.0.3': - resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} - - '@types/prettier@1.19.1': - resolution: {integrity: sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==} - - '@types/pretty-hrtime@1.0.3': - resolution: {integrity: sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==} - - '@types/prismjs@1.26.5': - resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} - - '@types/prop-types@15.7.15': - resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - - '@types/qs@6.14.0': - resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} - - '@types/ramda@0.30.2': - resolution: {integrity: sha512-PyzHvjCalm2BRYjAU6nIB3TprYwMNOUY/7P/N8bSzp9W/yM2YrtGtAnnVtaCNSeOZ8DzKyFDvaqQs7LnWwwmBA==} - - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - - '@types/react-collapse@5.0.4': - resolution: {integrity: sha512-tM5cVB6skGLneNYnRK2E3R56VOHguSeJQHslGPTIMC58ytL3oelT8L/l1onkwHGn5vSEs2BEq2Olzrur+YdliA==} - - '@types/react-dom@17.0.14': - resolution: {integrity: sha512-H03xwEP1oXmSfl3iobtmQ/2dHF5aBHr8aUMwyGZya6OW45G+xtdzmq6HkncefiBt5JU8DVyaWl/nWZbjZCnzAQ==} - - '@types/react-dom@17.0.26': - resolution: {integrity: sha512-Z+2VcYXJwOqQ79HreLU/1fyQ88eXSSFh6I3JdrEHQIfYSI0kCQpTGvOrbE6jFGGYXKsHuwY9tBa/w5Uo6KzrEg==} - peerDependencies: - '@types/react': ^17.0.0 - - '@types/react-dom@18.2.0': - resolution: {integrity: sha512-8yQrvS6sMpSwIovhPOwfyNf2Wz6v/B62LFSVYQ85+Rq3tLsBIG7rP5geMxaijTUxSkrO6RzN/IRuIAADYQsleA==} - - '@types/react-lottie@1.2.10': - resolution: {integrity: sha512-rCd1p3US4ELKJlqwVnP0h5b24zt5p9OCvKUoNpYExLqwbFZMWEiJ6EGLMmH7nmq5V7KomBIbWO2X/XRFsL0vCA==} - - '@types/react-split-pane@0.1.67': - resolution: {integrity: sha512-2vq9mohqYZ7kR+XcedfjyI2M7/E8W5owr0KupGGP+TfFp/O9f6c/S06MCB3FKWiBwazA7+Zyj50OTxvYy1kGLA==} - deprecated: This is a stub types definition for react-split-pane (https://github.com/tomkp/react-split-pane). react-split-pane provides its own type definitions, so you don't need @types/react-split-pane installed! - - '@types/react-syntax-highlighter@15.5.13': - resolution: {integrity: sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==} - - '@types/react-test-renderer@19.1.0': - resolution: {integrity: sha512-XD0WZrHqjNrxA/MaR9O22w/RNidWR9YZmBdRGI7wcnWGrv/3dA8wKCJ8m63Sn+tLJhcjmuhOi629N66W6kgWzQ==} - - '@types/react@17.0.87': - resolution: {integrity: sha512-wpg9AbtJ6agjA+BKYmhG6dRWEU/2DHYwMzCaBzsz137ft6IyuqZ5fI4ic1DWL4DrI03Zy78IyVE6ucrXl0mu4g==} - - '@types/react@18.2.0': - resolution: {integrity: sha512-0FLj93y5USLHdnhIhABk83rm8XEGA7kH3cr+YUlvxoUGp1xNt/DINUMvqPxLyOQMzLmZe8i4RTHbvb8MC7NmrA==} - - '@types/resolve@1.17.1': - resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} - - '@types/resolve@1.20.2': - resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - - '@types/resolve@1.20.6': - resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} - - '@types/responselike@1.0.3': - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - - '@types/retry@0.12.2': - resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} - - '@types/sarif@2.1.7': - resolution: {integrity: sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==} - - '@types/scheduler@0.16.8': - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} - - '@types/scheduler@0.26.0': - resolution: {integrity: sha512-WFHp9YUJQ6CKshqoC37iOlHnQSmxNc795UhB26CyBBttrN9svdIrUjl/NjnNmfcwtncN0h/0PPAFWv9ovP8mLA==} - - '@types/selenium-webdriver@4.1.28': - resolution: {integrity: sha512-Au7CXegiS7oapbB16zxPToY4Cjzi9UQQMf3W2ZZM8PigMLTGR3iUAHjPUTddyE5g1SBjT/qpmvlsAQLBfNAdKg==} - - '@types/semver@7.7.0': - resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} - - '@types/send@0.17.5': - resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} - - '@types/serve-index@1.9.4': - resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} - - '@types/serve-static@1.15.8': - resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} - - '@types/sockjs@0.3.36': - resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} - - '@types/source-list-map@0.1.6': - resolution: {integrity: sha512-5JcVt1u5HDmlXkwOD2nslZVllBBc7HDuOICfiZah2Z0is8M8g+ddAEawbmd3VjedfDHBzxCaXLs07QEmb7y54g==} - - '@types/stack-utils@1.0.1': - resolution: {integrity: sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==} - - '@types/stack-utils@2.0.3': - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - - '@types/swagger-ui-react@5.18.0': - resolution: {integrity: sha512-c2M9adVG7t28t1pq19K9Jt20VLQf0P/fwJwnfcmsVVsdkwCWhRmbKDu+tIs0/NGwJ/7GY8lBx+iKZxuDI5gDbw==} - - '@types/tapable@1.0.12': - resolution: {integrity: sha512-bTHG8fcxEqv1M9+TD14P8ok8hjxoOCkfKc8XXLaaD05kI7ohpeI956jtDOD3XHKBQrlyPughUtzm1jtVhHpA5Q==} - - '@types/tcp-port-used@1.0.4': - resolution: {integrity: sha512-0vQ4fz9TTM4bCdllYWEJ2JHBUXR9xqPtc70dJ7BMRDVfvZyYdrgey3nP5RRcVj+qAgnHJM8r9fvgrfnPMxdnhA==} - - '@types/tern@0.23.9': - resolution: {integrity: sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==} - - '@types/tmp@0.2.6': - resolution: {integrity: sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==} - - '@types/tough-cookie@4.0.5': - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - - '@types/triple-beam@1.3.5': - resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} - - '@types/trusted-types@2.0.7': - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - - '@types/uglify-js@3.17.5': - resolution: {integrity: sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==} - - '@types/unist@2.0.11': - resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - - '@types/unzipper@0.10.11': - resolution: {integrity: sha512-D25im2zjyMCcgL9ag6N46+wbtJBnXIr7SI4zHf9eJD2Dw2tEB5e+p5MYkrxKIVRscs5QV0EhtU9rgXSPx90oJg==} - - '@types/use-sync-external-store@0.0.3': - resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} - - '@types/use-sync-external-store@0.0.6': - resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} - - '@types/uuid@10.0.0': - resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} - - '@types/uuid@9.0.8': - resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - - '@types/vscode-notebook-renderer@1.72.3': - resolution: {integrity: sha512-MfmEI3A2McbUV2WaijoTgLOAs9chwHN4WmqOedl3jdtlbzJBWIQ9ZFmQdzPa3lYr5j8DJhRg3KB5AIM/BBfg9Q==} - - '@types/vscode-webview@1.57.5': - resolution: {integrity: sha512-iBAUYNYkz+uk1kdsq05fEcoh8gJmwT3lqqFPN7MGyjQ3HVloViMdo7ZJ8DFIP8WOK74PjOEilosqAyxV2iUFUw==} - - '@types/vscode@1.101.0': - resolution: {integrity: sha512-ZWf0IWa+NGegdW3iU42AcDTFHWW7fApLdkdnBqwYEtHVIBGbTu0ZNQKP/kX3Ds/uMJXIMQNAojHR4vexCEEz5Q==} - - '@types/webpack-env@1.18.8': - resolution: {integrity: sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A==} - - '@types/webpack-sources@3.2.3': - resolution: {integrity: sha512-4nZOdMwSPHZ4pTEZzSp0AsTM4K7Qmu40UKW4tJDiOVs20UzYF9l+qUe4s0ftfN0pin06n+5cWWDJXH+sbhAiDw==} - - '@types/webpack@4.41.40': - resolution: {integrity: sha512-u6kMFSBM9HcoTpUXnL6mt2HSzftqb3JgYV6oxIgL2dl6sX6aCa5k6SOkzv5DuZjBTPUE/dJltKtwwuqrkZHpfw==} - - '@types/webpack@5.28.5': - resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} - - '@types/which@3.0.4': - resolution: {integrity: sha512-liyfuo/106JdlgSchJzXEQCVArk0CvevqPote8F8HgWgJ3dRCcTHgJIsLDuee0kxk/mhbInzIZk3QWSZJ8R+2w==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@types/xml2js@0.4.14': - resolution: {integrity: sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ==} - - '@types/yargs-parser@21.0.3': - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - - '@types/yargs@15.0.19': - resolution: {integrity: sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==} - - '@types/yargs@17.0.33': - resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - - '@typescript-eslint/eslint-plugin@2.34.0': - resolution: {integrity: sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} - peerDependencies: - '@typescript-eslint/parser': ^2.0.0 - eslint: ^5.0.0 || ^6.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} - peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 - 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} - peerDependencies: - eslint: '*' - - '@typescript-eslint/parser@2.34.0': - resolution: {integrity: sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} - peerDependencies: - eslint: ^5.0.0 || ^6.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} - peerDependencies: - 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@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@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} - peerDependencies: - 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@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} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - 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@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} - peerDependencies: - 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@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.2.3': - resolution: {integrity: sha512-oRhjSzcVjX8ExyaF8hC0zzTqxlVuRlgMHL/Bh4w3xB9+wjbm0FpXylVU/lBrn+kgphwYTrOk3tp+AVShGmlYCg==} - engines: {node: '>=18.0.0'} - - '@uiw/codemirror-extensions-basic-setup@4.23.13': - resolution: {integrity: sha512-U1CnDFpq6ydNqrRDS5Bdnvgso8ezwwbrmKvmAD3hmoVyRDsDU6HTtmcV+w0rZ3kElUCkKI5lY0DMvTTQ4+L3RQ==} - peerDependencies: - '@codemirror/autocomplete': '>=6.0.0' - '@codemirror/commands': '>=6.0.0' - '@codemirror/language': '>=6.0.0' - '@codemirror/lint': '>=6.0.0' - '@codemirror/search': '>=6.0.0' - '@codemirror/state': '>=6.0.0' - '@codemirror/view': '>=6.0.0' - - '@uiw/react-codemirror@4.23.13': - resolution: {integrity: sha512-y65ULzxOAfpxrA/8epoAOeCfmJXu9z0P62BbGOkITJTtU7WI59KfPbbwj35npSsMAkAmDE841qZo2I8jst/THg==} - peerDependencies: - '@babel/runtime': '>=7.11.0' - '@codemirror/state': '>=6.0.0' - '@codemirror/theme-one-dark': '>=6.0.0' - '@codemirror/view': '>=6.0.0' - codemirror: '>=6.0.0' - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - - '@vitejs/plugin-react@4.5.2': - resolution: {integrity: sha512-QNVT3/Lxx99nMQWJWF7K4N6apUEuT0KlZA3mx/mVaoGj3smm/8rc8ezz15J1pcbcjDK0V15rpHetVfya08r76Q==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 - - '@vitest/expect@2.0.5': - resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} - - '@vitest/expect@3.0.9': - resolution: {integrity: sha512-5eCqRItYgIML7NNVgJj6TVCmdzE7ZVgJhruW0ziSQV4V7PvLkDL1bBkBdcTs/VuIz0IxPb5da1IDSqc1TR9eig==} - - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - - '@vitest/pretty-format@2.0.5': - resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} - - '@vitest/pretty-format@2.1.9': - resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} - - '@vitest/pretty-format@3.0.9': - resolution: {integrity: sha512-OW9F8t2J3AwFEwENg3yMyKWweF7oRJlMyHOMIhO5F3n0+cgQAJZBjNgrF8dLwFTEXl5jUqBLXd9QyyKv8zEcmA==} - - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - - '@vitest/spy@2.0.5': - resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} - - '@vitest/spy@3.0.9': - resolution: {integrity: sha512-/CcK2UDl0aQ2wtkp3YVWldrpLRNCfVcIOFGlVGKO4R5eajsH393Z1yiXLVQ7vWsj26JOEjeZI0x5sm5P4OGUNQ==} - - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - - '@vitest/utils@2.0.5': - resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} - - '@vitest/utils@2.1.9': - resolution: {integrity: sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==} - - '@vitest/utils@3.0.9': - resolution: {integrity: sha512-ilHM5fHhZ89MCp5aAaM9uhfl1c2JdxVxl3McqsdVyVNN6JffnEen8UMCdRTzOhGXNQGo5GNL9QugHrz727Wnng==} - - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} - - '@vscode-logging/logger@2.0.0': - resolution: {integrity: sha512-m5AsHLqNyC8OYmpXf4bA5Hm2gSrJcc2L7KUfA8wMH/GFDexeNSTi/O6rDdWFawxLZg3uQGETDx8xyMfMqCDp+w==} - - '@vscode-logging/types@2.0.0': - resolution: {integrity: sha512-P42r5SPYeJKgMDYb5Ez9rjPlpnGEZ1eDFVjT0azxueaJ65iE259hpROmvSPUd80HAALn9/59L+CgcGLmwZcCmg==} - - '@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/extension-telemetry@1.0.0': - resolution: {integrity: sha512-vaTZE65zigWwSWYB6yaZUAyVC/Ux+6U82hnzy/ejuS/KpFifO+0oORNd5yAoPeIRnYjvllM6ES3YlX4K5tUuww==} - engines: {vscode: ^1.75.0} - - '@vscode/iconv-lite-umd@0.7.0': - resolution: {integrity: sha512-bRRFxLfg5dtAyl5XyiVWz/ZBPahpOpPrNYnnHpOpUZvam4tKH35wdhP4Kj6PbM0+KdliOsPzbGWpkxcdpNB/sg==} - - '@vscode/test-electron@2.5.2': - resolution: {integrity: sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==} - engines: {node: '>=16'} - - '@vscode/vsce-sign-alpine-arm64@2.0.5': - resolution: {integrity: sha512-XVmnF40APwRPXSLYA28Ye+qWxB25KhSVpF2eZVtVOs6g7fkpOxsVnpRU1Bz2xG4ySI79IRuapDJoAQFkoOgfdQ==} - cpu: [arm64] - os: [alpine] - - '@vscode/vsce-sign-alpine-x64@2.0.5': - resolution: {integrity: sha512-JuxY3xcquRsOezKq6PEHwCgd1rh1GnhyH6urVEWUzWn1c1PC4EOoyffMD+zLZtFuZF5qR1I0+cqDRNKyPvpK7Q==} - cpu: [x64] - os: [alpine] - - '@vscode/vsce-sign-darwin-arm64@2.0.5': - resolution: {integrity: sha512-z2Q62bk0ptADFz8a0vtPvnm6vxpyP3hIEYMU+i1AWz263Pj8Mc38cm/4sjzxu+LIsAfhe9HzvYNS49lV+KsatQ==} - cpu: [arm64] - os: [darwin] - - '@vscode/vsce-sign-darwin-x64@2.0.5': - resolution: {integrity: sha512-ma9JDC7FJ16SuPXlLKkvOD2qLsmW/cKfqK4zzM2iJE1PbckF3BlR08lYqHV89gmuoTpYB55+z8Y5Fz4wEJBVDA==} - cpu: [x64] - os: [darwin] - - '@vscode/vsce-sign-linux-arm64@2.0.5': - resolution: {integrity: sha512-Hr1o0veBymg9SmkCqYnfaiUnes5YK6k/lKFA5MhNmiEN5fNqxyPUCdRZMFs3Ajtx2OFW4q3KuYVRwGA7jdLo7Q==} - cpu: [arm64] - os: [linux] - - '@vscode/vsce-sign-linux-arm@2.0.5': - resolution: {integrity: sha512-cdCwtLGmvC1QVrkIsyzv01+o9eR+wodMJUZ9Ak3owhcGxPRB53/WvrDHAFYA6i8Oy232nuen1YqWeEohqBuSzA==} - cpu: [arm] - os: [linux] - - '@vscode/vsce-sign-linux-x64@2.0.5': - resolution: {integrity: sha512-XLT0gfGMcxk6CMRLDkgqEPTyG8Oa0OFe1tPv2RVbphSOjFWJwZgK3TYWx39i/7gqpDHlax0AP6cgMygNJrA6zg==} - cpu: [x64] - os: [linux] - - '@vscode/vsce-sign-win32-arm64@2.0.5': - resolution: {integrity: sha512-hco8eaoTcvtmuPhavyCZhrk5QIcLiyAUhEso87ApAWDllG7djIrWiOCtqn48k4pHz+L8oCQlE0nwNHfcYcxOPw==} - cpu: [arm64] - os: [win32] - - '@vscode/vsce-sign-win32-x64@2.0.5': - resolution: {integrity: sha512-1ixKFGM2FwM+6kQS2ojfY3aAelICxjiCzeg4nTHpkeU1Tfs4RC+lVLrgq5NwcBC7ZLr6UfY3Ct3D6suPeOf7BQ==} - cpu: [x64] - os: [win32] - - '@vscode/vsce-sign@2.0.6': - resolution: {integrity: sha512-j9Ashk+uOWCDHYDxgGsqzKq5FXW9b9MW7QqOIYZ8IYpneJclWTBeHZz2DJCSKQgo+JAqNcaRRE1hzIx0dswqAw==} - - '@vscode/vsce@2.32.0': - resolution: {integrity: sha512-3EFJfsgrSftIqt3EtdRcAygy/OJ3hstyI1cDmIgkU9CFZW5C+3djr6mfosndCUqcVYuyjmxOK1xmFp/Bq7+NIg==} - engines: {node: '>= 16'} - hasBin: true - - '@vscode/vsce@3.4.2': - resolution: {integrity: sha512-U2gC7GiQc22nxRpWH4cdW16rRr5u9w+Bjsjm8g8mEjY4aeOG1U6/3XNGq+ElwdeoT8jAyhBmBAuYG7INcSe/6A==} - engines: {node: '>= 20'} - hasBin: true - - '@vscode/webview-ui-toolkit@1.4.0': - resolution: {integrity: sha512-modXVHQkZLsxgmd5yoP3ptRC/G8NBDD+ob+ngPiWNQdlrH6H1xR/qgOBD85bfU3BhOB5sZzFWBwwhp9/SfoHww==} - deprecated: This package has been deprecated, https://github.com/microsoft/vscode-webview-ui-toolkit/issues/561 - peerDependencies: - react: '>=16.9.0' - - '@webassemblyjs/ast@1.14.1': - resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - - '@webassemblyjs/floating-point-hex-parser@1.13.2': - resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - - '@webassemblyjs/helper-api-error@1.13.2': - resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - - '@webassemblyjs/helper-buffer@1.14.1': - resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - - '@webassemblyjs/helper-numbers@1.13.2': - resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': - resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - - '@webassemblyjs/helper-wasm-section@1.14.1': - resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} - - '@webassemblyjs/ieee754@1.13.2': - resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} - - '@webassemblyjs/leb128@1.13.2': - resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} - - '@webassemblyjs/utf8@1.13.2': - resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} - - '@webassemblyjs/wasm-edit@1.14.1': - resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} - - '@webassemblyjs/wasm-gen@1.14.1': - resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} - - '@webassemblyjs/wasm-opt@1.14.1': - resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} - - '@webassemblyjs/wasm-parser@1.14.1': - resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} - - '@webassemblyjs/wast-printer@1.14.1': - resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - - '@webpack-cli/configtest@1.2.0': - resolution: {integrity: sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==} - peerDependencies: - webpack: ^5.94.0 - webpack-cli: 4.x.x - - '@webpack-cli/configtest@2.1.1': - resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: ^5.94.0 - webpack-cli: 5.x.x - - '@webpack-cli/configtest@3.0.1': - resolution: {integrity: sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==} - engines: {node: '>=18.12.0'} - peerDependencies: - webpack: ^5.94.0 - webpack-cli: 6.x.x - - '@webpack-cli/info@1.5.0': - resolution: {integrity: sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==} - peerDependencies: - webpack-cli: 4.x.x - - '@webpack-cli/info@2.0.2': - resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: ^5.94.0 - webpack-cli: 5.x.x - - '@webpack-cli/info@3.0.1': - resolution: {integrity: sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==} - engines: {node: '>=18.12.0'} - peerDependencies: - webpack: ^5.94.0 - webpack-cli: 6.x.x - - '@webpack-cli/serve@1.7.0': - resolution: {integrity: sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==} - peerDependencies: - webpack-cli: 4.x.x - webpack-dev-server: '*' - peerDependenciesMeta: - webpack-dev-server: - optional: true - - '@webpack-cli/serve@2.0.5': - resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: ^5.94.0 - webpack-cli: 5.x.x - webpack-dev-server: '*' - peerDependenciesMeta: - webpack-dev-server: - optional: true - - '@webpack-cli/serve@3.0.1': - resolution: {integrity: sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==} - engines: {node: '>=18.12.0'} - peerDependencies: - webpack: ^5.94.0 - webpack-cli: 6.x.x - webpack-dev-server: '*' - peerDependenciesMeta: - webpack-dev-server: - optional: true - - '@xmldom/xmldom@0.7.13': - resolution: {integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==} - engines: {node: '>=10.0.0'} - deprecated: this version is no longer supported, please update to at least 0.8.* - - '@xmldom/xmldom@0.8.10': - resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} - engines: {node: '>=10.0.0'} - - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - - '@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15': - resolution: {integrity: sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==} - engines: {node: '>=14.15.0'} - peerDependencies: - esbuild: ^0.25.0 - - '@yarnpkg/fslib@2.10.3': - resolution: {integrity: sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==} - engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} - - '@yarnpkg/libzip@2.3.0': - resolution: {integrity: sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==} - engines: {node: '>=12 <14 || 14.2 - 14.9 || >14.10.0'} - - abab@1.0.4: - resolution: {integrity: sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==} - deprecated: Use your platform's native atob() and btoa() methods instead - - abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead - - abbrev@1.0.9: - resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} - - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - - accepts@2.0.0: - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} - engines: {node: '>= 0.6'} - - acorn-globals@3.1.0: - resolution: {integrity: sha512-uWttZCk96+7itPxK8xCzY86PnxKTMrReKDqrHzv42VQY0K30PUO8WY13WMOuI+cOdX4EIdzdvQ8k6jkuGRFMYw==} - - acorn-globals@4.3.4: - resolution: {integrity: sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==} - - acorn-globals@7.0.1: - resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} - - acorn-import-phases@1.0.4: - resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} - engines: {node: '>=10.13.0'} - peerDependencies: - acorn: ^8.14.0 - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn-walk@6.2.0: - resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} - engines: {node: '>=0.4.0'} - - acorn-walk@7.2.0: - resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} - engines: {node: '>=0.4.0'} - - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - - acorn@4.0.13: - resolution: {integrity: sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==} - engines: {node: '>=0.4.0'} - hasBin: true - - acorn@5.7.4: - resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} - engines: {node: '>=0.4.0'} - hasBin: true - - acorn@6.4.2: - resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} - engines: {node: '>=0.4.0'} - hasBin: true - - acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true - - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} - hasBin: true - - address@1.0.3: - resolution: {integrity: sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==} - engines: {node: '>= 0.12.0'} - - address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} - - adm-zip@0.5.16: - resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==} - engines: {node: '>=12.0'} - - agent-base@5.1.1: - resolution: {integrity: sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==} - engines: {node: '>= 6.0.0'} - - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - - agent-base@7.1.3: - resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} - engines: {node: '>= 14'} - - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - - aggregate-error@4.0.1: - resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} - engines: {node: '>=12'} - - airbnb-js-shims@2.2.1: - resolution: {integrity: sha512-wJNXPH66U2xjgo1Zwyjf9EydvJ2Si94+vSdk6EERcBfB2VZkeltpqIats0cqIZMLCXP3zcyaUKGYQeIBT6XjsQ==} - - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv-formats@3.0.1: - resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - - ajv-keywords@5.1.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 - - ajv@5.5.2: - resolution: {integrity: sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw==} - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - - alphanum-sort@1.0.2: - resolution: {integrity: sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==} - - amdefine@0.1.1: - resolution: {integrity: sha512-cE/769sItEDt5sSdqmrWMsat+XaA5FJiEou+ZwlY7ef/Jf/517k6nYyUIRPR2o/QbpBg4FiYXj9GyRGNg5f/bg==} - engines: {node: '>=0.4.2'} - - amdefine@1.0.1: - resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} - engines: {node: '>=0.4.2'} - - anser@2.3.2: - resolution: {integrity: sha512-PMqBCBvrOVDRqLGooQb+z+t1Q0PiPyurUQeZRR5uHBOVZcW8B04KMmnT12USnhpNX2wCPagWzLVppQMUG3u0Dw==} - - ansi-align@2.0.0: - resolution: {integrity: sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==} - - ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - - ansi-colors@1.1.0: - resolution: {integrity: sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==} - engines: {node: '>=0.10.0'} - - ansi-colors@3.2.4: - resolution: {integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==} - engines: {node: '>=6'} - - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - - ansi-escapes@1.4.0: - resolution: {integrity: sha512-wiXutNjDUlNEDWHcYH3jtZUhd3c4/VojassD8zHdHCY13xbZy2XbW+NKQwA0tWGBVzDA9qEzYwfoSsWmviidhw==} - engines: {node: '>=0.10.0'} - - ansi-escapes@3.2.0: - resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} - engines: {node: '>=4'} - - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - - ansi-escapes@7.0.0: - resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} - engines: {node: '>=18'} - - ansi-html-community@0.0.8: - resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} - engines: {'0': node >= 0.8.0} - hasBin: true - - ansi-html@0.0.9: - resolution: {integrity: sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==} - engines: {'0': node >= 0.8.0} - hasBin: true - - ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - - ansi-regex@3.0.1: - resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} - engines: {node: '>=4'} - - ansi-regex@4.1.1: - resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} - - ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - ansi-to-html@0.6.15: - resolution: {integrity: sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ==} - engines: {node: '>=8.0.0'} - hasBin: true - - ansi-wrap@0.1.0: - resolution: {integrity: sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==} - engines: {node: '>=0.10.0'} - - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - - anymatch@1.3.2: - resolution: {integrity: sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==} - - anymatch@2.0.0: - resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - apg-lite@1.0.5: - resolution: {integrity: sha512-SlI+nLMQDzCZfS39ihzjGp3JNBQfJXyMi6cg9tkLOCPVErgFsUIAEdO9IezR7kbP5Xd0ozcPNQBkf9TO5cHgWw==} - - app-root-dir@1.0.2: - resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==} - - append-transform@0.4.0: - resolution: {integrity: sha512-Yisb7ew0ZEyDtRYQ+b+26o9KbiYPFxwcsxKzbssigzRRMJ9LpExPVUg6Fos7eP7yP3q7///tzze4nm4lTptPBw==} - engines: {node: '>=0.10.0'} - - applicationinsights@1.7.4: - resolution: {integrity: sha512-XFLsNlcanpjFhHNvVWEfcm6hr7lu9znnb6Le1Lk5RE03YUV9X2B2n2MfM4kJZRrUdV+C0hdHxvWyv+vWoLfY7A==} - - aproba@1.2.0: - resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} - - aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - - are-we-there-yet@1.1.7: - resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} - deprecated: This package is no longer supported. - - are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - - are-we-there-yet@3.0.1: - resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. - - arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - aria-hidden@1.2.6: - resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} - engines: {node: '>=10'} - - aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - - aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} - - arr-diff@4.0.0: - resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} - engines: {node: '>=0.10.0'} - - arr-union@3.1.0: - resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} - engines: {node: '>=0.10.0'} - - array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} - - array-equal@1.0.2: - resolution: {integrity: sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==} - - array-filter@0.0.1: - resolution: {integrity: sha512-VW0FpCIhjZdarWjIz8Vpva7U95fl2Jn+b+mmFFMLn8PIVscOQcAgEznwUzTEuUHuqZqIxwzRlcaN/urTFFQoiw==} - - array-find-index@1.0.2: - resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} - engines: {node: '>=0.10.0'} - - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - - array-includes@3.1.9: - resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} - engines: {node: '>= 0.4'} - - array-map@0.0.1: - resolution: {integrity: sha512-sxHIeJTGEsRC8/hYkZzdJNNPZ41EXHVys7pqMw1iwE/Kx8/hto0UbDuGQsSJ0ujPovj9qUZl6EOY/EiZ2g3d9Q==} - - array-reduce@0.0.0: - resolution: {integrity: sha512-8jR+StqaC636u7h3ye1co3lQRefgVVUQUhuAmRbDqIMeR2yuXzRvkCNQiQ5J/wbREmoBLNtp13dhaaVpZQDRUw==} - - array-union@1.0.2: - resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} - engines: {node: '>=0.10.0'} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - array-uniq@1.0.3: - resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} - engines: {node: '>=0.10.0'} - - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} - - array.prototype.findlastindex@1.2.6: - resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} - - array.prototype.map@1.0.8: - resolution: {integrity: sha512-YocPM7bYYu2hXGxWpb5vwZ8cMeudNHYtYBcUDY4Z1GWa53qcnQMWSl25jeBHNzitjl9HW2AWW4ro/S/nftUaOQ==} - engines: {node: '>= 0.4'} - - array.prototype.reduce@1.0.8: - resolution: {integrity: sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==} - engines: {node: '>= 0.4'} - - array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - arrify@2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} - engines: {node: '>=8'} - - asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - - asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - - assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - - assign-symbols@1.0.0: - resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} - engines: {node: '>=0.10.0'} - - ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - - ast-types@0.14.2: - resolution: {integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==} - engines: {node: '>=4'} - - ast-types@0.16.1: - resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} - engines: {node: '>=4'} - - astral-regex@1.0.0: - resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} - engines: {node: '>=4'} - - astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - - async-each@1.0.6: - resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==} - - async-foreach@0.1.3: - resolution: {integrity: sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA==} - - async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} - - async-hook-jl@1.7.6: - resolution: {integrity: sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==} - engines: {node: ^4.7 || >=6.9 || >=7.3} - - async-limiter@1.0.1: - resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} - - async-listener@0.6.10: - resolution: {integrity: sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==} - engines: {node: <=0.11.8 || >0.11.10} - - async@1.5.2: - resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} - - async@2.6.4: - resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} - - async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - asyncro@3.0.0: - resolution: {integrity: sha512-nEnWYfrBmA3taTiuiOoZYmgJ/CNrSoQLeLs29SeLcPu60yaw/mHDBHV0iOZ051fTvsTHxpCY+gXibqT9wbQYfg==} - - at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - - atob@2.1.2: - resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} - engines: {node: '>= 4.5.0'} - hasBin: true - - autolinker@3.16.2: - resolution: {integrity: sha512-JiYl7j2Z19F9NdTmirENSUUIIL/9MytEWtmzhfmsKPCp9E+G35Y0UNCMoM9tFigxT59qSc8Ml2dlZXOCVTYwuA==} - - autoprefixer@10.4.21: - resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - - autoprefixer@6.7.7: - resolution: {integrity: sha512-WKExI/eSGgGAkWAO+wMVdFObZV7hQen54UpD1kCCTN3tvlL3W1jL4+lPP/M7MwoP7Q4RHzKtO3JQ4HxYEcd+xQ==} - - autoprefixer@7.1.6: - resolution: {integrity: sha512-C9yv/UF3X+eJTi/zvfxuyfxmLibYrntpF3qoJYrMeQwgUJOZrZvpJiMG2FMQ3qnhWtF/be4pYONBBw95ZGe3vA==} - - autoprefixer@9.8.8: - resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==} - hasBin: true - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - await-notify@1.0.1: - resolution: {integrity: sha512-eT6XN2ycPKvuiffzUNmU0dnGmmLw+TexMW7UKOyf5utdVrWx14PR2acRIfy6ZfFWRAv8twt1X74VUgd9RnDmfQ==} - - aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - - aws4@1.13.2: - resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} - - axe-core@4.10.3: - resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} - engines: {node: '>=4'} - - axios@1.9.0: - resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} - - axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} - - azure-devops-node-api@12.5.0: - resolution: {integrity: sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==} - - babel-code-frame@6.26.0: - resolution: {integrity: sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==} - - babel-core@6.26.3: - resolution: {integrity: sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==} - - babel-core@7.0.0-bridge.0: - resolution: {integrity: sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - babel-eslint@10.1.0: - resolution: {integrity: sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==} - engines: {node: '>=6'} - deprecated: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates. - peerDependencies: - eslint: '>= 4.12.1' - - babel-generator@6.26.1: - resolution: {integrity: sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==} - - babel-helper-builder-binary-assignment-operator-visitor@6.24.1: - resolution: {integrity: sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q==} - - babel-helper-builder-react-jsx@6.26.0: - resolution: {integrity: sha512-02I9jDjnVEuGy2BR3LRm9nPRb/+Ja0pvZVLr1eI5TYAA/dB0Xoc+WBo50+aDfhGDLhlBY1+QURjn9uvcFd8gzg==} - - babel-helper-call-delegate@6.24.1: - resolution: {integrity: sha512-RL8n2NiEj+kKztlrVJM9JT1cXzzAdvWFh76xh/H1I4nKwunzE4INBXn8ieCZ+wh4zWszZk7NBS1s/8HR5jDkzQ==} - - babel-helper-define-map@6.26.0: - resolution: {integrity: sha512-bHkmjcC9lM1kmZcVpA5t2om2nzT/xiZpo6TJq7UlZ3wqKfzia4veeXbIhKvJXAMzhhEBd3cR1IElL5AenWEUpA==} - - babel-helper-explode-assignable-expression@6.24.1: - resolution: {integrity: sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ==} - - babel-helper-function-name@6.24.1: - resolution: {integrity: sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q==} - - babel-helper-get-function-arity@6.24.1: - resolution: {integrity: sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng==} - - babel-helper-hoist-variables@6.24.1: - resolution: {integrity: sha512-zAYl3tqerLItvG5cKYw7f1SpvIxS9zi7ohyGHaI9cgDUjAT6YcY9jIEH5CstetP5wHIVSceXwNS7Z5BpJg+rOw==} - - babel-helper-optimise-call-expression@6.24.1: - resolution: {integrity: sha512-Op9IhEaxhbRT8MDXx2iNuMgciu2V8lDvYCNQbDGjdBNCjaMvyLf4wl4A3b8IgndCyQF8TwfgsQ8T3VD8aX1/pA==} - - babel-helper-regex@6.26.0: - resolution: {integrity: sha512-VlPiWmqmGJp0x0oK27Out1D+71nVVCTSdlbhIVoaBAj2lUgrNjBCRR9+llO4lTSb2O4r7PJg+RobRkhBrf6ofg==} - - babel-helper-remap-async-to-generator@6.24.1: - resolution: {integrity: sha512-RYqaPD0mQyQIFRu7Ho5wE2yvA/5jxqCIj/Lv4BXNq23mHYu/vxikOy2JueLiBxQknwapwrJeNCesvY0ZcfnlHg==} - - babel-helper-replace-supers@6.24.1: - resolution: {integrity: sha512-sLI+u7sXJh6+ToqDr57Bv973kCepItDhMou0xCP2YPVmR1jkHSCY+p1no8xErbV1Siz5QE8qKT1WIwybSWlqjw==} - - babel-helpers@6.24.1: - resolution: {integrity: sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ==} - - babel-jest@20.0.3: - resolution: {integrity: sha512-eAycDKZn+m6jMBv5KMXRKttDeoDUE7Y6eQpeiF4ip0lLaI4uwGNhJIdVK2RptHjO9N9RJ2gONMn2XE67wBdf8A==} - - babel-jest@25.5.1: - resolution: {integrity: sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ==} - engines: {node: '>= 8.3'} - peerDependencies: - '@babel/core': ^7.0.0 - - babel-jest@29.7.0: - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - - babel-loader@10.0.0: - resolution: {integrity: sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==} - engines: {node: ^18.20.0 || ^20.10.0 || >=22.0.0} - peerDependencies: - '@babel/core': ^7.12.0 - webpack: ^5.94.0 - - babel-loader@7.1.2: - resolution: {integrity: sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==} - engines: {node: '>=4'} - peerDependencies: - babel-core: 6 || 7 || ^7.0.0-alpha || ^7.0.0-beta || ^7.0.0-rc - webpack: ^5.94.0 - - babel-loader@8.4.1: - resolution: {integrity: sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==} - engines: {node: '>= 8.9'} - peerDependencies: - '@babel/core': ^7.0.0 - webpack: ^5.94.0 - - babel-loader@9.2.1: - resolution: {integrity: sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==} - engines: {node: '>= 14.15.0'} - peerDependencies: - '@babel/core': ^7.12.0 - webpack: ^5.94.0 - - babel-messages@6.23.0: - resolution: {integrity: sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==} - - babel-plugin-add-react-displayname@0.0.5: - resolution: {integrity: sha512-LY3+Y0XVDYcShHHorshrDbt4KFWL4bSeniCtl4SYZbask+Syngk1uMPCeN9+nSiZo6zX5s0RTq/J9Pnaaf/KHw==} - - babel-plugin-annotate-pure-calls@0.4.0: - resolution: {integrity: sha512-oi4M/PWUJOU9ZyRGoPTfPMqdyMp06jbJAomd3RcyYuzUtBOddv98BqLm96Lucpi2QFoQHkdGQt0ACvw7VzVEQA==} - peerDependencies: - '@babel/core': ^6.0.0-0 || 7.x - - babel-plugin-apply-mdx-type-prop@1.6.22: - resolution: {integrity: sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==} - peerDependencies: - '@babel/core': ^7.11.6 - - babel-plugin-check-es2015-constants@6.22.0: - resolution: {integrity: sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA==} - - babel-plugin-dev-expression@0.2.3: - resolution: {integrity: sha512-rP5LK9QQTzCW61nVVzw88En1oK8t8gTsIeC6E61oelxNsU842yMjF0G1MxhvUpCkxCEIj7sE8/e5ieTheT//uw==} - peerDependencies: - '@babel/core': ^7.0.0 - - babel-plugin-dynamic-import-node@1.1.0: - resolution: {integrity: sha512-tTfZbM9Ecwj3GK50mnPrUpinTwA4xXmDiQGCk/aBYbvl1+X8YqldK86wZ1owVJ4u3mrKbRlXMma80J18qwiaTQ==} - - babel-plugin-extract-import-names@1.6.22: - resolution: {integrity: sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==} - - babel-plugin-istanbul@4.1.6: - resolution: {integrity: sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==} - - babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - - babel-plugin-jest-hoist@20.0.3: - resolution: {integrity: sha512-rnyXaCLaHX6BjzT9h4UI1xK7oobCwtLfhompk0qxbcQNhw8JEidggjO1KonVrpdd2+q3QAww3DwVdTYs0g373Q==} - - babel-plugin-jest-hoist@22.4.4: - resolution: {integrity: sha512-DUvGfYaAIlkdnygVIEl0O4Av69NtuQWcrjMOv6DODPuhuGLDnbsARz3AwiiI/EkIMMlxQDUcrZ9yoyJvTNjcVQ==} - - babel-plugin-jest-hoist@25.5.0: - resolution: {integrity: sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g==} - engines: {node: '>= 8.3'} - - babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - babel-plugin-macros@2.8.0: - resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} - - babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} - - babel-plugin-named-exports-order@0.0.2: - resolution: {integrity: sha512-OgOYHOLoRK+/mvXU9imKHlG6GkPLYrUCvFXG/CM93R/aNNO8pOOF4aS+S8CCHMDQoNSeiOYEZb/G6RwL95Jktw==} - - babel-plugin-polyfill-corejs2@0.4.13: - resolution: {integrity: sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-corejs3@0.1.7: - resolution: {integrity: sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - babel-plugin-polyfill-corejs3@0.11.1: - resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-regenerator@0.0.4: - resolution: {integrity: sha512-+/uCzO9JTYVZVGCpZpVAQkgPGt2zkR0VYiZvJ4aVoCe4ccgpKvNQqcjzAgQzSsjK64Jhc5hvrCR3l0087BevkA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - babel-plugin-polyfill-regenerator@0.6.4: - resolution: {integrity: sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-react-docgen@4.2.1: - resolution: {integrity: sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==} - - babel-plugin-syntax-async-functions@6.13.0: - resolution: {integrity: sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw==} - - babel-plugin-syntax-class-properties@6.13.0: - resolution: {integrity: sha512-chI3Rt9T1AbrQD1s+vxw3KcwC9yHtF621/MacuItITfZX344uhQoANjpoSJZleAmW2tjlolqB/f+h7jIqXa7pA==} - - babel-plugin-syntax-dynamic-import@6.18.0: - resolution: {integrity: sha512-MioUE+LfjCEz65Wf7Z/Rm4XCP5k2c+TbMd2Z2JKc7U9uwjBhAfNPE48KC4GTGKhppMeYVepwDBNO/nGY6NYHBA==} - - babel-plugin-syntax-exponentiation-operator@6.13.0: - resolution: {integrity: sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ==} - - babel-plugin-syntax-flow@6.18.0: - resolution: {integrity: sha512-HbTDIoG1A1op7Tl/wIFQPULIBA61tsJ8Ntq2FAhLwuijrzosM/92kAfgU1Q3Kc7DH/cprJg5vDfuTY4QUL4rDA==} - - babel-plugin-syntax-jsx@6.18.0: - resolution: {integrity: sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==} - - babel-plugin-syntax-object-rest-spread@6.13.0: - resolution: {integrity: sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w==} - - babel-plugin-syntax-trailing-function-commas@6.22.0: - resolution: {integrity: sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ==} - - babel-plugin-transform-async-to-generator@6.24.1: - resolution: {integrity: sha512-7BgYJujNCg0Ti3x0c/DL3tStvnKS6ktIYOmo9wginv/dfZOrbSZ+qG4IRRHMBOzZ5Awb1skTiAsQXg/+IWkZYw==} - - babel-plugin-transform-class-properties@6.24.1: - resolution: {integrity: sha512-n4jtBA3OYBdvG5PRMKsMXJXHfLYw/ZOmtxCLOOwz6Ro5XlrColkStLnz1AS1L2yfPA9BKJ1ZNlmVCLjAL9DSIg==} - - babel-plugin-transform-es2015-arrow-functions@6.22.0: - resolution: {integrity: sha512-PCqwwzODXW7JMrzu+yZIaYbPQSKjDTAsNNlK2l5Gg9g4rz2VzLnZsStvp/3c46GfXpwkyufb3NCyG9+50FF1Vg==} - - babel-plugin-transform-es2015-block-scoped-functions@6.22.0: - resolution: {integrity: sha512-2+ujAT2UMBzYFm7tidUsYh+ZoIutxJ3pN9IYrF1/H6dCKtECfhmB8UkHVpyxDwkj0CYbQG35ykoz925TUnBc3A==} - - babel-plugin-transform-es2015-block-scoping@6.26.0: - resolution: {integrity: sha512-YiN6sFAQ5lML8JjCmr7uerS5Yc/EMbgg9G8ZNmk2E3nYX4ckHR01wrkeeMijEf5WHNK5TW0Sl0Uu3pv3EdOJWw==} - - babel-plugin-transform-es2015-classes@6.24.1: - resolution: {integrity: sha512-5Dy7ZbRinGrNtmWpquZKZ3EGY8sDgIVB4CU8Om8q8tnMLrD/m94cKglVcHps0BCTdZ0TJeeAWOq2TK9MIY6cag==} - - babel-plugin-transform-es2015-computed-properties@6.24.1: - resolution: {integrity: sha512-C/uAv4ktFP/Hmh01gMTvYvICrKze0XVX9f2PdIXuriCSvUmV9j+u+BB9f5fJK3+878yMK6dkdcq+Ymr9mrcLzw==} - - babel-plugin-transform-es2015-destructuring@6.23.0: - resolution: {integrity: sha512-aNv/GDAW0j/f4Uy1OEPZn1mqD+Nfy9viFGBfQ5bZyT35YqOiqx7/tXdyfZkJ1sC21NyEsBdfDY6PYmLHF4r5iA==} - - babel-plugin-transform-es2015-duplicate-keys@6.24.1: - resolution: {integrity: sha512-ossocTuPOssfxO2h+Z3/Ea1Vo1wWx31Uqy9vIiJusOP4TbF7tPs9U0sJ9pX9OJPf4lXRGj5+6Gkl/HHKiAP5ug==} - - babel-plugin-transform-es2015-for-of@6.23.0: - resolution: {integrity: sha512-DLuRwoygCoXx+YfxHLkVx5/NpeSbVwfoTeBykpJK7JhYWlL/O8hgAK/reforUnZDlxasOrVPPJVI/guE3dCwkw==} - - babel-plugin-transform-es2015-function-name@6.24.1: - resolution: {integrity: sha512-iFp5KIcorf11iBqu/y/a7DK3MN5di3pNCzto61FqCNnUX4qeBwcV1SLqe10oXNnCaxBUImX3SckX2/o1nsrTcg==} - - babel-plugin-transform-es2015-literals@6.22.0: - resolution: {integrity: sha512-tjFl0cwMPpDYyoqYA9li1/7mGFit39XiNX5DKC/uCNjBctMxyL1/PT/l4rSlbvBG1pOKI88STRdUsWXB3/Q9hQ==} - - babel-plugin-transform-es2015-modules-amd@6.24.1: - resolution: {integrity: sha512-LnIIdGWIKdw7zwckqx+eGjcS8/cl8D74A3BpJbGjKTFFNJSMrjN4bIh22HY1AlkUbeLG6X6OZj56BDvWD+OeFA==} - - babel-plugin-transform-es2015-modules-commonjs@6.26.2: - resolution: {integrity: sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==} - - babel-plugin-transform-es2015-modules-systemjs@6.24.1: - resolution: {integrity: sha512-ONFIPsq8y4bls5PPsAWYXH/21Hqv64TBxdje0FvU3MhIV6QM2j5YS7KvAzg/nTIVLot2D2fmFQrFWCbgHlFEjg==} - - babel-plugin-transform-es2015-modules-umd@6.24.1: - resolution: {integrity: sha512-LpVbiT9CLsuAIp3IG0tfbVo81QIhn6pE8xBJ7XSeCtFlMltuar5VuBV6y6Q45tpui9QWcy5i0vLQfCfrnF7Kiw==} - - babel-plugin-transform-es2015-object-super@6.24.1: - resolution: {integrity: sha512-8G5hpZMecb53vpD3mjs64NhI1au24TAmokQ4B+TBFBjN9cVoGoOvotdrMMRmHvVZUEvqGUPWL514woru1ChZMA==} - - babel-plugin-transform-es2015-parameters@6.24.1: - resolution: {integrity: sha512-8HxlW+BB5HqniD+nLkQ4xSAVq3bR/pcYW9IigY+2y0dI+Y7INFeTbfAQr+63T3E4UDsZGjyb+l9txUnABWxlOQ==} - - babel-plugin-transform-es2015-shorthand-properties@6.24.1: - resolution: {integrity: sha512-mDdocSfUVm1/7Jw/FIRNw9vPrBQNePy6wZJlR8HAUBLybNp1w/6lr6zZ2pjMShee65t/ybR5pT8ulkLzD1xwiw==} - - babel-plugin-transform-es2015-spread@6.22.0: - resolution: {integrity: sha512-3Ghhi26r4l3d0Js933E5+IhHwk0A1yiutj9gwvzmFbVV0sPMYk2lekhOufHBswX7NCoSeF4Xrl3sCIuSIa+zOg==} - - babel-plugin-transform-es2015-sticky-regex@6.24.1: - resolution: {integrity: sha512-CYP359ADryTo3pCsH0oxRo/0yn6UsEZLqYohHmvLQdfS9xkf+MbCzE3/Kolw9OYIY4ZMilH25z/5CbQbwDD+lQ==} - - babel-plugin-transform-es2015-template-literals@6.22.0: - resolution: {integrity: sha512-x8b9W0ngnKzDMHimVtTfn5ryimars1ByTqsfBDwAqLibmuuQY6pgBQi5z1ErIsUOWBdw1bW9FSz5RZUojM4apg==} - - babel-plugin-transform-es2015-typeof-symbol@6.23.0: - resolution: {integrity: sha512-fz6J2Sf4gYN6gWgRZaoFXmq93X+Li/8vf+fb0sGDVtdeWvxC9y5/bTD7bvfWMEq6zetGEHpWjtzRGSugt5kNqw==} - - babel-plugin-transform-es2015-unicode-regex@6.24.1: - resolution: {integrity: sha512-v61Dbbihf5XxnYjtBN04B/JBvsScY37R1cZT5r9permN1cp+b70DY3Ib3fIkgn1DI9U3tGgBJZVD8p/mE/4JbQ==} - - babel-plugin-transform-exponentiation-operator@6.24.1: - resolution: {integrity: sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ==} - - babel-plugin-transform-flow-strip-types@6.22.0: - resolution: {integrity: sha512-TxIM0ZWNw9oYsoTthL3lvAK3+eTujzktoXJg4ubGvICGbVuXVYv5hHv0XXpz8fbqlJaGYY4q5SVzaSmsg3t4Fg==} - - babel-plugin-transform-object-rest-spread@6.26.0: - resolution: {integrity: sha512-ocgA9VJvyxwt+qJB0ncxV8kb/CjfTcECUY4tQ5VT7nP6Aohzobm8CDFaQ5FHdvZQzLmf0sgDxB8iRXZXxwZcyA==} - - babel-plugin-transform-react-constant-elements@6.23.0: - resolution: {integrity: sha512-22TG15ONh0FWXj98Y5KOpMmEfDIMJa66rg58LzxssT0LUEFN8utkM1NmBEBx1WKkJFa6spK9aR4yLbDQntPxhg==} - - babel-plugin-transform-react-display-name@6.25.0: - resolution: {integrity: sha512-QLYkLiZeeED2PKd4LuXGg5y9fCgPB5ohF8olWUuETE2ryHNRqqnXlEVP7RPuef89+HTfd3syptMGVHeoAu0Wig==} - - babel-plugin-transform-react-jsx-self@6.22.0: - resolution: {integrity: sha512-Y3ZHP1nunv0U1+ysTNwLK39pabHj6cPVsfN4TRC7BDBfbgbyF4RifP5kd6LnbuMV9wcfedQMe7hn1fyKc7IzTQ==} - - babel-plugin-transform-react-jsx-source@6.22.0: - resolution: {integrity: sha512-pcDNDsZ9q/6LJmujQ/OhjeoIlp5Nl546HJ2yiFIJK3mYpgNXhI5/S9mXfVxu5yqWAi7HdI7e/q6a9xtzwL69Vw==} - - babel-plugin-transform-react-jsx@6.24.1: - resolution: {integrity: sha512-s+q/Y2u2OgDPHRuod3t6zyLoV8pUHc64i/O7ZNgIOEdYTq+ChPeybcKBi/xk9VI60VriILzFPW+dUxAEbTxh2w==} - - babel-plugin-transform-regenerator@6.26.0: - resolution: {integrity: sha512-LS+dBkUGlNR15/5WHKe/8Neawx663qttS6AGqoOUhICc9d1KciBvtrQSuc0PI+CxQ2Q/S1aKuJ+u64GtLdcEZg==} - - babel-plugin-transform-rename-import@2.3.0: - resolution: {integrity: sha512-dPgJoT57XC0PqSnLgl2FwNvxFrWlspatX2dkk7yjKQj5HHGw071vAcOf+hqW8ClqcBDMvEbm6mevn5yHAD8mlQ==} - - babel-plugin-transform-runtime@6.23.0: - resolution: {integrity: sha512-cpGMVC1vt/772y3jx1gwSaTitQVZuFDlllgreMsZ+rTYC6jlYXRyf5FQOgSnckOiA5QmzbXTyBY2A5AmZXF1fA==} - - babel-plugin-transform-strict-mode@6.24.1: - resolution: {integrity: sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw==} - - babel-plugin-transform-typescript-metadata@0.3.2: - resolution: {integrity: sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==} - peerDependencies: - '@babel/core': ^7 - '@babel/traverse': ^7 - peerDependenciesMeta: - '@babel/traverse': - optional: true - - babel-preset-current-node-syntax@0.1.4: - resolution: {integrity: sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==} - peerDependencies: - '@babel/core': ^7.0.0 - - babel-preset-current-node-syntax@1.1.0: - resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} - peerDependencies: - '@babel/core': ^7.0.0 - - babel-preset-env@1.6.1: - resolution: {integrity: sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==} - - babel-preset-flow@6.23.0: - resolution: {integrity: sha512-PQZFJXnM3d80Vq4O67OE6EMVKIw2Vmzy8UXovqulNogCtblWU8rzP7Sm5YgHiCg4uejUxzCkHfNXQ4Z6GI+Dhw==} - - babel-preset-jest@20.0.3: - resolution: {integrity: sha512-qeYOCuriyIDRKDE/dByN/yCc/przV2LdHbxldeSsjOr1khQi2o2CzrHXUQM7dSWfmqwxTifznw+bNg59kkI18w==} - - babel-preset-jest@22.4.4: - resolution: {integrity: sha512-+dxMtOFwnSYWfum0NaEc0O03oSdwBsjx4tMSChRDPGwu/4wSY6Q6ANW3wkjKpJzzguaovRs/DODcT4hbSN8yiA==} - - babel-preset-jest@25.5.0: - resolution: {integrity: sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw==} - engines: {node: '>= 8.3'} - peerDependencies: - '@babel/core': ^7.0.0 - - babel-preset-jest@29.6.3: - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - - babel-preset-react-app@3.1.2: - resolution: {integrity: sha512-/sh5Qd5T08PYa6t4kuCdKh9tXp6/m/Jwyx7PJTqugsYMfsDUJMlBXOs5EwFODHprzjWrmQ0SydnMZu9FY4MZYg==} - peerDependencies: - babel-runtime: ^6.23.0 - - babel-preset-react@6.24.1: - resolution: {integrity: sha512-phQe3bElbgF887UM0Dhz55d22ob8czTL1kbhZFwpCE6+R/X9kHktfwmx9JZb+bBSVRGphP5tZ9oWhVhlgjrX3Q==} - - babel-register@6.26.0: - resolution: {integrity: sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A==} - - babel-runtime@6.26.0: - resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} - - babel-template@6.26.0: - resolution: {integrity: sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==} - - babel-traverse@6.26.0: - resolution: {integrity: sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==} - - babel-types@6.26.0: - resolution: {integrity: sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==} - - babylon@6.18.0: - resolution: {integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==} - hasBin: true - - bail@1.0.5: - resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} - - bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - - balanced-match@0.4.2: - resolution: {integrity: sha512-STw03mQKnGUYtoNjmowo4F2cRmIIxYEGiMsjjwla/u5P1lxadj/05WkNaFjNiKTgJkj8KiXbgAiRTmcQRwQNtg==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - balanced-match@2.0.0: - resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} - - base16@1.0.0: - resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - basic-auth@2.0.1: - resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} - engines: {node: '>= 0.8'} - - batch@0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - - bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - - better-opn@2.1.1: - resolution: {integrity: sha512-kIPXZS5qwyKiX/HcRvDYfmBQUa8XP17I0mYZZ0y4UhpYOSvtsLHDYqmomS+Mj20aDvD3knEiQ0ecQy2nhio3yA==} - engines: {node: '>8.0.0'} - - better-opn@3.0.2: - resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} - engines: {node: '>=12.0.0'} - - big-integer@1.6.52: - resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} - engines: {node: '>=0.6'} - - big.js@3.2.0: - resolution: {integrity: sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==} - - big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - - binary-extensions@1.13.1: - resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} - engines: {node: '>=0.10.0'} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - binary@0.3.0: - resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} - - binaryextensions@6.11.0: - resolution: {integrity: sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==} - engines: {node: '>=4'} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - - bl@1.2.3: - resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} - - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - block-stream@0.0.9: - resolution: {integrity: sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==} - engines: {node: 0.4 || >=0.5.8} - - bluebird@3.4.7: - resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} - - bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - - blueimp-md5@2.19.0: - resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} - - body-parser@1.20.3: - resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - body-parser@2.2.0: - resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} - engines: {node: '>=18'} - - bonjour-service@1.3.0: - resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==} - - boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - - boundary@2.0.0: - resolution: {integrity: sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==} - - bowser@2.11.0: - resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} - - boxen@1.3.0: - resolution: {integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==} - engines: {node: '>=4'} - - boxen@5.1.2: - resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} - engines: {node: '>=10'} - - bplist-parser@0.1.1: - resolution: {integrity: sha512-2AEM0FXy8ZxVLBuqX0hqt1gDwcnz2zygEkQ6zaD5Wko/sB9paUNwlpawrFtKeHUAQUOzjVy9AO4oeonqIHKA9Q==} - - bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} - - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browser-assert@1.2.1: - resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} - - browser-process-hrtime@1.0.0: - resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} - - browser-resolve@1.11.3: - resolution: {integrity: sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - browserify-zlib@0.1.4: - resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} - - browserslist@1.7.7: - resolution: {integrity: sha512-qHJblDE2bXVRYzuDetv/wAeHOJyO97+9wxC1cdCtyzgNuSozOyRCiiLaCR1f71AN66lQdVVBipWm63V+a7bPOw==} - deprecated: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools. - hasBin: true - - browserslist@2.11.3: - resolution: {integrity: sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==} - deprecated: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools. - hasBin: true - - browserslist@4.25.0: - resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - browserslist@4.25.1: - resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - - bser@1.0.2: - resolution: {integrity: sha512-kKi2swDowbCsnwsYyJnMkz3N1utuJfnWcvzxVX45nWuumTNEkig97rvLVN60+8OWgAWuJdIyEfTPTZqyPoklwA==} - - bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - - buffer-alloc-unsafe@1.1.0: - resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} - - buffer-alloc@1.2.0: - resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} - - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - - buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - - buffer-fill@1.0.0: - resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer-indexof-polyfill@1.0.2: - resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} - engines: {node: '>=0.10'} - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - buffers@0.1.1: - resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} - engines: {node: '>=0.2.0'} - - bufferstreams@1.1.3: - resolution: {integrity: sha512-HaJnVuslRF4g2kSDeyl++AaVizoitCpL9PglzCYwy0uHHyvWerfvEb8jWmYbF1z4kiVFolGomnxSGl+GUQp2jg==} - engines: {node: '>= 0.10.0'} - - bufferstreams@3.0.0: - resolution: {integrity: sha512-Qg0ggJUWJq90vtg4lDsGN9CDWvzBMQxhiEkSOD/sJfYt6BLect3eV1/S6K7SCSKJ34n60rf6U5eUPmQENVE4UA==} - engines: {node: '>=8.12.0'} - - builtin-modules@1.1.1: - resolution: {integrity: sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==} - engines: {node: '>=0.10.0'} - - builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - - bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} - engines: {node: '>=18'} - - byline@5.0.0: - resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} - engines: {node: '>=0.10.0'} - - bytes-iec@3.1.1: - resolution: {integrity: sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==} - engines: {node: '>= 0.8'} - - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - c8@10.1.3: - resolution: {integrity: sha512-LvcyrOAaOnrrlMpW22n690PUvxiq4Uf9WMhQwNJ9vgagkL/ph1+D4uvjvDA5XCbykrc0sx+ay6pVi9YZ1GnhyA==} - engines: {node: '>=18'} - hasBin: true - peerDependencies: - monocart-coverage-reports: ^2 - peerDependenciesMeta: - monocart-coverage-reports: - optional: true - - c8@7.14.0: - resolution: {integrity: sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==} - engines: {node: '>=10.12.0'} - hasBin: true - - cacache@10.0.4: - resolution: {integrity: sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==} - - cacache@15.3.0: - resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} - engines: {node: '>= 10'} - - cacache@16.1.3: - resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - cacheable-lookup@7.0.0: - resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} - engines: {node: '>=14.16'} - - cacheable-request@10.2.14: - resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} - engines: {node: '>=14.16'} - - cacheable-request@12.0.1: - resolution: {integrity: sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==} - engines: {node: '>=18'} - - cacheable@1.10.0: - resolution: {integrity: sha512-SSgQTAnhd7WlJXnGlIi4jJJOiHzgnM5wRMEPaXAU4kECTAMpBoYKoZ9i5zHmclIEZbxcu3j7yY/CF8DTmwIsHg==} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - - call-me-maybe@1.0.2: - resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} - - callsite@1.0.0: - resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} - - callsites@2.0.0: - resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} - engines: {node: '>=4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - camel-case@3.0.0: - resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} - - camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - - camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - - camelcase-keys@2.1.0: - resolution: {integrity: sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==} - engines: {node: '>=0.10.0'} - - camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - - camelcase-keys@7.0.2: - resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==} - engines: {node: '>=12'} - - camelcase@2.1.1: - resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} - engines: {node: '>=0.10.0'} - - camelcase@3.0.0: - resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} - engines: {node: '>=0.10.0'} - - camelcase@4.1.0: - resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} - engines: {node: '>=4'} - - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - caniuse-api@1.6.1: - resolution: {integrity: sha512-SBTl70K0PkDUIebbkXrxWqZlHNs0wRgRD6QZ8guctShjbh63gEPfF+Wj0Yw+75f5Y8tSzqAI/NcisYv/cCah2Q==} - - caniuse-api@3.0.0: - resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - - caniuse-db@1.0.30001724: - resolution: {integrity: sha512-yNLeCTKQVuG1ZPknCQ9xhLIKTrGc5fWgadIf1PA8tqiS0ckZEcDfuacS/IQRO6kpv9KyoqJavrpQmosCAB+ccA==} - - caniuse-lite@1.0.30001724: - resolution: {integrity: sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==} - - caniuse-lite@1.0.30001727: - resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} - - capture-exit@2.0.0: - resolution: {integrity: sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==} - engines: {node: 6.* || 8.* || >= 10.*} - - capture-stack-trace@1.0.2: - resolution: {integrity: sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==} - engines: {node: '>=0.10.0'} - - case-sensitive-paths-webpack-plugin@2.1.1: - resolution: {integrity: sha512-Zg7Z9IuE0T+Ilg+o0IVpZXHAcN6VHO80BVxak3RIB1pmcbiITr06WlZ45Xa/KGQ7fQ/ar6C1KEkeI93tojBJPQ==} - engines: {node: '>4.0'} - - case-sensitive-paths-webpack-plugin@2.4.0: - resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} - engines: {node: '>=4'} - - case@1.6.3: - resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} - engines: {node: '>= 0.8.0'} - - caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - - ccount@1.1.0: - resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} - - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} - - chai@5.2.0: - resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} - engines: {node: '>=12'} - - chai@5.2.1: - resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} - engines: {node: '>=18'} - - chainsaw@0.1.0: - resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} - - chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - - character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - - character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - - character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - - character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - - character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - - character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} - - character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - - 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==} - engines: {node: '>= 16'} - - cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} - - cheerio@1.1.0: - resolution: {integrity: sha512-+0hMx9eYhJvWbgpKV9hN7jg0JcwydpopZE4hgi+KvQtByZXPp04NiCWU0LzcAbP63abZckIHkTQaXVF52mX3xQ==} - engines: {node: '>=18.17'} - - chokidar@1.7.0: - resolution: {integrity: sha512-mk8fAWcRUOxY7btlLtitj3A45jOwSAxH4tOFOoEGbVsl6cL6pPMWUy7dwZ/canfj3QEdP6FHSnf/l1c6/WkzVg==} - - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} - - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - - chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} - - ci-info@1.6.0: - resolution: {integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==} - - ci-info@2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - - citty@0.1.6: - resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} - - cjs-module-lexer@1.4.3: - resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} - - clap@1.2.3: - resolution: {integrity: sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==} - engines: {node: '>=0.10.0'} - - classnames@2.5.1: - resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} - - clean-css@4.2.4: - resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} - engines: {node: '>= 4.0'} - - clean-css@5.3.3: - resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} - engines: {node: '>= 10.0'} - - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - - clean-stack@4.2.0: - resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} - engines: {node: '>=12'} - - cli-boxes@1.0.0: - resolution: {integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==} - engines: {node: '>=0.10.0'} - - cli-boxes@2.2.1: - 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'} - - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - - cli-cursor@5.0.0: - resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} - engines: {node: '>=18'} - - cli-spinners@1.3.1: - resolution: {integrity: sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==} - engines: {node: '>=4'} - - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - - cli-table3@0.6.5: - resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} - engines: {node: 10.* || >= 12.*} - - cli-truncate@4.0.0: - resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} - engines: {node: '>=18'} - - 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==} - - clipboardy@4.0.0: - resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} - engines: {node: '>=18'} - - cliui@3.2.0: - resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} - - cliui@4.1.0: - resolution: {integrity: sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==} - - cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - - closest@0.0.1: - resolution: {integrity: sha512-HafRXTAiWp5nf6kxOy2EoIGSsJMn0zew9E5zp3Dy/8CXdp8GvVjZn1TSMEVdDxSP/acXZcWJWiIgF83Di7M1Ew==} - - cls-hooked@4.2.2: - resolution: {integrity: sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw==} - engines: {node: ^4.7 || >=6.9 || >=7.3 || >=8.2.1} - - clsx@1.2.1: - resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} - engines: {node: '>=6'} - - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - - co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - - coa@1.0.4: - resolution: {integrity: sha512-KAGck/eNAmCL0dcT3BiuYwLbExK6lduR8DxM3C1TyDzaXhZHyZ8ooX5I5+na2e3dPFuibfxrGdorr0/Lr7RYCQ==} - engines: {node: '>= 0.8.0'} - - cockatiel@3.2.1: - resolution: {integrity: sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==} - engines: {node: '>=16'} - - code-block-writer@13.0.3: - resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} - - code-point-at@1.1.0: - resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} - engines: {node: '>=0.10.0'} - - codemirror-graphql@2.2.3: - resolution: {integrity: sha512-tblvRpDlys/Q87TIOXOBpHwGmc1m9r4lGr+F0+Px5G60ZBtyWcMQFyGCxJvri4KlpQldVujhTmjO5HGeR4s4BQ==} - peerDependencies: - '@codemirror/language': 6.0.0 - codemirror: ^5.65.3 - graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 - - codemirror@5.65.19: - resolution: {integrity: sha512-+aFkvqhaAVr1gferNMuN8vkTSrWIFvzlMV9I2KBLCWS2WpZ2+UAkZjlMZmEuT+gcXTi6RrGQCkWq1/bDtGqhIA==} - - collapse-white-space@1.0.6: - resolution: {integrity: sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==} - - collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - color-string@0.3.0: - resolution: {integrity: sha512-sz29j1bmSDfoAxKIEU6zwoIZXN6BrFbAMIhfYCNyiZXBDuU/aiHlN84lp/xDzL2ubyFhLDobHIlU1X70XRrMDA==} - - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - - color@0.11.4: - resolution: {integrity: sha512-Ajpjd8asqZ6EdxQeqGzU5WBhhTfJ/0cA4Wlbre7e5vXfmDSmda7Ov6jeKoru+b0vHcb1CqvuroTHp5zIWzhVMA==} - - color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} - - colord@2.9.3: - resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} - - colorette@1.4.0: - resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} - - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - - colormin@1.1.2: - resolution: {integrity: sha512-XSEQUUQUR/lXqGyddiNH3XYFUPYlYr1vXy9rTFMsSOw+J7Q6EQkdlQIrTlYn4TccpsOaUE1PYQNjBn20gwCdgQ==} - - colors@1.1.2: - resolution: {integrity: sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==} - engines: {node: '>=0.1.90'} - - colors@1.4.0: - resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} - engines: {node: '>=0.1.90'} - - colorspace@1.1.4: - resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - comma-separated-tokens@1.0.8: - resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} - - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - - commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - - commander@14.0.0: - resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} - engines: {node: '>=20'} - - commander@2.13.0: - resolution: {integrity: sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==} - - commander@2.17.1: - resolution: {integrity: sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==} - - commander@2.19.0: - resolution: {integrity: sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - - commander@6.2.1: - resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} - engines: {node: '>= 6'} - - commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - - commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - - commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - - common-path-prefix@3.0.0: - resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - - commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - - compare-versions@6.1.1: - resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} - - compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - - compression@1.8.0: - resolution: {integrity: sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==} - engines: {node: '>= 0.8.0'} - - concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} - - concat-with-sourcemaps@1.1.0: - resolution: {integrity: sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==} - - confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - - configstore@3.1.5: - resolution: {integrity: sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==} - engines: {node: '>=4'} - - confusing-browser-globals@1.0.11: - resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} - - connect-history-api-fallback@2.0.0: - resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} - engines: {node: '>=0.8'} - - consola@3.4.2: - resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} - engines: {node: ^14.18.0 || >=16.10.0} - - console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - - constants-browserify@1.0.0: - resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} - - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - - content-disposition@1.0.0: - resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} - engines: {node: '>= 0.6'} - - content-type-parser@1.0.2: - resolution: {integrity: sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==} - deprecated: Use whatwg-mimetype instead - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - continuation-local-storage@3.2.1: - resolution: {integrity: sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==} - - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - - cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} - - cookie@0.7.1: - resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} - engines: {node: '>= 0.6'} - - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - - copy-concurrently@1.0.5: - resolution: {integrity: sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==} - deprecated: This package is no longer supported. - - copy-to-clipboard@3.3.3: - resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} - - copy-webpack-plugin@13.0.0: - resolution: {integrity: sha512-FgR/h5a6hzJqATDGd9YG41SeDViH+0bkHn6WNXCi5zKAZkeESeSxLySSsFLHqLEVCh0E+rITmCf0dusXWYukeQ==} - engines: {node: '>= 18.12.0'} - peerDependencies: - webpack: ^5.94.0 - - copyfiles@2.4.1: - resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} - hasBin: true - - core-js-compat@3.43.0: - resolution: {integrity: sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==} - - core-js-pure@3.43.0: - resolution: {integrity: sha512-i/AgxU2+A+BbJdMxh3v7/vxi2SbFqxiFmg6VsDwYB4jkucrd1BZNA9a9gphC0fYMG5IBSgQcbQnk865VCLe7xA==} - - 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.43.0: - resolution: {integrity: sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==} - - core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - cors-anywhere@0.4.4: - resolution: {integrity: sha512-8OBFwnzMgR4mNrAeAyOLB2EruS2z7u02of2bOu7i9kKYlZG+niS7CTHLPgEXKWW2NAOJWRry9RRCaL9lJRjNqg==} - engines: {node: '>=0.10.0'} - - cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} - - corser@2.0.1: - resolution: {integrity: sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==} - engines: {node: '>= 0.4.0'} - - cosmiconfig@2.2.2: - resolution: {integrity: sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==} - engines: {node: '>=0.12'} - - cosmiconfig@6.0.0: - resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} - engines: {node: '>=8'} - - cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} - - cosmiconfig@8.3.6: - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - - cp-file@7.0.0: - resolution: {integrity: sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==} - engines: {node: '>=8'} - - cpx@1.5.0: - resolution: {integrity: sha512-jHTjZhsbg9xWgsP2vuNW2jnnzBX+p4T+vNI9Lbjzs1n4KhOfa22bQppiFYLsWQKd8TzmL5aSP/Me3yfsCwXbDA==} - hasBin: true - - cpy@8.1.2: - resolution: {integrity: sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg==} - engines: {node: '>=8'} - - create-error-class@3.0.2: - resolution: {integrity: sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==} - engines: {node: '>=0.10.0'} - - create-jest@29.7.0: - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - - create-storybook@9.0.17: - resolution: {integrity: sha512-ilnTYTiEA7Vw1+FCcGecwEgBUxYpsUnUmZkucV38JHUJDnE1MPKKvqi0qFG2x+zYiHA4X7j5IrYfKvh/X+H8+w==} - hasBin: true - - crelt@1.0.6: - resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} - - cron-expression-validator@1.0.20: - resolution: {integrity: sha512-g0osBTdp+1ryDw2vzlG6UpDPaa4fO94ZChF2R0lEnRurbuUEL74XEVX7xZJ13m4Mq/gb3ni6UQu8+Oqt+eocsw==} - - cron-parser@4.9.0: - resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} - engines: {node: '>=12.0.0'} - - cron-validator@1.3.1: - resolution: {integrity: sha512-C1HsxuPCY/5opR55G5/WNzyEGDWFVG+6GLrA+fW/sCTcP6A6NTjUP2AK7B8n2PyFs90kDG2qzwm8LMheADku6A==} - - cross-env@7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - hasBin: true - - cross-fetch@3.2.0: - resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} - - cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - - cross-spawn@6.0.6: - resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} - engines: {node: '>=4.8'} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - - crypto-js@4.2.0: - resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - - crypto-random-string@1.0.0: - resolution: {integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==} - engines: {node: '>=4'} - - crypto-random-string@2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} - - css-color-names@0.0.4: - resolution: {integrity: sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==} - - css-declaration-sorter@6.4.1: - resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} - engines: {node: ^10 || ^12 || >=14} - peerDependencies: - postcss: ^8.0.9 - - css-functions-list@3.2.3: - resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==} - engines: {node: '>=12 || >=16'} - - css-loader@0.28.7: - resolution: {integrity: sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==} - engines: {node: '>=0.12.0 || >=4.3.0 <5.0.0 || >=5.10'} - - css-loader@3.6.0: - resolution: {integrity: sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==} - engines: {node: '>= 8.9.0'} - peerDependencies: - webpack: ^5.94.0 - - css-loader@5.2.7: - resolution: {integrity: sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^5.94.0 - - css-loader@6.11.0: - resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} - engines: {node: '>= 12.13.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - webpack: ^5.94.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true - - css-loader@7.1.2: - resolution: {integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==} - engines: {node: '>= 18.12.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - webpack: ^5.94.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true - - css-select@4.3.0: - resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} - - css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} - - css-selector-tokenizer@0.7.3: - resolution: {integrity: sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==} - - css-tree@1.1.3: - resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} - engines: {node: '>=8.0.0'} - - css-tree@3.1.0: - resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - - css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - - css.escape@1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - - cssnano-preset-default@5.2.14: - resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - cssnano-utils@3.1.0: - resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - cssnano@3.10.0: - resolution: {integrity: sha512-0o0IMQE0Ezo4b41Yrm8U6Rp9/Ag81vNXY1gZMnT1XhO4DpjEf2utKERqWJbOoz3g1Wdc1d3QSta/cIuJ1wSTEg==} - - cssnano@5.1.15: - resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - csso@2.3.2: - resolution: {integrity: sha512-FmCI/hmqDeHHLaIQckMhMZneS84yzUZdrWDAvJVVxOwcKE1P1LF9FGmzr1ktIQSxOw6fl3PaQsmfg+GN+VvR3w==} - engines: {node: '>=0.10.0'} - hasBin: true - - csso@4.2.0: - resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} - engines: {node: '>=8.0.0'} - - cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - - cssom@0.4.4: - resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} - - cssom@0.5.0: - resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} - - cssstyle@0.2.37: - resolution: {integrity: sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==} - - cssstyle@1.4.0: - resolution: {integrity: sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==} - - cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} - - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - cubic2quad@1.2.1: - resolution: {integrity: sha512-wT5Y7mO8abrV16gnssKdmIhIbA9wSkeMzhh27jAguKrV82i24wER0vL5TGhUJ9dbJNDcigoRZ0IAHFEEEI4THQ==} - - currently-unhandled@0.4.1: - resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} - engines: {node: '>=0.10.0'} - - cyclist@1.0.2: - resolution: {integrity: sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==} - - d@1.0.2: - resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} - engines: {node: '>=0.12'} - - dagre@0.8.5: - resolution: {integrity: sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==} - - damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - - dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} - - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - - data-urls@1.1.0: - resolution: {integrity: sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==} - - data-urls@3.0.2: - resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} - engines: {node: '>=12'} - - data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} - - date-fns-tz@3.2.0: - resolution: {integrity: sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==} - peerDependencies: - date-fns: ^3.0.0 || ^4.0.0 - - date-fns@4.1.0: - resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} - - date-format@4.0.14: - resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} - engines: {node: '>=4.0'} - - debounce-promise@3.1.2: - resolution: {integrity: sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==} - - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.1: - resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decache@4.6.2: - resolution: {integrity: sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==} - - decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - decamelize@5.0.1: - resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==} - engines: {node: '>=10'} - - decimal.js@10.5.0: - resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} - - decode-named-character-reference@1.2.0: - resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} - - decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} - - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - - dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - - dedent@1.6.0: - resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} - engines: {node: '>=6'} - - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} - - deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - - default-browser-id@1.0.4: - resolution: {integrity: sha512-qPy925qewwul9Hifs+3sx1ZYn14obHxpkX+mPD369w4Rzg+YkJBgi3SOvwUq81nWSjqGUegIgEPwD8u+HUnxlw==} - engines: {node: '>=0.10.0'} - hasBin: true - - default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} - - default-browser-id@5.0.0: - resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} - engines: {node: '>=18'} - - default-browser@5.2.1: - resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} - engines: {node: '>=18'} - - default-require-extensions@1.0.0: - resolution: {integrity: sha512-Dn2eAftOqXhNXs5f/Xjn7QTZ6kDYkx7u0EXQInN1oyYwsZysu11q7oTtaKcbzLxZRJiDHa8VmwpWmb4lY5FqgA==} - engines: {node: '>=0.10.0'} - - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - - defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - - define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - defined@1.0.1: - resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} - - defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - - del-cli@5.1.0: - resolution: {integrity: sha512-xwMeh2acluWeccsfzE7VLsG3yTr7nWikbfw+xhMnpRrF15pGSkw+3/vJZWlGoE4I86UiLRNHicmKt4tkIX9Jtg==} - engines: {node: '>=14.16'} - hasBin: true - - del-cli@6.0.0: - resolution: {integrity: sha512-9nitGV2W6KLFyya4qYt4+9AKQFL+c0Ehj5K7V7IwlxTc6RMCfQUGY9E9pLG6e8TQjtwXpuiWIGGZb3mfVxyZkw==} - engines: {node: '>=18'} - hasBin: true - - del@2.2.2: - resolution: {integrity: sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==} - engines: {node: '>=0.10.0'} - - del@6.1.1: - resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} - engines: {node: '>=10'} - - del@7.1.0: - resolution: {integrity: sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==} - engines: {node: '>=14.16'} - - del@8.0.0: - resolution: {integrity: sha512-R6ep6JJ+eOBZsBr9esiNN1gxFbZE4Q2cULkUSFumGYecAiS6qodDvcPx/sFuWHMNul7DWmrtoEOpYSm7o6tbSA==} - engines: {node: '>=18'} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - - depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - detab@2.0.4: - resolution: {integrity: sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==} - - detect-indent@4.0.0: - resolution: {integrity: sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==} - engines: {node: '>=0.10.0'} - - detect-indent@6.1.0: - 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.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} - engines: {node: '>=8'} - - detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - - detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - - detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - - detect-package-manager@2.0.1: - resolution: {integrity: sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==} - engines: {node: '>=12'} - - detect-port-alt@1.1.6: - resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==} - engines: {node: '>= 4.2.1'} - hasBin: true - - detect-port@1.6.1: - resolution: {integrity: sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==} - engines: {node: '>= 4.0.0'} - hasBin: true - - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - - dexie@4.0.11: - resolution: {integrity: sha512-SOKO002EqlvBYYKQSew3iymBoN2EQ4BDw/3yprjh7kAfFzjBYkaMNa/pZvcA7HSWlcKSQb9XhPe3wKyQ0x4A8A==} - - diagnostic-channel-publishers@0.3.5: - resolution: {integrity: sha512-AOIjw4T7Nxl0G2BoBPhkQ6i7T4bUd9+xvdYizwvG7vVAM1dvr+SDrcUudlmzwH0kbEwdR2V1EcnKT0wAeYLQNQ==} - peerDependencies: - diagnostic-channel: '*' - - diagnostic-channel@0.2.0: - resolution: {integrity: sha512-awkcaaNNi0RfUGJf7r2+K4oJs1OyiIG2m/Jwvyi0OeQxdw+UU/iwbiejTPa3tUeyXtBcp2fef0JOJNdD62r/zg==} - - didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - - diff-sequences@25.2.6: - resolution: {integrity: sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==} - engines: {node: '>= 8.3'} - - diff-sequences@29.6.3: - 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==} - engines: {node: '>=0.3.1'} - - dir-glob@2.2.2: - resolution: {integrity: sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==} - engines: {node: '>=4'} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - - dnd-core@16.0.1: - resolution: {integrity: sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==} - - dns-packet@5.6.1: - resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} - engines: {node: '>=6'} - - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dom-accessibility-api@0.5.16: - resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} - - dom-accessibility-api@0.6.3: - resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} - - dom-converter@0.2.0: - resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} - - dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - - dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - - dom-urls@1.1.0: - resolution: {integrity: sha512-LNxCeExaNbczqMVfQUyLdd+r+smG7ixIa+doeyiJ7nTmL8aZRrJhHkEYBEYVGvYv7k2DOEBh2eKthoCmWpfICg==} - engines: {node: '>=0.8.0'} - - dom-walk@0.1.2: - resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domexception@1.0.1: - resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} - deprecated: Use your platform's native DOMException instead - - domexception@4.0.0: - resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} - engines: {node: '>=12'} - deprecated: Use your platform's native DOMException instead - - domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} - - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - - dompurify@3.2.4: - resolution: {integrity: sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==} - - domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - - domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - - dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - - dot-prop@4.2.1: - resolution: {integrity: sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==} - engines: {node: '>=4'} - - dotenv-expand@10.0.0: - resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} - engines: {node: '>=12'} - - dotenv-expand@4.2.0: - resolution: {integrity: sha512-pHWVt6L/YkqbBCMb1hG6e7oO0WdMhlapDIibl+BZ9PncVE3i+G77uvNr8GUxW2ItSituOK8QOYC9oOJjwWD94A==} - - dotenv-expand@5.1.0: - resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} - - dotenv@16.3.2: - resolution: {integrity: sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==} - engines: {node: '>=12'} - - dotenv@16.5.0: - resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} - engines: {node: '>=12'} - - dotenv@16.6.1: - resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} - engines: {node: '>=12'} - - dotenv@4.0.0: - resolution: {integrity: sha512-XcaMACOr3JMVcEv0Y/iUM2XaOsATRZ3U1In41/1jjK6vJZ2PZbQ1bzCG8uvaByfaBpl9gqc9QWJovpUGBXLLYQ==} - engines: {node: '>=4.6.0'} - - dotenv@8.6.0: - resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} - engines: {node: '>=10'} - - drange@1.1.1: - resolution: {integrity: sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==} - engines: {node: '>=4'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - duplexer2@0.1.4: - resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} - - duplexer3@0.1.5: - resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} - - duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - - duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - - ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - - editions@6.21.0: - resolution: {integrity: sha512-ofkXJtn7z0urokN62DI3SBo/5xAtF0rR7tn+S/bSYV79Ka8pTajIIl+fFQ1q88DQEImymmo97M4azY3WX/nUdg==} - engines: {node: '>=4'} - - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true - - electron-to-chromium@1.5.171: - resolution: {integrity: sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==} - - electron-to-chromium@1.5.185: - resolution: {integrity: sha512-dYOZfUk57hSMPePoIQ1fZWl1Fkj+OshhEVuPacNKWzC1efe56OsHY3l/jCfiAgIICOU3VgOIdoq7ahg7r7n6MQ==} - - email-addresses@5.0.0: - resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} - - emitter-listener@1.1.2: - resolution: {integrity: sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==} - - emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - - emoji-regex@10.4.0: - resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} - - emoji-regex@7.0.3: - resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - emojis-list@2.1.0: - resolution: {integrity: sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==} - engines: {node: '>= 0.10'} - - emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - - 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'} - - encoding-sniffer@0.2.1: - resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} - - encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - - endent@2.1.0: - resolution: {integrity: sha512-r8VyPX7XL8U01Xgnb1CjZ3XV+z90cXIJ9JPE/R9SEC9vpw2P6CfsRPJmp20DppC5N7ZAMCmjYkJIa744Iyg96w==} - - enhanced-resolve@3.4.1: - resolution: {integrity: sha512-ZaAux1rigq1e2nQrztHn4h2ugvpzZxs64qneNah+8Mh/K0CRqJFJc+UoXnUsq+1yX+DmQFPPdVqboKAJ89e0Iw==} - engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} - - enhanced-resolve@5.18.1: - resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} - engines: {node: '>=10.13.0'} - - enhanced-resolve@5.18.2: - resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} - engines: {node: '>=10.13.0'} - - enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} - - entities@2.1.0: - resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} - - entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} - - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - - envinfo@7.14.0: - resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} - engines: {node: '>=4'} - hasBin: true - - environment@1.1.0: - resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} - engines: {node: '>=18'} - - err-code@1.1.2: - resolution: {integrity: sha512-CJAN+O0/yA1CKfRn9SXOGctSpEM7DCon/r/5r2eXFMY2zCCJBasFhcM5I+1kh3Ap11FsQCX+vGHceNPvpWKhoA==} - - err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - - errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} - hasBin: true - - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - error-stack-parser@2.1.4: - resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - - es-abstract@1.24.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} - engines: {node: '>= 0.4'} - - es-array-method-boxes-properly@1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - - 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-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==} - engines: {node: '>= 0.4'} - - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - - 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'} - - es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} - - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} - - es-toolkit@1.39.7: - resolution: {integrity: sha512-ek/wWryKouBrZIjkwW2BFf91CWOIMvoy2AE5YYgUrfWsJQM2Su1LoLtrw8uusEpN9RfqLlV/0FVNjT0WMv8Bxw==} - - es5-ext@0.10.64: - resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} - engines: {node: '>=0.10'} - - es5-shim@4.6.7: - resolution: {integrity: sha512-jg21/dmlrNQI7JyyA2w7n+yifSxBng0ZralnSfVZjoCawgNTCnS+yBCyVM9DL5itm7SUnDGgv7hcq2XCZX4iRQ==} - engines: {node: '>=0.4.0'} - - es6-iterator@2.0.3: - resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@6.1.1: - resolution: {integrity: sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==} - - es6-shim@0.35.8: - resolution: {integrity: sha512-Twf7I2v4/1tLoIXMT8HlqaBSS5H2wQTs2wx3MNYCI8K1R1/clXyCazrcVCPm/FuO9cyV8+leEaZOWD5C253NDg==} - - es6-symbol@3.1.4: - 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==} - - esbuild-register@3.6.0: - resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} - peerDependencies: - esbuild: ^0.25.0 - - esbuild@0.25.5: - resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} - engines: {node: '>=18'} - hasBin: true - - esbuild@0.25.6: - resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} - engines: {node: '>=18'} - hasBin: true - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - - escodegen@1.14.3: - resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} - engines: {node: '>=4.0'} - hasBin: true - - escodegen@1.8.1: - resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} - engines: {node: '>=0.12.0'} - hasBin: true - - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - - eslint-config-prettier@6.15.0: - resolution: {integrity: sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==} - hasBin: true - peerDependencies: - eslint: '>=3.14.1' - - eslint-config-react-app@5.2.1: - resolution: {integrity: sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ==} - peerDependencies: - '@typescript-eslint/eslint-plugin': 2.x - '@typescript-eslint/parser': 2.x - babel-eslint: 10.x - eslint: 6.x - eslint-plugin-flowtype: 3.x || 4.x - eslint-plugin-import: 2.x - eslint-plugin-jsx-a11y: 6.x - eslint-plugin-react: 7.x - eslint-plugin-react-hooks: 1.x || 2.x - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-module-utils@2.12.1: - resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-flowtype@3.13.0: - resolution: {integrity: sha512-bhewp36P+t7cEV0b6OdmoRWJCBYRiHFlqPZAG1oS3SF+Y0LQkeDvFSM4oxoxvczD1OdONCXMlJfQFiWLcV9urw==} - engines: {node: '>=4'} - peerDependencies: - eslint: '>=5.0.0' - - eslint-plugin-import@2.32.0: - resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-jsx-a11y@6.10.2: - resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - - eslint-plugin-prettier@3.4.1: - resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} - engines: {node: '>=6.0.0'} - peerDependencies: - eslint: '>=5.0.0' - eslint-config-prettier: '*' - prettier: '>=1.13.0' - peerDependenciesMeta: - eslint-config-prettier: - optional: true - - eslint-plugin-react-hooks@2.5.1: - resolution: {integrity: sha512-Y2c4b55R+6ZzwtTppKwSmK/Kar8AdLiC2f9NADCuxbcTgPPg41Gyqa6b9GppgXSvCtkRw43ZE86CT5sejKC6/g==} - engines: {node: '>=7'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 - - eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - - eslint-plugin-react-hooks@5.2.0: - resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} - engines: {node: '>=10'} - 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.20: - resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==} - peerDependencies: - eslint: '>=8.40' - - eslint-plugin-react@7.37.5: - resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - - eslint-plugin-storybook@9.0.12: - resolution: {integrity: sha512-dSzcozoI7tQRqfMODWfxahrRmKWsK88yKSUcO0+s361oYcX7nf8nEu99TQ/wuDLRHh+Zi7E2j43cPMH8gFo8OA==} - engines: {node: '>=20.0.0'} - peerDependencies: - eslint: '>=8' - storybook: ^9.0.12 - - eslint-plugin-unused-imports@4.1.4: - resolution: {integrity: sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 - eslint: ^9.0.0 || ^8.0.0 - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - - eslint-scope@5.1.1: - 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-visitor-keys@1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} - - 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} - - eslint-visitor-keys@4.2.1: - 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==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - - esniff@2.0.1: - resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} - engines: {node: '>=0.10'} - - espree@10.4.0: - 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'} - hasBin: true - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@1.9.3: - resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} - engines: {node: '>=0.10.0'} - - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - estree-to-babel@3.2.1: - resolution: {integrity: sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==} - engines: {node: '>=8.3.0'} - - estree-util-is-identifier-name@3.0.0: - resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} - - estree-walker@0.2.1: - resolution: {integrity: sha512-6/I1dwNKk0N9iGOU3ydzAAurz4NPo/ttxZNCqgIVbWFvWyzWBSNonRrJ5CpjDuyBfmM7ENN7WCzUi9aT/UPXXQ==} - - estree-walker@0.6.1: - resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} - - estree-walker@1.0.1: - resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} - - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - event-emitter@0.3.5: - resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} - - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - eventsource-parser@3.0.2: - resolution: {integrity: sha512-6RxOBZ/cYgd8usLwsEl+EC09Au/9BcmCKYF2/xbml6DNczf7nv0MQb+7BA2F+li6//I+28VNlQR37XfQtcAJuA==} - engines: {node: '>=18.0.0'} - - eventsource@0.1.6: - resolution: {integrity: sha512-bbB5tEuvC+SuRUG64X8ghvjgiRniuA4WlehWbFnoN4z6TxDXpyX+BMHF7rMgZAqoe+EbyNRUbHN0uuP9phy5jQ==} - engines: {node: '>=0.8.0'} - - eventsource@3.0.7: - resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} - engines: {node: '>=18.0.0'} - - exec-sh@0.2.2: - resolution: {integrity: sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==} - - exec-sh@0.3.6: - resolution: {integrity: sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==} - - execa@0.7.0: - resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} - engines: {node: '>=4'} - - execa@1.0.0: - resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} - engines: {node: '>=6'} - - execa@3.4.0: - resolution: {integrity: sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==} - engines: {node: ^8.12.0 || >=9.7.0} - - execa@4.1.0: - resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} - engines: {node: '>=10'} - - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - - exenv-es6@1.1.1: - resolution: {integrity: sha512-vlVu3N8d6yEMpMsEm+7sUBAI81aqYYuEvfK0jNqmdb/OPXzzH7QWDDnVjMvDSY47JdHEqx/dfC/q8WkfoTmpGQ==} - - exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - - expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - - expand-tilde@2.0.2: - resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} - engines: {node: '>=0.10.0'} - - expect@22.4.3: - resolution: {integrity: sha512-XcNXEPehqn8b/jm8FYotdX0YrXn36qp4HWlrVT4ktwQas1l1LPxiVWncYnnL2eyMtKAmVIaG0XAp0QlrqJaxaA==} - - expect@25.5.0: - resolution: {integrity: sha512-w7KAXo0+6qqZZhovCaBVPSIqQp7/UTcx4M9uKt2m6pd2VB1voyC8JizLRqeEqud3AAVP02g+hbErDu5gu64tlA==} - engines: {node: '>= 8.3'} - - expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - exponential-backoff@3.1.2: - resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} - - express-rate-limit@7.5.1: - resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} - engines: {node: '>= 16'} - peerDependencies: - express: '>= 4.11' - - express@4.21.2: - resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} - engines: {node: '>= 0.10.0'} - - express@5.1.0: - resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} - engines: {node: '>= 18'} - - ext@1.7.0: - resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - - extend-shallow@3.0.2: - resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} - engines: {node: '>=0.10.0'} - - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - - external-editor@2.2.0: - 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'} - deprecated: Deprecated. Please use https://github.com/webpack-contrib/mini-css-extract-plugin - peerDependencies: - webpack: ^5.94.0 - - extract-zip@1.7.0: - resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==} - hasBin: true - - extsprintf@1.3.0: - 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==} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - - fast-glob@2.2.7: - resolution: {integrity: sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==} - engines: {node: '>=4.0.0'} - - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - - fast-json-parse@1.0.3: - resolution: {integrity: sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==} - - fast-json-patch@3.1.1: - resolution: {integrity: sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - - fast-uri@3.0.6: - resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} - - fast-xml-parser@4.4.1: - resolution: {integrity: sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==} - hasBin: true - - fast-xml-parser@5.2.5: - resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} - hasBin: true - - fastest-levenshtein@1.0.16: - resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} - engines: {node: '>= 4.9.1'} - - fastparse@1.1.2: - resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} - - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - - fault@1.0.4: - resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} - - faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} - - fb-watchman@1.9.2: - resolution: {integrity: sha512-XgitQpaII7LkblC9X8HhfnfuDpyOYSB/Xw8h3Q/gXfMtyL7UICDS1axIlafhwfvKxPjrqnu7EfO7i3A1kH+Rfg==} - - fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - - fbemitter@3.0.0: - resolution: {integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==} - - fbjs-css-vars@1.0.2: - resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} - - fbjs@3.0.5: - resolution: {integrity: sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==} - - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - fecha@4.2.3: - resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} - - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - - fetch-retry@5.0.6: - resolution: {integrity: sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==} - - figures@2.0.0: - resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} - engines: {node: '>=4'} - - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - - file-entry-cache@10.1.1: - resolution: {integrity: sha512-zcmsHjg2B2zjuBgjdnB+9q0+cWcgWfykIcsDkWDB4GTPtl1eXUA+gTI6sO0u01AqK3cliHryTU55/b2Ow1hfZg==} - - 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@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - - file-js@0.3.0: - resolution: {integrity: sha512-nZlX1pxpV6Mt8BghM3Z150bpsCT1zqil97UryusstZLSs9caYAe0Wph2UKPC3awfM2Dq4ri1Sv99KuK4EIImlA==} - - file-loader@1.1.5: - resolution: {integrity: sha512-RzGHDatcVNpGISTvCpfUfOGpYuSR7HSsSg87ki+wF6rw1Hm0RALPTiAdsxAq1UwLf0RRhbe22/eHK6nhXspiOQ==} - engines: {node: '>= 4.3 < 5.0.0 || >= 5.10'} - peerDependencies: - webpack: ^5.94.0 - - file-loader@6.2.0: - resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^5.94.0 - - file-system-cache@1.1.0: - resolution: {integrity: sha512-IzF5MBq+5CR0jXx5RxPe4BICl/oEhBSXKaL9fLhAXrIfIUS77Hr4vzrYyqYMHN6uTt+BOqi3fDCTjjEBCjERKw==} - - file-system-cache@2.3.0: - resolution: {integrity: sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==} - - file-type@18.7.0: - resolution: {integrity: sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==} - engines: {node: '>=14.16'} - - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - file-uri-to-path@2.0.0: - resolution: {integrity: sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==} - engines: {node: '>= 6'} - - filehound@1.17.6: - resolution: {integrity: sha512-5q4zjFkI8W2zLmvbvyvI//K882IpEj6sMNXPUQlk5H6W4Wh3OSSylEAIEmMLELP9G7ileYjTKPXOn0YzzS55Lg==} - - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - - filename-reserved-regex@2.0.0: - resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} - engines: {node: '>=4'} - - filenamify@4.3.0: - resolution: {integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==} - engines: {node: '>=8'} - - fileset@2.0.3: - resolution: {integrity: sha512-UxowFKnAFIwtmSxgKjWAVgjE3Fk7MQJT0ZIyl0NwIFZTrx4913rLaonGJ84V+x/2+w/pe4ULHRns+GZPs1TVuw==} - - filesize@3.5.11: - resolution: {integrity: sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g==} - engines: {node: '>= 0.4.0'} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - finalhandler@1.3.1: - resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} - engines: {node: '>= 0.8'} - - finalhandler@2.1.0: - resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} - engines: {node: '>= 0.8'} - - find-cache-dir@1.0.0: - resolution: {integrity: sha512-46TFiBOzX7xq/PcSWfFwkyjpemdRnMe31UQF+os0y+1W3k95f6R4SEt02Hj4p3X0Mir9gfrkmOtshFidS0VPUg==} - engines: {node: '>=4'} - - find-cache-dir@2.1.0: - resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} - engines: {node: '>=6'} - - find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} - - find-cache-dir@4.0.0: - resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} - engines: {node: '>=14.16'} - - find-index@0.1.1: - resolution: {integrity: sha512-uJ5vWrfBKMcE6y2Z8834dwEZj9mNGxYa3t3I53OwFeuZ8D9oc2E5zcsrkuhX6h4iYrjhiv0T3szQmxlAV9uxDg==} - - find-process@1.4.10: - resolution: {integrity: sha512-ncYFnWEIwL7PzmrK1yZtaccN8GhethD37RzBHG6iOZoFYB4vSmLLXfeWJjeN5nMvCJMjOtBvBBF8OgxEcikiZg==} - hasBin: true - - find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - - find-up@1.1.2: - resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} - engines: {node: '>=0.10.0'} - - find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} - - find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} - - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - find-up@7.0.0: - 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} - - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - - flat-cache@6.1.10: - resolution: {integrity: sha512-B6/v1f0NwjxzmeOhzfXPGWpKBVA207LS7lehaVKQnFrVktcFRfkzjZZ2gwj2i1TkEUMQht7ZMJbABUT5N+V1Nw==} - - 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==} - - flatten@1.0.3: - resolution: {integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==} - deprecated: flatten is deprecated in favor of utility frameworks such as lodash. - - flow-parser@0.275.0: - resolution: {integrity: sha512-fHNwawoA2LM7FsxhU/1lTRGq9n6/Q8k861eHgN7GKtamYt9Qrxpg/ZSrev8o1WX7fQ2D3Gg3+uvYN15PmsG7Yw==} - engines: {node: '>=0.4.0'} - - flush-write-stream@1.1.1: - resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} - - flux@4.0.4: - resolution: {integrity: sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw==} - peerDependencies: - react: ^15.0.2 || ^16.0.0 || ^17.0.0 - - fn.name@1.1.0: - resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - - foreground-child@2.0.0: - resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} - engines: {node: '>=8.0.0'} - - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - - forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - - fork-ts-checker-webpack-plugin@0.2.10: - resolution: {integrity: sha512-L7mhhCLDyvh2koCgj7Bvovyh/Ryg/DcktoHP3kEwBljNbjxUE4YK1aVMa9doe8T37JJWRQy9iP+0Qq3nBNb39g==} - peerDependencies: - eslint: '>= 6' - typescript: ^2.1.0 - vue-template-compiler: '*' - webpack: ^5.94.0 - peerDependenciesMeta: - eslint: - optional: true - vue-template-compiler: - optional: true - - fork-ts-checker-webpack-plugin@4.1.6: - resolution: {integrity: sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==} - engines: {node: '>=6.11.5', yarn: '>=1.0.0'} - peerDependencies: - eslint: '>= 6' - typescript: '>= 2.7' - vue-template-compiler: '*' - webpack: ^5.94.0 - peerDependenciesMeta: - eslint: - optional: true - vue-template-compiler: - optional: true - - fork-ts-checker-webpack-plugin@6.5.3: - resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} - engines: {node: '>=10', yarn: '>=1.0.0'} - peerDependencies: - eslint: '>= 6' - typescript: '>= 2.7' - vue-template-compiler: '*' - webpack: ^5.94.0 - peerDependenciesMeta: - eslint: - optional: true - vue-template-compiler: - optional: true - - fork-ts-checker-webpack-plugin@8.0.0: - resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} - engines: {node: '>=12.13.0', yarn: '>=1.0.0'} - peerDependencies: - typescript: '>3.6.0' - webpack: ^5.94.0 - - fork-ts-checker-webpack-plugin@9.1.0: - resolution: {integrity: sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q==} - engines: {node: '>=14.21.3'} - peerDependencies: - typescript: '>3.6.0' - webpack: ^5.94.0 - - form-data-encoder@2.1.4: - resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} - engines: {node: '>= 14.17'} - - form-data-encoder@4.1.0: - resolution: {integrity: sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==} - engines: {node: '>= 18'} - - form-data@4.0.4: - resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} - engines: {node: '>= 6'} - - format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} - - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - - framer-motion@6.5.1: - resolution: {integrity: sha512-o1BGqqposwi7cgDrtg0dNONhkmPsUFDaLcKXigzuTFC5x58mE8iyTazxSudFzmT6MEyJKfjjU8ItoMe3W+3fiw==} - peerDependencies: - react: '>=16.8 || ^17.0.0 || ^18.0.0' - react-dom: '>=16.8 || ^17.0.0 || ^18.0.0' - - framesync@6.0.1: - resolution: {integrity: sha512-fUY88kXvGiIItgNC7wcTOl0SNRCVXMKSWW2Yzfmn7EKNc+MpCzcz9DhdHcdjbrtN3c6R4H5dTY2jiCpPdysEjA==} - - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - - fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} - - from2@2.3.0: - resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} - - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - - fs-extra@0.30.0: - resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} - - fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - - fs-extra@11.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} - engines: {node: '>=14.14'} - - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} - - fs-extra@11.3.0: - resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} - engines: {node: '>=14.14'} - - fs-extra@3.0.1: - resolution: {integrity: sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==} - - fs-extra@4.0.3: - resolution: {integrity: sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==} - - fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - - fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - - fs-monkey@1.0.6: - resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} - - fs-write-stream-atomic@1.0.10: - resolution: {integrity: sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==} - deprecated: This package is no longer supported. - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@1.2.13: - resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} - engines: {node: '>= 4.0'} - os: [darwin] - deprecated: Upgrade to fsevents v2 to mitigate potential security issues - - fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - fstream@1.0.12: - resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} - engines: {node: '>=0.6'} - deprecated: This package is no longer supported. - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} - - functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - gauge@2.7.4: - resolution: {integrity: sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==} - deprecated: This package is no longer supported. - - gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - - gauge@4.0.4: - resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. - - gaze@1.1.3: - resolution: {integrity: sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==} - engines: {node: '>= 4.0.0'} - - generic-names@4.0.0: - resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==} - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-caller-file@1.0.3: - resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-east-asian-width@1.3.0: - resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} - engines: {node: '>=18'} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - - get-npm-tarball-url@2.1.0: - resolution: {integrity: sha512-ro+DiMu5DXgRBabqXupW38h7WPZ9+Ad8UjwhvsmmN8w1sU7ab0nzAXvVZ4kqYg57OrqomRtJvepX5/xvFKNtjA==} - engines: {node: '>=12.17'} - - get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - - get-port@5.1.1: - resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} - engines: {node: '>=8'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - get-stdin@4.0.1: - resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} - engines: {node: '>=0.10.0'} - - get-stdin@6.0.0: - resolution: {integrity: sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==} - engines: {node: '>=4'} - - get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} - - get-stream@4.1.0: - resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} - engines: {node: '>=6'} - - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - - get-stream@9.0.1: - resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} - engines: {node: '>=18'} - - get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} - - get-them-args@1.3.2: - resolution: {integrity: sha512-LRn8Jlk+DwZE4GTlDbT3Hikd1wSHgLMme/+7ddlqKd7ldwR6LjJgTVWzBnR01wnYGe4KgrXjg287RaI22UHmAw==} - - get-value@3.0.1: - resolution: {integrity: sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==} - engines: {node: '>=6.0'} - - getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} - - gh-pages@6.3.0: - resolution: {integrity: sha512-Ot5lU6jK0Eb+sszG8pciXdjMXdBJ5wODvgjR+imihTqsUWF2K6dJ9HST55lgqcs8wWcw6o6wAsUzfcYRhJPXbA==} - engines: {node: '>=10'} - hasBin: true - - giget@1.2.5: - resolution: {integrity: sha512-r1ekGw/Bgpi3HLV3h1MRBIlSAdHoIMklpaQ3OQLFcRw9PwAj2rqigvIbg+dBUI51OxVI2jsEtDywDBjSiuf7Ug==} - hasBin: true - - github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - - github-slugger@1.5.0: - resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} - - glob-parent@2.0.0: - resolution: {integrity: sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==} - - glob-parent@3.1.0: - resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob-promise@3.4.0: - resolution: {integrity: sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==} - engines: {node: '>=4'} - peerDependencies: - glob: '*' - - glob-to-regexp@0.3.0: - resolution: {integrity: sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==} - - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - - glob2base@0.0.12: - resolution: {integrity: sha512-ZyqlgowMbfj2NPjxaZZ/EtsXlOch28FRXgMd64vqZWk1bT9+wvSRLYD1om9M7QfQru51zJPAT17qXm4/zd+9QA==} - engines: {node: '>= 0.10'} - - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - - glob@11.0.3: - resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} - engines: {node: 20 || >=22} - hasBin: true - - glob@5.0.15: - resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - - global-dirs@0.1.1: - resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} - engines: {node: '>=4'} - - global-modules@1.0.0: - resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} - engines: {node: '>=0.10.0'} - - global-modules@2.0.0: - resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} - engines: {node: '>=6'} - - global-prefix@1.0.2: - resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} - engines: {node: '>=0.10.0'} - - global-prefix@3.0.0: - resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} - engines: {node: '>=6'} - - global@4.4.0: - resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} - - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - 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'} - - globals@9.18.0: - resolution: {integrity: sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==} - engines: {node: '>=0.10.0'} - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - - globalyzer@0.1.0: - resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - globby@14.1.0: - resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} - engines: {node: '>=18'} - - globby@5.0.0: - resolution: {integrity: sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==} - engines: {node: '>=0.10.0'} - - globby@9.2.0: - resolution: {integrity: sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==} - engines: {node: '>=6'} - - globjoin@0.1.4: - resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} - - globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - - globule@1.3.4: - resolution: {integrity: sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==} - engines: {node: '>= 0.10'} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - got@13.0.0: - resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} - engines: {node: '>=16'} - - got@14.4.7: - resolution: {integrity: sha512-DI8zV1231tqiGzOiOzQWDhsBmncFW7oQDH6Zgy6pDPrqJuVZMtoSgPLLsBZQj8Jg4JFfwoOsDA8NGtLQLnIx2g==} - engines: {node: '>=20'} - - got@6.7.1: - resolution: {integrity: sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==} - engines: {node: '>=4'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - graphiql-explorer@0.9.0: - resolution: {integrity: sha512-fZC/wsuatqiQDO2otchxriFO0LaWIo/ovF/CQJ1yOudmY0P7pzDiP+l9CEHUiWbizk3e99x6DQG4XG1VxA+d6A==} - peerDependencies: - graphql: ^0.6.0 || ^0.7.0 || ^0.8.0-b || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 - react: ^15.6.0 || ^16.0.0 - react-dom: ^15.6.0 || ^16.0.0 - - graphiql@3.7.0: - resolution: {integrity: sha512-M38uOeD8y0M85VnrifhpXtcgGshQG2dtQGJ6fPZB9c659sA6y2Yh9aDnE055/n2ricidwSLrKmsiDXrvDuoU1A==} - peerDependencies: - graphql: ^15.5.0 || ^16.0.0 || ^17.0.0-alpha.2 - react: ^16.8.0 || ^17 || ^18 - react-dom: ^16.8.0 || ^17 || ^18 - - graphlib@2.1.8: - resolution: {integrity: sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==} - - graphql-language-service@5.4.0: - resolution: {integrity: sha512-g4N5PKh4Dxow9zuHrzX6PHuWWL/aQPYgzZvZst1KkWYFW1H1rmOA/p0/eEJ2WVuoCCfy1tyAR91iG92MAKCILA==} - hasBin: true - peerDependencies: - graphql: ^15.5.0 || ^16.0.0 || ^17.0.0 - - graphql@16.11.0: - resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==} - engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - - growly@1.3.0: - resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} - - gunzip-maybe@1.4.2: - resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} - hasBin: true - - gzip-size@3.0.0: - resolution: {integrity: sha512-6s8trQiK+OMzSaCSVXX+iqIcLV9tC+E73jrJrJTyS4h/AJhlxHvzFKqM1YLDJWRGgHX8uLkBeXkA0njNj39L4w==} - engines: {node: '>=0.12.0'} - - handle-thing@2.0.1: - resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - - handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true - - har-schema@2.0.0: - resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} - engines: {node: '>=4'} - - har-validator@5.1.5: - resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} - engines: {node: '>=6'} - deprecated: this library is no longer supported - - hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - - harmony-reflect@1.6.2: - resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==} - - has-ansi@2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} - - has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} - - has-flag@1.0.0: - resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} - engines: {node: '>=0.10.0'} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-glob@1.0.0: - resolution: {integrity: sha512-D+8A457fBShSEI3tFCj65PAbT++5sKiFtdCdOam0gnfBgw9D277OERk+HM9qYJXmdVLZ/znez10SqHN0BBQ50g==} - engines: {node: '>=0.10.0'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - 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'} - - has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - - has@1.0.4: - resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} - engines: {node: '>= 0.4.0'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - hast-to-hyperscript@9.0.1: - resolution: {integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==} - - hast-util-from-parse5@6.0.1: - resolution: {integrity: sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==} - - hast-util-from-parse5@7.1.2: - resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} - - hast-util-from-parse5@8.0.3: - resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} - - hast-util-parse-selector@2.2.5: - resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} - - hast-util-parse-selector@3.1.1: - resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} - - hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - - hast-util-raw@6.0.1: - resolution: {integrity: sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==} - - hast-util-raw@7.2.3: - resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} - - hast-util-raw@9.1.0: - resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} - - hast-util-to-jsx-runtime@2.3.6: - resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} - - hast-util-to-parse5@6.0.0: - resolution: {integrity: sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==} - - 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-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} - - hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - - hastscript@6.0.0: - resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==} - - hastscript@7.2.0: - resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} - - hastscript@9.0.1: - resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - heap@0.2.5: - resolution: {integrity: sha512-G7HLD+WKcrOyJP5VQwYZNC3Z6FcQ7YYjEFiFoIj8PfEr73mu421o8B1N5DKUcc8K37EsJ2XXWA8DtrDz/2dReg==} - - hey-listen@1.0.8: - resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} - - highlight.js@10.7.3: - resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - - highlight.js@11.11.1: - resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} - engines: {node: '>=12.0.0'} - - highlightjs-vue@1.0.0: - resolution: {integrity: sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==} - - hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - - home-or-tmp@2.0.0: - resolution: {integrity: sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==} - engines: {node: '>=0.10.0'} - - homedir-polyfill@1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} - engines: {node: '>=0.10.0'} - - hookified@1.9.1: - resolution: {integrity: sha512-u3pxtGhKjcSXnGm1CX6aXS9xew535j3lkOCegbA6jdyh0BaAjTbXI4aslKstCr6zUNtoCxFGFKwjbSHdGrMB8g==} - - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - - hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - - hosted-git-info@7.0.2: - resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} - engines: {node: ^16.14.0 || >=18.0.0} - - hpack.js@2.1.6: - resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} - - hpagent@1.2.0: - resolution: {integrity: sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==} - engines: {node: '>=14'} - - html-comment-regex@1.1.2: - resolution: {integrity: sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==} - - html-encoding-sniffer@1.0.2: - resolution: {integrity: sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==} - - html-encoding-sniffer@3.0.0: - resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} - engines: {node: '>=12'} - - html-entities@2.6.0: - resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} - - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - - html-minifier-terser@5.1.1: - resolution: {integrity: sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==} - engines: {node: '>=6'} - hasBin: true - - html-minifier-terser@6.1.0: - resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} - engines: {node: '>=12'} - hasBin: true - - html-minifier@3.5.21: - resolution: {integrity: sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==} - engines: {node: '>=4'} - hasBin: true - - html-tags@3.3.1: - resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} - engines: {node: '>=8'} - - html-to-image@1.11.11: - resolution: {integrity: sha512-9gux8QhvjRO/erSnDPv28noDZcPZmYE7e1vFsBLKLlRlKDSqNJYebj6Qz1TGd5lsRV+X+xYyjCKjuZdABinWjA==} - - html-to-image@1.11.13: - resolution: {integrity: sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg==} - - html-url-attributes@3.0.1: - resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} - - html-void-elements@1.0.5: - resolution: {integrity: sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==} - - html-void-elements@2.0.1: - resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} - - html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - - html-webpack-plugin@2.29.0: - resolution: {integrity: sha512-XgOxN8H7nDeLQzD9FQOWWQLVL0GDq5reeREx8jpLZcEZND7kM5j3o/mFhjOcSfZ89HwU3+yBqSQyK7ZvvYFZ/w==} - deprecated: out of support - peerDependencies: - webpack: ^5.94.0 - - html-webpack-plugin@4.5.2: - resolution: {integrity: sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==} - engines: {node: '>=6.9'} - peerDependencies: - webpack: ^5.94.0 - - html-webpack-plugin@5.6.3: - resolution: {integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==} - engines: {node: '>=10.13.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - webpack: ^5.94.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true - - htmlparser2@10.0.0: - resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} - - htmlparser2@6.1.0: - resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} - - http-cache-semantics@4.2.0: - resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} - - http-deceiver@1.2.7: - resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - - http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} - - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - - http-parser-js@0.5.10: - resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} - - http-proxy-agent@4.0.1: - resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} - engines: {node: '>= 6'} - - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - - http-proxy-middleware@2.0.9: - resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/express': ^4.17.13 - peerDependenciesMeta: - '@types/express': - optional: true - - http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} - - http-server@14.1.1: - resolution: {integrity: sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==} - engines: {node: '>=12'} - hasBin: true - - http-signature@1.2.0: - resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} - engines: {node: '>=0.8', npm: '>=1.3.7'} - - http2-wrapper@2.2.1: - resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} - engines: {node: '>=10.19.0'} - - https-proxy-agent@4.0.0: - resolution: {integrity: sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==} - engines: {node: '>= 6.0.0'} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - - human-signals@1.1.1: - resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} - engines: {node: '>=8.12.0'} - - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - - humanize-duration@3.33.0: - resolution: {integrity: sha512-vYJX7BSzn7EQ4SaP2lPYVy+icHDppB6k7myNeI3wrSRfwMS5+BHyGgzpHR0ptqJ2AQ6UuIKrclSg5ve6Ci4IAQ==} - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - husky@9.1.7: - resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} - engines: {node: '>=18'} - hasBin: true - - hyperdyperid@1.2.0: - resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} - engines: {node: '>=10.18'} - - icon-font-generator@2.1.11: - resolution: {integrity: sha512-nCIPePQlnj2w2ptcZ6C+OMK0G4FMs6dgxT6g2LuFq2n2v2svNFDjKytB0LIX+chlTEgt5wDccnZEPmOk3cp1Kg==} - engines: {node: '>=v8.1.0'} - hasBin: true - - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - - icss-replace-symbols@1.1.0: - resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} - - icss-utils@2.1.0: - resolution: {integrity: sha512-bsVoyn/1V4R1kYYjLcWLedozAM4FClZUdjE9nIr8uWY7xs78y9DATgwz2wGU7M+7z55KenmmTkN2DVJ7bqzjAA==} - - icss-utils@4.1.1: - resolution: {integrity: sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==} - engines: {node: '>= 6'} - - icss-utils@5.1.0: - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - identity-obj-proxy@3.0.0: - resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} - engines: {node: '>=4'} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - iferr@0.1.5: - resolution: {integrity: sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==} - - ignore@4.0.6: - resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} - engines: {node: '>= 4'} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} - - immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - - immer@9.0.21: - resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} - - immutable@3.8.2: - resolution: {integrity: sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==} - engines: {node: '>=0.10.0'} - - immutable@5.1.3: - resolution: {integrity: sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==} - - import-cwd@3.0.0: - resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} - engines: {node: '>=8'} - - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - - import-from@3.0.0: - resolution: {integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==} - engines: {node: '>=8'} - - import-lazy@2.1.0: - resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} - engines: {node: '>=4'} - - import-local@3.2.0: - resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} - engines: {node: '>=8'} - hasBin: true - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - indent-string@2.1.0: - resolution: {integrity: sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==} - engines: {node: '>=0.10.0'} - - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - - indent-string@5.0.0: - resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} - engines: {node: '>=12'} - - indexes-of@1.0.1: - resolution: {integrity: sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==} - - infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - - inline-style-parser@0.2.4: - resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} - - 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'} - - interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - - interpret@2.2.0: - resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} - engines: {node: '>= 0.10'} - - interpret@3.1.1: - resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} - engines: {node: '>=10.13.0'} - - intl-messageformat@10.7.16: - resolution: {integrity: sha512-UmdmHUmp5CIKKjSoE10la5yfU+AYJAaiYLsodbjL4lji83JNvgOQUjGaGhGrpFCb0Uh7sl7qfP1IyILa8Z40ug==} - - invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - - invert-kv@1.0.0: - resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} - engines: {node: '>=0.10.0'} - - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} - - ip-regex@2.1.0: - resolution: {integrity: sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==} - engines: {node: '>=4'} - - ip-regex@4.3.0: - resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} - engines: {node: '>=8'} - - ip@2.0.1: - resolution: {integrity: sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==} - - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - - ipaddr.js@2.2.0: - resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} - engines: {node: '>= 10'} - - is-absolute-url@2.1.0: - resolution: {integrity: sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==} - engines: {node: '>=0.10.0'} - - is-absolute-url@3.0.3: - resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} - engines: {node: '>=8'} - - is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - - is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - - is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - - is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - - is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} - - is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - - is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} - - is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} - - is-binary-path@1.0.1: - resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} - engines: {node: '>=0.10.0'} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} - - is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - - is-builtin-module@1.0.0: - resolution: {integrity: sha512-C2wz7Juo5pUZTFQVer9c+9b4qw3I5T/CHQxQyhVu7BJel6C22FmsLIWsdseYyOw6xz9Pqy9eJWSkQ7+3iN1HVw==} - engines: {node: '>=0.10.0'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-ci@1.2.1: - resolution: {integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==} - hasBin: true - - is-ci@2.0.0: - resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} - hasBin: true - - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - - is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} - - is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} - - is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - - is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - - is-deflate@1.0.0: - resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} - - is-directory@0.3.1: - resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} - engines: {node: '>=0.10.0'} - - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - - is-dom@1.1.0: - resolution: {integrity: sha512-u82f6mvhYxRPKpw8V1N0W8ce1xXwOrQtgGcxl6UCL5zBmZu3is/18K0rR7uFCnMDuAsS/3W54mGL4vsaFUQlEQ==} - - is-extendable@1.0.1: - resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} - engines: {node: '>=0.10.0'} - - is-extglob@1.0.0: - resolution: {integrity: sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==} - engines: {node: '>=0.10.0'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} - - is-finite@1.1.0: - resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@1.0.0: - resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - - is-fullwidth-code-point@5.0.0: - resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} - engines: {node: '>=18'} - - is-function@1.0.2: - resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} - - is-generator-fn@1.0.0: - resolution: {integrity: sha512-95jJZX6O/gdekidH2usRBr9WdRw4LU56CttPstXFxvG0r3QUE9eaIdz2p2Y7zrm6jxz7SjByAo1AtzwGlRvfOg==} - engines: {node: '>=0.10.0'} - - is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} - engines: {node: '>= 0.4'} - - is-glob@2.0.1: - resolution: {integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==} - engines: {node: '>=0.10.0'} - - is-glob@3.1.0: - resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} - engines: {node: '>=0.10.0'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-gzip@1.0.0: - resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} - engines: {node: '>=0.10.0'} - - is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - - is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - - is-installed-globally@0.1.0: - resolution: {integrity: sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==} - engines: {node: '>=4'} - - is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - - is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} - - is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-module@1.0.0: - resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-network-error@1.1.0: - resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} - engines: {node: '>=16'} - - is-npm@1.0.0: - resolution: {integrity: sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==} - engines: {node: '>=0.10.0'} - - is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-obj@1.0.1: - resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} - engines: {node: '>=0.10.0'} - - is-object@1.0.2: - resolution: {integrity: sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==} - - is-path-cwd@1.0.0: - resolution: {integrity: sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==} - engines: {node: '>=0.10.0'} - - is-path-cwd@2.2.0: - resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} - engines: {node: '>=6'} - - is-path-cwd@3.0.0: - resolution: {integrity: sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - is-path-in-cwd@1.0.1: - resolution: {integrity: sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==} - engines: {node: '>=0.10.0'} - - is-path-inside@1.0.1: - resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==} - engines: {node: '>=0.10.0'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-path-inside@4.0.0: - resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} - engines: {node: '>=12'} - - is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - - is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - - is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - - is-primitive@3.0.1: - 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==} - - is-redirect@1.0.0: - resolution: {integrity: sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==} - engines: {node: '>=0.10.0'} - - is-reference@1.2.1: - resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - - is-retry-allowed@1.2.0: - resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} - engines: {node: '>=0.10.0'} - - is-root@1.0.0: - resolution: {integrity: sha512-1d50EJ7ipFxb9bIx213o6KPaJmHN8f+nR48UZWxWVzDx+NA3kpscxi02oQX3rGkEaLBi9m3ZayHngQc3+bBX9w==} - engines: {node: '>=0.10.0'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} - - is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - is-stream@4.0.1: - resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} - engines: {node: '>=18'} - - is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} - - is-svg@2.1.0: - resolution: {integrity: sha512-Ya1giYJUkcL/94quj0+XGcmts6cETPBW1MiFz1ReJrnDJ680F52qpAEGAEGU0nq96FRGIGPx6Yo1CyPXcOoyGw==} - engines: {node: '>=0.10.0'} - - is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - - is-unicode-supported@2.1.0: - resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} - engines: {node: '>=18'} - - is-url@1.2.4: - resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} - - is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} - - is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} - - is-whitespace-character@1.0.4: - resolution: {integrity: sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==} - - is-window@1.0.2: - resolution: {integrity: sha512-uj00kdXyZb9t9RcAUAwMZAnkBUwdYGhYlt7djMXhfyhUCzwNba50tIiBKR7q0l7tdoBtFVw/3JmLY6fI3rmZmg==} - - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - - is-word-character@1.0.4: - resolution: {integrity: sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==} - - is-wsl@1.1.0: - resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} - engines: {node: '>=4'} - - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - - is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} - - is2@2.0.9: - resolution: {integrity: sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==} - engines: {node: '>=v0.10.0'} - - is64bit@2.0.0: - resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} - engines: {node: '>=18'} - - isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} - engines: {node: '>=16'} - - isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - - isobject@4.0.0: - resolution: {integrity: sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==} - engines: {node: '>=0.10.0'} - - isomorphic-unfetch@3.1.0: - resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} - - isomorphic-ws@5.0.0: - resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} - peerDependencies: - ws: '*' - - isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - - istanbul-api@1.3.7: - resolution: {integrity: sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==} - - istanbul-lib-coverage@1.2.1: - resolution: {integrity: sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==} - - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - istanbul-lib-hook@1.2.2: - resolution: {integrity: sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==} - - istanbul-lib-instrument@1.10.2: - resolution: {integrity: sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==} - - istanbul-lib-instrument@4.0.3: - resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} - engines: {node: '>=8'} - - istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - - istanbul-lib-instrument@6.0.3: - resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} - engines: {node: '>=10'} - - istanbul-lib-report@1.1.5: - resolution: {integrity: sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==} - - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - - istanbul-lib-source-maps@1.2.6: - resolution: {integrity: sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==} - - istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - - istanbul-reports@1.5.1: - resolution: {integrity: sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==} - - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} - - istanbul@0.4.5: - resolution: {integrity: sha512-nMtdn4hvK0HjUlzr1DrKSUY8ychprt8dzHOgY2KXsIhHu5PuQQEOTM27gV9Xblyon7aUH/TSFIjRHEODF/FRPg==} - deprecated: |- - This module is no longer maintained, try this instead: - npm i nyc - Visit https://istanbul.js.org/integrations for other alternatives. - hasBin: true - - istextorbinary@9.5.0: - resolution: {integrity: sha512-5mbUj3SiZXCuRf9fT3ibzbSSEWiy63gFfksmGfdOzujPjW3k+z8WvIBxcJHBoQNlaZaiyB25deviif2+osLmLw==} - engines: {node: '>=4'} - - iterate-iterator@1.0.2: - resolution: {integrity: sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==} - - iterate-value@1.0.2: - resolution: {integrity: sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==} - - iterator.prototype@1.1.5: - resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} - engines: {node: '>= 0.4'} - - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - jackspeak@4.1.1: - resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} - engines: {node: 20 || >=22} - - jake@10.9.2: - resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} - engines: {node: '>=10'} - hasBin: true - - jest-changed-files@20.0.3: - resolution: {integrity: sha512-3o76mBdqPXN5zrak+U9ldALWgYlQQgKh8vQL3nsQO/seybjPqsp2Qp0pGGvVeMOaiwCbOZCrOvb3D8QhG/9Ccw==} - - jest-changed-files@25.5.0: - resolution: {integrity: sha512-EOw9QEqapsDT7mKF162m8HFzRPbmP8qJQny6ldVOdOVBz3ACgPm/1nAn5fPQ/NDaYhX/AHkrGwwkCncpAVSXcw==} - engines: {node: '>= 8.3'} - - jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-cli@20.0.4: - resolution: {integrity: sha512-OfQTkV6T5+V+c3hbzGVJl1SqTOmIw7dBIZYl6XDdSNOmhoyCmwNh/dsEs0lgqIMZkF+AeLbRswkH91XBVXyKqg==} - engines: {node: '>= 4'} - hasBin: true - - jest-cli@25.5.4: - resolution: {integrity: sha512-rG8uJkIiOUpnREh1768/N3n27Cm+xPFkSNFO91tgg+8o2rXeVLStz+vkXkGr4UtzH6t1SNbjwoiswd7p4AhHTw==} - engines: {node: '>= 8.3'} - hasBin: true - - jest-cli@29.7.0: - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - jest-config@20.0.4: - resolution: {integrity: sha512-9urceXnsfO+DXNGrzeDFKx/IAFpUljbvaiPZEn1sWuF97QN0Ppt7yXmnPoAOylwxpNK1t9lWUER5eeoH63rPCA==} - - jest-config@22.4.4: - resolution: {integrity: sha512-9CKfo1GC4zrXSoMLcNeDvQBfgtqGTB1uP8iDIZ97oB26RCUb886KkKWhVcpyxVDOUxbhN+uzcBCeFe7w+Iem4A==} - - jest-config@25.5.4: - resolution: {integrity: sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg==} - engines: {node: '>= 8.3'} - - jest-config@29.7.0: - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - - jest-diff@20.0.3: - resolution: {integrity: sha512-DITOXlTg0HDL9QKiVpf82vDu/nva60/V9xp056zjnAYpHVTZlJgfLMIHJmgPCoSu0+7n7QUAfxyFUHUGyHLFSw==} - - jest-diff@22.4.3: - resolution: {integrity: sha512-/QqGvCDP5oZOF6PebDuLwrB2BMD8ffJv6TAGAdEVuDx1+uEgrHpSFrfrOiMRx2eJ1hgNjlQrOQEHetVwij90KA==} - - jest-diff@25.5.0: - resolution: {integrity: sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==} - engines: {node: '>= 8.3'} - - jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-docblock@20.0.3: - resolution: {integrity: sha512-lHwefzd+CB38Awy4yiWb8he+ovUXjNeuN4tNQ1sa6/vBh6P7XwpiuSDIs4GH6/yE1uDBUaYiaf/msD7cWMTL7g==} - - jest-docblock@25.3.0: - resolution: {integrity: sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg==} - engines: {node: '>= 8.3'} - - jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-each@25.5.0: - resolution: {integrity: sha512-QBogUxna3D8vtiItvn54xXde7+vuzqRrEeaw8r1s+1TG9eZLVJE5ZkKoSUlqFwRjnlaA4hyKGiu9OlkFIuKnjA==} - engines: {node: '>= 8.3'} - - jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-environment-jsdom@20.0.3: - resolution: {integrity: sha512-SSm2oCtH0kBYdXhEMzZDFM4GU/auz4x7yv8AGduAZSZP5loKYHLNoKfVlyN1iFQ+vCJ+1QSS+sVnUARSwaBqbw==} - - jest-environment-jsdom@22.4.3: - resolution: {integrity: sha512-FviwfR+VyT3Datf13+ULjIMO5CSeajlayhhYQwpzgunswoaLIPutdbrnfUHEMyJCwvqQFaVtTmn9+Y8WCt6n1w==} - - jest-environment-jsdom@25.5.0: - resolution: {integrity: sha512-7Jr02ydaq4jaWMZLY+Skn8wL5nVIYpWvmeatOHL3tOcV3Zw8sjnPpx+ZdeBfc457p8jCR9J6YCc+Lga0oIy62A==} - engines: {node: '>= 8.3'} - - jest-environment-jsdom@29.7.0: - resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - - jest-environment-node@20.0.3: - resolution: {integrity: sha512-kVwkLhrGd1toaMHHtVIM2qleNTBDrFUZ6Qjv0GEfd75DK2P0H24xVVMA83H0PEkNbGl2EbjF/CeAIJSN3LagBw==} - - jest-environment-node@22.4.3: - resolution: {integrity: sha512-reZl8XF6t/lMEuPWwo9OLfttyC26A5AMgDyEQ6DBgZuyfyeNUzYT8BFo6uxCCP/Av/b7eb9fTi3sIHFPBzmlRA==} - - jest-environment-node@25.5.0: - resolution: {integrity: sha512-iuxK6rQR2En9EID+2k+IBs5fCFd919gVVK5BeND82fYeLWPqvRcFNPKu9+gxTwfB5XwBGBvZ0HFQa+cHtIoslA==} - engines: {node: '>= 8.3'} - - jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-get-type@22.4.3: - resolution: {integrity: sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==} - - jest-get-type@25.2.6: - resolution: {integrity: sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==} - engines: {node: '>= 8.3'} - - jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-haste-map@20.0.5: - resolution: {integrity: sha512-0IKAQjUvuZjMCNi/0VNQQF74/H9KB67hsHJqGiwTWQC6XO5Azs7kLWm+6Q/dwuhvDUvABDOBMFK2/FwZ3sZ07Q==} - - jest-haste-map@25.5.1: - resolution: {integrity: sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==} - engines: {node: '>= 8.3'} - - jest-haste-map@26.6.2: - resolution: {integrity: sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==} - engines: {node: '>= 10.14.2'} - - jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-jasmine2@20.0.4: - resolution: {integrity: sha512-XNHvFt9iljOaSSZU5t5dC9kJtrcM+KnVbw0Qa/BpGZlrorqS+m0iWiAJO2xXcGMimCmhT4NLZAS1v/JBGWR8Cg==} - - jest-jasmine2@22.4.4: - resolution: {integrity: sha512-nK3vdUl50MuH7vj/8at7EQVjPGWCi3d5+6aCi7Gxy/XMWdOdbH1qtO/LjKbqD8+8dUAEH+BVVh7HkjpCWC1CSw==} - - jest-jasmine2@25.5.4: - resolution: {integrity: sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ==} - engines: {node: '>= 8.3'} - - jest-leak-detector@25.5.0: - resolution: {integrity: sha512-rV7JdLsanS8OkdDpZtgBf61L5xZ4NnYLBq72r6ldxahJWWczZjXawRsoHyXzibM5ed7C2QRjpp6ypgwGdKyoVA==} - engines: {node: '>= 8.3'} - - jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-matcher-utils@20.0.3: - resolution: {integrity: sha512-eSNh2n3aXULZUbherq5+lZVdpUau8sniowi1tcc1ZueBk/97avAwwoDwBVvxI9JINVrPTsCI51SiQtrjBkVvPw==} - - jest-matcher-utils@22.4.3: - resolution: {integrity: sha512-lsEHVaTnKzdAPR5t4B6OcxXo9Vy4K+kRRbG5gtddY8lBEC+Mlpvm1CJcsMESRjzUhzkz568exMV1hTB76nAKbA==} - - jest-matcher-utils@25.5.0: - resolution: {integrity: sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==} - engines: {node: '>= 8.3'} - - jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-matchers@20.0.3: - resolution: {integrity: sha512-aDlp50L8qPJ+Y+tifrlKewT0ZU1uC9OP7GJ5T0UKSw/wB73wf6jKEAZUqyA67BocW8BZD7qVVWHasm7u2D1CMQ==} - - jest-message-util@20.0.3: - resolution: {integrity: sha512-p4UQLFjZmXw9Optr6c0aAIDN622+tdVW9XjaCODww/Y8MRGo1S60CICl0Jb4XdJWmMkmD07osWc6aElLxo0mDg==} - - jest-message-util@22.4.3: - resolution: {integrity: sha512-iAMeKxhB3Se5xkSjU0NndLLCHtP4n+GtCqV0bISKA5dmOXQfEbdEmYiu2qpnWBDCQdEafNDDU6Q+l6oBMd/+BA==} - - jest-message-util@25.5.0: - resolution: {integrity: sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==} - engines: {node: '>= 8.3'} - - jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-mock@20.0.3: - resolution: {integrity: sha512-Edmuskld6ImmUuqxhbwwX5fDXQlFC/fe3XcZKVwK9SnbetIFyivTaub71ZbL5uuWdkvr4VggcyxlhdnpsIlRvg==} - - jest-mock@22.4.3: - resolution: {integrity: sha512-+4R6mH5M1G4NK16CKg9N1DtCaFmuxhcIqF4lQK/Q1CIotqMs/XBemfpDPeVZBFow6iyUNu6EBT9ugdNOTT5o5Q==} - - jest-mock@25.5.0: - resolution: {integrity: sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA==} - engines: {node: '>= 8.3'} - - jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-pnp-resolver@1.2.3: - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - - jest-regex-util@20.0.3: - resolution: {integrity: sha512-WVFSnROOYgYA+AyTytpZA93EEv16DfPkkR8V8okVQjirXLfRs9n451BPgiiUJSHIyJv+OQ4El0+q16hyY1dEdA==} - - jest-regex-util@22.4.3: - resolution: {integrity: sha512-LFg1gWr3QinIjb8j833bq7jtQopiwdAs67OGfkPrvy7uNUbVMfTXXcOKXJaeY5GgjobELkKvKENqq1xrUectWg==} - - jest-regex-util@25.2.6: - resolution: {integrity: sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==} - engines: {node: '>= 8.3'} - - jest-regex-util@26.0.0: - resolution: {integrity: sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==} - engines: {node: '>= 10.14.2'} - - jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-resolve-dependencies@20.0.3: - resolution: {integrity: sha512-k0DK242umC88ih4KKH1jVlXBulQJfOmMXV/nMMfqRgeFKbBYfUROLZkz0zr8TON5WfnuiHV5GotqE0pXoqg08A==} - - jest-resolve-dependencies@25.5.4: - resolution: {integrity: sha512-yFmbPd+DAQjJQg88HveObcGBA32nqNZ02fjYmtL16t1xw9bAttSn5UGRRhzMHIQbsep7znWvAvnD4kDqOFM0Uw==} - engines: {node: '>= 8.3'} - - jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-resolve@20.0.4: - resolution: {integrity: sha512-n/u93CugulXmQ8FcHHGv1kUEFagsbXsJgKLK2G4eAdmawHObAc6DgJtOVp9hgNJOGRU6c6ozdB5nzMO02Fecig==} - - jest-resolve@22.4.3: - resolution: {integrity: sha512-u3BkD/MQBmwrOJDzDIaxpyqTxYH+XqAXzVJP51gt29H8jpj3QgKof5GGO2uPGKGeA1yTMlpbMs1gIQ6U4vcRhw==} - - jest-resolve@25.5.1: - resolution: {integrity: sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ==} - engines: {node: '>= 8.3'} - - jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-runner@25.5.4: - resolution: {integrity: sha512-V/2R7fKZo6blP8E9BL9vJ8aTU4TH2beuqGNxHbxi6t14XzTb+x90B3FRgdvuHm41GY8ch4xxvf0ATH4hdpjTqg==} - engines: {node: '>= 8.3'} - - jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-runtime@20.0.4: - resolution: {integrity: sha512-NTGhGRKhfM19w0egxges3hhIO8gPXB2H6Txaie3+AZIHF+VZCItH27uEFzU6cQTdwzcWaiieYgCAfGKNeUUf7g==} - hasBin: true - - jest-runtime@25.5.4: - resolution: {integrity: sha512-RWTt8LeWh3GvjYtASH2eezkc8AehVoWKK20udV6n3/gC87wlTbE1kIA+opCvNWyyPeBs6ptYsc6nyHUb1GlUVQ==} - engines: {node: '>= 8.3'} - hasBin: true - - jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-serializer@25.5.0: - resolution: {integrity: sha512-LxD8fY1lByomEPflwur9o4e2a5twSQ7TaVNLlFUuToIdoJuBt8tzHfCsZ42Ok6LkKXWzFWf3AGmheuLAA7LcCA==} - engines: {node: '>= 8.3'} - - jest-serializer@26.6.2: - resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} - engines: {node: '>= 10.14.2'} - - jest-snapshot@20.0.3: - resolution: {integrity: sha512-oapnAnOloz9Lv2r44TtiAQiPT2f6NdLFvK6mW3hnGStfDjstnbHAxG0f/tUhXr81BcmZvz03hsMMInKi9bHG0Q==} - - jest-snapshot@22.4.3: - resolution: {integrity: sha512-JXA0gVs5YL0HtLDCGa9YxcmmV2LZbwJ+0MfyXBBc5qpgkEYITQFJP7XNhcHFbUvRiniRpRbGVfJrOoYhhGE0RQ==} - - jest-snapshot@25.5.1: - resolution: {integrity: sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ==} - engines: {node: '>= 8.3'} - - jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-util@20.0.3: - resolution: {integrity: sha512-Ig/4sAywd/7YJe3jUOIyj+NaX7NCQnxMc/lfRezvbkceZDye0mch126UfIzqyBdS2gjxQl7S8yERvcZDMvK1NA==} - - jest-util@22.4.3: - resolution: {integrity: sha512-rfDfG8wyC5pDPNdcnAlZgwKnzHvZDu8Td2NJI/jAGKEGxJPYiE4F0ss/gSAkG4778Y23Hvbz+0GMrDJTeo7RjQ==} - - jest-util@25.5.0: - resolution: {integrity: sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==} - engines: {node: '>= 8.3'} - - jest-util@26.6.2: - resolution: {integrity: sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==} - engines: {node: '>= 10.14.2'} - - jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-validate@20.0.3: - resolution: {integrity: sha512-yIpGo3le6q+ZPID2UCl58FRM4ZVGZK9qu1RaWSbEnZFUcj08XznJWd6g2HbPqsWCY9abBO3hq2aP5GZveEfGUg==} - - jest-validate@22.4.4: - resolution: {integrity: sha512-dmlf4CIZRGvkaVg3fa0uetepcua44DHtktHm6rcoNVtYlpwe6fEJRkMFsaUVcFHLzbuBJ2cPw9Gl9TKfnzMVwg==} - - jest-validate@25.5.0: - resolution: {integrity: sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ==} - engines: {node: '>= 8.3'} - - jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-watch-typeahead@0.5.0: - resolution: {integrity: sha512-4r36w9vU8+rdg48hj0Z7TvcSqVP6Ao8dk04grlHQNgduyCB0SqrI0xWIl85ZhXrzYvxQ0N5H+rRLAejkQzEHeQ==} - - jest-watcher@25.5.0: - resolution: {integrity: sha512-XrSfJnVASEl+5+bb51V0Q7WQx65dTSk7NL4yDdVjPnRNpM0hG+ncFmDYJo9O8jaSRcAitVbuVawyXCRoxGrT5Q==} - engines: {node: '>= 8.3'} - - jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-worker@24.9.0: - resolution: {integrity: sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==} - engines: {node: '>= 6'} - - jest-worker@25.5.0: - resolution: {integrity: sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==} - engines: {node: '>= 8.3'} - - jest-worker@26.6.2: - resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} - engines: {node: '>= 10.13.0'} - - jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - - jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest@20.0.4: - resolution: {integrity: sha512-MU1kGBtzhDHwasL1BbuFmlIlwseDXy18p/M3hB7ehifac8FCbj6nJf8ihGtBA594tlUcktotHHd8z42V47ZB1g==} - engines: {node: '>= 4'} - hasBin: true - - jest@25.5.4: - resolution: {integrity: sha512-hHFJROBTqZahnO+X+PMtT6G2/ztqAZJveGqz//FnWWHurizkD05PQGzRZOhF3XP6z7SJmL+5tCfW8qV06JypwQ==} - engines: {node: '>= 8.3'} - hasBin: true - - jest@29.7.0: - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - jiti@1.21.7: - resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} - hasBin: true - - jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} - hasBin: true - - joi@17.13.3: - resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} - - jpjs@1.2.1: - resolution: {integrity: sha512-GxJWybWU4NV0RNKi6EIqk6IRPOTqd/h+U7sbtyuD7yUISUzV78LdHnq2xkevJsTlz/EImux4sWj+wfMiwKLkiw==} - - js-base64@2.6.4: - resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} - - js-file-download@0.4.12: - resolution: {integrity: sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg==} - - js-string-escape@1.0.1: - resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} - engines: {node: '>= 0.8'} - - js-tokens@3.0.2: - resolution: {integrity: sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - - js-yaml@3.7.0: - resolution: {integrity: sha512-eIlkGty7HGmntbV6P/ZlAsoncFLGsNoM27lkTzS+oneY/EiNhj+geqD9ezg/ip+SW6Var0BJU2JtV0vEUZpWVQ==} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - - jschardet@3.1.4: - resolution: {integrity: sha512-/kmVISmrwVwtyYU40iQUOp3SUPk2dhNCMsZBQX0R1/jZ8maaXJ/oZIzUOiyOqcgtLnETFKYChbJ5iDC/eWmFHg==} - engines: {node: '>=0.1.90'} - - jscodeshift@0.15.2: - resolution: {integrity: sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==} - hasBin: true - peerDependencies: - '@babel/preset-env': ^7.1.6 - peerDependenciesMeta: - '@babel/preset-env': - optional: true - - jsdoc-type-pratt-parser@4.1.0: - resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} - engines: {node: '>=12.0.0'} - - jsdom@11.12.0: - resolution: {integrity: sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==} - - jsdom@15.2.1: - resolution: {integrity: sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==} - engines: {node: '>=8'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - - jsdom@20.0.3: - resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} - engines: {node: '>=14'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - - jsdom@9.12.0: - resolution: {integrity: sha512-Qw4oqNxo4LyzkSqVIyCnEltTc4xV3g1GBaI88AvYTesWzmWHUSoMNmhBjUBa+6ldXIBJS9xoeLNJPfUAykTyxw==} - - jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - - jsesc@1.3.0: - resolution: {integrity: sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==} - hasBin: true - - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-parse-even-better-errors@3.0.2: - resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - json-schema-to-ts@3.1.1: - resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} - engines: {node: '>=16'} - - json-schema-traverse@0.3.1: - resolution: {integrity: sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json-stable-stringify@1.3.0: - resolution: {integrity: sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==} - engines: {node: '>= 0.4'} - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json3@3.3.3: - resolution: {integrity: sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==} - - json5@0.5.1: - resolution: {integrity: sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==} - hasBin: true - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsonc-parser@3.3.1: - resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - - jsonfile@2.4.0: - resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} - - jsonfile@3.0.1: - resolution: {integrity: sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==} - - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - - jsonify@0.0.1: - resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} - - jsonix@3.0.0: - resolution: {integrity: sha512-3I3CwAR5YRLGEApVjTYIDVzjryfvQq1sdEu8FLLCirGYBA9j0qDhIFHjtxEEyV0UApRgdAG8l4Za0VllZENHyA==} - engines: {'0': node >= 0.8.0} - - jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} - engines: {node: '>=12', npm: '>=6'} - - jsprim@1.4.2: - resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} - engines: {node: '>=0.6.0'} - - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - - jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} - - junk@3.1.0: - resolution: {integrity: sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==} - engines: {node: '>=8'} - - jwa@1.4.2: - resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} - - jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} - - jwt-decode@4.0.0: - resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} - engines: {node: '>=18'} - - keytar@7.9.0: - resolution: {integrity: sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - keyv@5.3.4: - resolution: {integrity: sha512-ypEvQvInNpUe+u+w8BIcPkQvEqXquyyibWE/1NB5T2BTzIpS5cGEV1LZskDzPSTvNAaT4+5FutvzlvnkxOSKlw==} - - kill-port@2.0.1: - resolution: {integrity: sha512-e0SVOV5jFo0mx8r7bS29maVWp17qGqLBZ5ricNSajON6//kmb7qqqNnml4twNE8Dtj97UQD+gNFOaipS/q1zzQ==} - hasBin: true - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - klaw@1.3.1: - resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} - - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - - klona@2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} - - known-css-properties@0.37.0: - resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} - - kuler@2.0.0: - resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} - - language-subtag-registry@0.3.23: - resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} - - language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} - - latest-version@3.1.0: - resolution: {integrity: sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==} - engines: {node: '>=4'} - - launch-editor@2.10.0: - resolution: {integrity: sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==} - - lazy-universal-dotenv@3.0.1: - resolution: {integrity: sha512-prXSYk799h3GY3iOWnC6ZigYzMPjxN2svgjJ9shk7oMadSNX3wXy0B6F32PMJv7qtMnrIbUxoEHzbutvxR2LBQ==} - engines: {node: '>=6.0.0', npm: '>=6.0.0', yarn: '>=1.0.0'} - - lazy-universal-dotenv@4.0.0: - resolution: {integrity: sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==} - engines: {node: '>=14.0.0'} - - lcid@1.0.0: - resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} - engines: {node: '>=0.10.0'} - - left-pad@1.3.0: - resolution: {integrity: sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==} - deprecated: use String.prototype.padStart() - - leven@2.1.0: - resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==} - engines: {node: '>=0.10.0'} - - leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - - levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - - lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - lines-and-columns@2.0.4: - resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - linkify-it@3.0.3: - resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} - - linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - - lint-staged@16.1.2: - resolution: {integrity: sha512-sQKw2Si2g9KUZNY3XNvRuDq4UJqpHwF0/FQzZR2M7I5MvtpWvibikCjUVJzZdGE0ByurEl3KQNvsGetd1ty1/Q==} - engines: {node: '>=20.17'} - hasBin: true - - listenercount@1.0.1: - resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} - - listr2@8.3.3: - resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} - engines: {node: '>=18.0.0'} - - load-json-file@1.1.0: - resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} - engines: {node: '>=0.10.0'} - - loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - - loader-utils@0.2.17: - resolution: {integrity: sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==} - - loader-utils@1.4.2: - resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==} - engines: {node: '>=4.0.0'} - - loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} - - loader-utils@3.3.1: - resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} - engines: {node: '>= 12.13.0'} - - locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} - - locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} - - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - lodash._reinterpolate@3.0.0: - resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} - - lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - - lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - - lodash.curry@4.1.1: - resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} - - lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - - lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - - lodash.endswith@4.2.1: - resolution: {integrity: sha512-pegckn1D2ohyUKt7OHrp7GpJVNnndjE+FpzULQ0pjQvbjdktdWGmKVth5wdSYWHzQSZA7OSGbIo0/AuwTeX1pA==} - - lodash.flow@3.5.0: - resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} - - lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - - lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - - lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. - - lodash.isfunction@3.0.9: - resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} - - lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - - lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - - lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - - lodash.keys@4.2.0: - resolution: {integrity: sha512-J79MkJcp7Df5mizHiVNpjoHXLi4HLjh9VLS/M7lQSGoQ+0oQ+lWEigREkqKyizPB1IawvQLLKY8mzEcm1tkyxQ==} - - lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - lodash.omit@4.5.0: - resolution: {integrity: sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==} - deprecated: This package is deprecated. Use destructuring assignment syntax instead. - - lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - - lodash.startswith@4.2.1: - resolution: {integrity: sha512-XClYR1h4/fJ7H+mmCKppbiBmljN/nGs73iq2SjCT9SF4CBPoUHzLvWmH1GtZMhMBZSiRkHXfeA2RY1eIlJ75ww==} - - lodash.template@4.5.0: - resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==} - deprecated: This package is deprecated. Use https://socket.dev/npm/package/eta instead. - - lodash.templatesettings@4.2.0: - resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} - - lodash.truncate@4.4.2: - resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} - - lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - - lodash.without@4.4.0: - resolution: {integrity: sha512-M3MefBwfDhgKgINVuBJCO1YR3+gf6s9HNJsIiZ/Ru77Ws6uTb9eBuvrkpzO+9iLoAaRodGuq7tyrPCx+74QYGQ==} - - lodash.xor@4.5.0: - resolution: {integrity: sha512-sVN2zimthq7aZ5sPGXnSz32rZPuqcparVW50chJQe+mzTYV+IsxSsl/2gnkWWE2Of7K3myBQBqtLKOUEHJKRsQ==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - log-symbols@3.0.0: - resolution: {integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==} - engines: {node: '>=8'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} - engines: {node: '>=18'} - - log-update@2.3.0: - resolution: {integrity: sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==} - engines: {node: '>=4'} - - log-update@6.1.0: - resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} - engines: {node: '>=18'} - - logform@2.7.0: - resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} - engines: {node: '>= 12.0.0'} - - loglevel@1.9.2: - resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} - engines: {node: '>= 0.6.0'} - - lolex@5.1.2: - resolution: {integrity: sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==} - - long-timeout@0.1.1: - resolution: {integrity: sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==} - - longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - - lottie-web@5.13.0: - resolution: {integrity: sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==} - - loud-rejection@1.6.0: - resolution: {integrity: sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==} - engines: {node: '>=0.10.0'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - loupe@3.1.4: - resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} - - lower-case@1.1.4: - resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} - - lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - - lowercase-keys@1.0.1: - resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} - engines: {node: '>=0.10.0'} - - lowercase-keys@3.0.0: - resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - lowlight@1.20.0: - resolution: {integrity: sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lru-cache@11.1.0: - resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} - engines: {node: 20 || >=22} - - lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - - lru-queue@0.1.0: - resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} - - luxon@3.6.1: - resolution: {integrity: sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==} - engines: {node: '>=12'} - - lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - - magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - - make-dir@1.3.0: - resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} - engines: {node: '>=4'} - - make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - - make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - make-fetch-happen@10.2.1: - resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - make-fetch-happen@9.1.0: - resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} - engines: {node: '>= 10'} - - makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - - map-age-cleaner@0.1.3: - resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} - engines: {node: '>=6'} - - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - - map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - - map-or-similar@1.5.0: - resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==} - - markdown-escapes@1.0.4: - resolution: {integrity: sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==} - - markdown-it@12.3.2: - resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==} - hasBin: true - - markdown-it@14.1.0: - resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} - hasBin: true - - markdown-table@3.0.4: - resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - - markdown-to-jsx@7.7.8: - resolution: {integrity: sha512-e+5bQJ30iIyJUV4tH/3wuBjpE5muLXsuBBi30N9t3B9O+UomC1Ocdqu7uD3X4YqtPrNLz+6QwHJaD7CXURBi+w==} - engines: {node: '>= 10'} - peerDependencies: - react: '>= 0.14.0' - - matches-selector@0.0.1: - resolution: {integrity: sha512-Bm8wuvuNGPY3j1Mo23PxieRQAmQQe2qVcqgmpHOp1BEBNgb4dqzn2Dcgu5bYltMosjGi6LD7GPW72zboSdyJQg==} - - math-expression-evaluator@1.4.0: - resolution: {integrity: sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw==} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - mathml-tag-names@2.1.3: - resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} - - mdast-squeeze-paragraphs@4.0.0: - resolution: {integrity: sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==} - - mdast-util-definitions@4.0.0: - resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} - - mdast-util-definitions@5.1.2: - resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} - - mdast-util-find-and-replace@3.0.2: - resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} - - mdast-util-from-markdown@1.3.1: - resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} - - mdast-util-from-markdown@2.0.2: - resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} - - mdast-util-gfm-autolink-literal@2.0.1: - resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} - - mdast-util-gfm-footnote@2.1.0: - resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} - - mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} - - mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} - - mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - - mdast-util-gfm@3.1.0: - resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} - - mdast-util-mdx-expression@2.0.1: - resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} - - mdast-util-mdx-jsx@3.2.0: - resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} - - mdast-util-mdxjs-esm@2.0.1: - resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} - - mdast-util-newline-to-break@2.0.0: - resolution: {integrity: sha512-MbgeFca0hLYIEx/2zGsszCSEJJ1JSCdiY5xQxRcLDDGa8EPvlLPupJ4DSajbMPAnC0je8jfb9TiUATnxxrHUog==} - - mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - - mdast-util-to-hast@10.0.1: - resolution: {integrity: sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==} - - mdast-util-to-hast@11.3.0: - resolution: {integrity: sha512-4o3Cli3hXPmm1LhB+6rqhfsIUBjnKFlIUZvudaermXB+4/KONdd/W4saWWkC+LBLbPMqhFSSTSRgafHsT5fVJw==} - - mdast-util-to-hast@13.2.0: - resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} - - mdast-util-to-markdown@2.1.2: - resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} - - mdast-util-to-string@1.1.0: - resolution: {integrity: sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==} - - mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} - - mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - - mdn-data@2.0.14: - resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} - - mdn-data@2.12.2: - resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} - - mdurl@1.0.1: - resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} - - mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - - media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} - - mem@1.1.0: - resolution: {integrity: sha512-nOBDrc/wgpkd3X/JOhMqYR+/eLqlfLP4oQfoBA6QExIxEl+GU01oyEkwWyueyO8110pUKijtiHGhEmYoOn88oQ==} - engines: {node: '>=4'} - - mem@8.1.1: - resolution: {integrity: sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==} - engines: {node: '>=10'} - - memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} - engines: {node: '>= 4.0.0'} - - memfs@4.17.2: - resolution: {integrity: sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==} - engines: {node: '>= 4.0.0'} - - memoizee@0.4.17: - resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==} - engines: {node: '>=0.12'} - - memoizerific@1.11.3: - resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} - - memory-fs@0.4.1: - resolution: {integrity: sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==} - - meow@10.1.5: - resolution: {integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - meow@13.2.0: - resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} - engines: {node: '>=18'} - - meow@3.7.0: - resolution: {integrity: sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==} - engines: {node: '>=0.10.0'} - - meow@9.0.0: - resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} - engines: {node: '>=10'} - - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - - merge-descriptors@2.0.0: - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} - engines: {node: '>=18'} - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - merge@1.2.1: - resolution: {integrity: sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==} - - meros@1.3.1: - resolution: {integrity: sha512-eV7dRObfTrckdmAz4/n7pT1njIsIJXRIZkgCiX43xEsPNy4gjXQzOYYxmGcolAMtF7HyfqRuDBh3Lgs4hmhVEw==} - engines: {node: '>=13'} - peerDependencies: - '@types/node': '>=13' - peerDependenciesMeta: - '@types/node': - optional: true - - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - - microbuffer@1.0.0: - resolution: {integrity: sha512-O/SUXauVN4x6RaEJFqSPcXNtLFL+QzJHKZlyDVYFwcDDRVca3Fa/37QXXC+4zAGGa4YhHrHxKXuuHvLDIQECtA==} - - microevent.ts@0.1.1: - resolution: {integrity: sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==} - - micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} - - micromark-core-commonmark@2.0.3: - resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} - - micromark-extension-gfm-autolink-literal@2.1.0: - resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} - - micromark-extension-gfm-footnote@2.1.0: - resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} - - micromark-extension-gfm-strikethrough@2.1.0: - resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} - - micromark-extension-gfm-table@2.1.1: - resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} - - micromark-extension-gfm-tagfilter@2.0.0: - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} - - micromark-extension-gfm-task-list-item@2.1.0: - resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} - - micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - - micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} - - micromark-factory-destination@2.0.1: - resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} - - micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} - - micromark-factory-label@2.0.1: - resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - - micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} - - micromark-factory-space@2.0.1: - resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} - - micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} - - micromark-factory-title@2.0.1: - resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} - - micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} - - micromark-factory-whitespace@2.0.1: - resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} - - micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} - - micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - - micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} - - micromark-util-chunked@2.0.1: - resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} - - micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} - - micromark-util-classify-character@2.0.1: - resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} - - micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} - - micromark-util-combine-extensions@2.0.1: - resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} - - micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} - - micromark-util-decode-numeric-character-reference@2.0.2: - resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} - - micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} - - micromark-util-decode-string@2.0.1: - resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} - - micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} - - micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - - micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} - - micromark-util-html-tag-name@2.0.1: - resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} - - micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} - - micromark-util-normalize-identifier@2.0.1: - resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} - - micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} - - micromark-util-resolve-all@2.0.1: - resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} - - micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} - - micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - - micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} - - micromark-util-subtokenize@2.1.0: - resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} - - micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} - - micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - - micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} - - micromark-util-types@2.0.2: - resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - - micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} - - micromark@4.0.2: - resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mime-types@3.0.1: - resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} - engines: {node: '>= 0.6'} - - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - - mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - - mimic-fn@1.2.0: - resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} - engines: {node: '>=4'} - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - mimic-fn@3.1.0: - resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} - engines: {node: '>=8'} - - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - - mimic-function@5.0.1: - resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} - engines: {node: '>=18'} - - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - - mimic-response@4.0.0: - resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - min-document@2.19.0: - resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} - - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - - mini-css-extract-plugin@2.9.2: - resolution: {integrity: sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.94.0 - - minim@0.23.8: - resolution: {integrity: sha512-bjdr2xW1dBCMsMGGsUeqM4eFI60m94+szhxWys+B1ztIt6gWSfeGBdSVCIawezeHYLYn0j6zrsXdQS/JllBzww==} - engines: {node: '>=6'} - - minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - - minimatch@10.0.3: - resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} - engines: {node: 20 || >=22} - - minimatch@3.0.3: - resolution: {integrity: sha512-NyXjqu1IwcqH6nv5vmMtaG3iw7kdV3g6MwlUBZkc3Vn5b5AMIWYKfptvzipoyFfhlfOgBQ9zoTxQMravF1QTnw==} - - minimatch@3.0.8: - resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - - minimatch@7.4.6: - 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'} - - minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} - - minipass-fetch@1.4.1: - resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} - engines: {node: '>=8'} - - minipass-fetch@2.1.2: - resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} - - minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} - - minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} - - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - - mississippi@2.0.0: - resolution: {integrity: sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==} - engines: {node: '>=4.0.0'} - - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - - mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - - mlly@1.7.4: - resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} - - mocha@10.8.2: - resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} - engines: {node: '>= 14.0.0'} - hasBin: true - - mocha@11.7.0: - resolution: {integrity: sha512-bXfLy/mI8n4QICg+pWj1G8VduX5vC0SHRwFpiR5/Fxc8S2G906pSfkyMmHVsdJNQJQNh3LE67koad9GzEvkV6g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - - moment-timezone@0.5.39: - resolution: {integrity: sha512-hoB6suq4ISDj7BDgctiOy6zljBsdYT0++0ZzZm9rtxIvJhIbQ3nmbgSWe7dNFGurl6/7b1OUkHlmN9JWgXVz7w==} - - moment@2.30.1: - resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} - - monaco-editor-webpack-plugin@7.1.0: - resolution: {integrity: sha512-ZjnGINHN963JQkFqjjcBtn1XBtUATDZBMgNQhDQwd78w2ukRhFXAPNgWuacaQiDZsUr4h1rWv5Mv6eriKuOSzA==} - peerDependencies: - monaco-editor: '>= 0.31.0' - webpack: ^5.94.0 - - monaco-editor@0.44.0: - resolution: {integrity: sha512-5SmjNStN6bSuSE5WPT2ZV+iYn1/yI9sd4Igtk23ChvqB7kDk9lZbB9F5frsuvpB+2njdIeGGFf2G4gbE6rCC9Q==} - - monaco-editor@0.46.0: - resolution: {integrity: sha512-ADwtLIIww+9FKybWscd7OCfm9odsFYHImBRI1v9AviGce55QY8raT+9ihH8jX/E/e6QVSGM+pKj4jSUSRmALNQ==} - - monaco-editor@0.52.2: - resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} - - monaco-languageclient@0.13.1-next.9: - resolution: {integrity: sha512-VXzrrlB7RbpvrsgDJw8jmgGqSoFnAWQTOgwwIop7D25O9GB4A0HriyiyTumeOd7JJAQRLyserzSbfrRlBDD+aQ==} - engines: {vscode: ^1.50.0} - - monaco-page-objects@3.14.1: - resolution: {integrity: sha512-+inJ9rwxYraQFCA+YpjyYcoxmNHcEsxPH7bPhmeaZ09eRh0o3RQqFRZDkibFOraDpKiC5miqEDYR9pJx+hau4Q==} - deprecated: Deprecated - This package was replaced by @redhat-developer/page-objects - peerDependencies: - selenium-webdriver: '>=4.6.1' - typescript: '>=4.6.2' - - mousetrap@1.6.5: - resolution: {integrity: sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==} - - move-concurrently@1.0.1: - resolution: {integrity: sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==} - deprecated: This package is no longer supported. - - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - multicast-dns@7.2.5: - resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} - hasBin: true - - mustache@4.2.0: - resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} - hasBin: true - - mute-stream@0.0.7: - resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==} - - mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - - nan@2.22.2: - resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==} - - nano-spawn@1.0.2: - resolution: {integrity: sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg==} - engines: {node: '>=20.17'} - - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - nanoid@5.1.5: - resolution: {integrity: sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==} - engines: {node: ^18 || >=20} - hasBin: true - - nanospinner@1.2.2: - resolution: {integrity: sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==} - - napi-build-utils@2.0.0: - resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - neatequal@1.0.0: - resolution: {integrity: sha512-sVt5awO4a4w24QmAthdrCPiVRW3naB8FGLdyadin01BH+6BzNPEBwGrpwCczQvPlULS6uXTItTe1PJ5P0kYm7A==} - - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - negotiator@0.6.4: - resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} - engines: {node: '>= 0.6'} - - negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} - - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - neotraverse@0.6.18: - resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} - engines: {node: '>= 10'} - - nested-error-stacks@2.1.1: - resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} - - next-tick@1.1.0: - resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - - nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - - no-case@2.3.2: - resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} - - no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - - node-abi@3.75.0: - resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} - engines: {node: '>=10'} - - node-abort-controller@3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} - - node-addon-api@4.3.0: - resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} - - node-addon-api@7.1.1: - resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - - node-addon-api@8.4.0: - resolution: {integrity: sha512-D9DI/gXHvVmjHS08SVch0Em8G5S1P+QWtU31appcKT/8wFSPRcdHadIFSAntdMMVM5zz+/DL+bL/gz3UDppqtg==} - engines: {node: ^18 || ^20 || >= 21} - - node-dir@0.1.17: - resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} - engines: {node: '>= 0.10.5'} - - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - deprecated: Use your platform's native DOMException instead - - node-fetch-commonjs@3.3.2: - resolution: {integrity: sha512-VBlAiynj3VMLrotgwOS3OyECFxas5y7ltLcK4t41lMUZeaK15Ym4QRkqN0EQKAFL42q9i21EPKjzLUPfltR72A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - node-fetch-native@1.6.6: - resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} - - 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 - - node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - - node-gyp@3.8.0: - resolution: {integrity: sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==} - engines: {node: '>= 0.8.0'} - hasBin: true - - node-gyp@8.4.1: - resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} - engines: {node: '>= 10.12.0'} - hasBin: true - - node-gyp@9.4.1: - resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} - engines: {node: ^12.13 || ^14.13 || >=16} - hasBin: true - - node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - - node-loader@2.1.0: - resolution: {integrity: sha512-OwjPkyh8+7jW8DMd/iq71uU1Sspufr/C2+c3t0p08J3CrM9ApZ4U53xuisNrDXOHyGi5OYHgtfmmh+aK9zJA6g==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^5.94.0 - - node-notifier@5.4.5: - resolution: {integrity: sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==} - - node-notifier@6.0.0: - resolution: {integrity: sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==} - - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - - node-sarif-builder@2.0.3: - resolution: {integrity: sha512-Pzr3rol8fvhG/oJjIq2NTVB0vmdNNlz22FENhhPojYRZ4/ee08CfK4YuKmuL54V9MLhI1kpzxfOJ/63LzmZzDg==} - engines: {node: '>=14'} - - node-sass@9.0.0: - resolution: {integrity: sha512-yltEuuLrfH6M7Pq2gAj5B6Zm7m+gdZoG66wTqG6mIZV/zijq3M2OO2HswtT6oBspPyFhHDcaxWpsBm0fRNDHPg==} - engines: {node: '>=16'} - deprecated: Node Sass is no longer supported. Please use `sass` or `sass-embedded` instead. - hasBin: true - - node-schedule@2.1.1: - resolution: {integrity: sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==} - engines: {node: '>=6'} - - noms@0.0.0: - resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} - - nopt@3.0.6: - resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} - hasBin: true - - nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true - - nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true - - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - - normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} - - normalize-package-data@6.0.2: - resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} - engines: {node: ^16.14.0 || >=18.0.0} - - normalize-path@2.1.1: - resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} - engines: {node: '>=0.10.0'} - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - - normalize-url@1.9.1: - resolution: {integrity: sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ==} - engines: {node: '>=4'} - - normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - - normalize-url@8.0.2: - resolution: {integrity: sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==} - engines: {node: '>=14.16'} - - npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - npmlog@4.1.2: - resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} - deprecated: This package is no longer supported. - - npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - deprecated: This package is no longer supported. - - npmlog@6.0.2: - resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This package is no longer supported. - - nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - - nullthrows@1.1.1: - resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} - - num2fraction@1.2.2: - resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==} - - number-is-nan@1.0.1: - resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} - engines: {node: '>=0.10.0'} - - nwmatcher@1.4.4: - resolution: {integrity: sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==} - - nwsapi@2.2.20: - resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} - - nypm@0.5.4: - resolution: {integrity: sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA==} - engines: {node: ^14.16.0 || >=16.10.0} - hasBin: true - - oauth-sign@0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - object.entries@1.1.9: - resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - 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.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - - object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} - - objectorarray@1.0.5: - resolution: {integrity: sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==} - - obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - - on-headers@1.1.0: - resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} - engines: {node: '>= 0.8'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - one-time@1.0.0: - resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} - - onetime@2.0.1: - resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} - engines: {node: '>=4'} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - - onetime@7.0.0: - resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} - engines: {node: '>=18'} - - open@10.1.2: - resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==} - engines: {node: '>=18'} - - open@7.4.2: - resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} - engines: {node: '>=8'} - - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - - openapi-path-templating@2.2.1: - resolution: {integrity: sha512-eN14VrDvl/YyGxxrkGOHkVkWEoPyhyeydOUrbvjoz8K5eIGgELASwN1eqFOJ2CTQMGCy2EntOK1KdtJ8ZMekcg==} - engines: {node: '>=12.20.0'} - - openapi-server-url-templating@1.3.0: - resolution: {integrity: sha512-DPlCms3KKEbjVQb0spV6Awfn6UWNheuG/+folQPzh/wUaKwuqvj8zt5gagD7qoyxtE03cIiKPgLFS3Q8Bz00uQ==} - engines: {node: '>=12.20.0'} - - opener@1.5.2: - resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} - hasBin: true - - opn@5.2.0: - resolution: {integrity: sha512-Jd/GpzPyHF4P2/aNOVmS3lfMSWV9J7cOhCG1s08XCEAsPkB7lp6ddiU0J7XzyQRDUh8BqJ7PchfINjR8jyofRQ==} - engines: {node: '>=4'} - - optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - ora@4.1.1: - resolution: {integrity: sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==} - engines: {node: '>=8'} - - ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - - ora@8.2.0: - resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} - engines: {node: '>=18'} - - original@1.0.2: - resolution: {integrity: sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==} - - os-homedir@1.0.2: - resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} - engines: {node: '>=0.10.0'} - - os-locale@1.4.0: - resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} - engines: {node: '>=0.10.0'} - - os-locale@2.1.0: - resolution: {integrity: sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==} - engines: {node: '>=4'} - - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - - osenv@0.1.5: - resolution: {integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==} - deprecated: This package is no longer supported. - - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} - - p-all@2.1.0: - resolution: {integrity: sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA==} - engines: {node: '>=6'} - - p-cancelable@3.0.0: - resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} - engines: {node: '>=12.20'} - - p-cancelable@4.0.1: - resolution: {integrity: sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==} - engines: {node: '>=14.16'} - - p-defer@1.0.0: - resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} - engines: {node: '>=4'} - - p-each-series@2.2.0: - resolution: {integrity: sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==} - engines: {node: '>=8'} - - p-event@4.2.0: - resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==} - engines: {node: '>=8'} - - p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} - - p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - - p-finally@2.0.1: - resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} - engines: {node: '>=8'} - - p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} - - p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} - - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - p-map@1.2.0: - resolution: {integrity: sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==} - engines: {node: '>=4'} - - p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - - p-map@3.0.0: - resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} - engines: {node: '>=8'} - - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - - p-map@5.5.0: - resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} - engines: {node: '>=12'} - - p-map@7.0.3: - resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} - engines: {node: '>=18'} - - p-queue@6.6.2: - resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} - engines: {node: '>=8'} - - p-retry@6.2.1: - resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} - engines: {node: '>=16.17'} - - p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} - - p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} - - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - - package-json@4.0.1: - resolution: {integrity: sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==} - engines: {node: '>=4'} - - pako@0.2.9: - resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} - - pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - - pako@2.1.0: - resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} - - parallel-transform@1.2.0: - resolution: {integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==} - - param-case@2.1.1: - resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} - - param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} - - parse-entities@4.0.2: - resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} - - parse-json@2.2.0: - resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} - engines: {node: '>=0.10.0'} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - - parse-json@7.1.1: - resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} - engines: {node: '>=16'} - - parse-passwd@1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} - - parse-semver@1.1.1: - resolution: {integrity: sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==} - - parse5-htmlparser2-tree-adapter@7.1.0: - resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} - - parse5-parser-stream@7.1.2: - resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} - - parse5@1.5.1: - resolution: {integrity: sha512-w2jx/0tJzvgKwZa58sj2vAYq/S/K1QJfIB3cWYea/Iu1scFPDQQ3IQiVZTHWtRBwAjv2Yd7S/xeZf3XqLDb3bA==} - - parse5@4.0.0: - resolution: {integrity: sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==} - - parse5@5.1.0: - resolution: {integrity: sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==} - - parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - - parse5@7.3.0: - resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - - pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - - path-dirname@1.0.2: - resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} - - path-exists@2.1.0: - resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} - engines: {node: '>=0.10.0'} - - path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-is-inside@1.0.2: - resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} - - path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - path-scurry@2.0.0: - resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} - engines: {node: 20 || >=22} - - path-to-regexp@0.1.12: - resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - - path-to-regexp@1.9.0: - resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==} - - path-to-regexp@8.2.0: - resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} - engines: {node: '>=16'} - - path-type@1.1.0: - resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} - engines: {node: '>=0.10.0'} - - path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - path-type@6.0.0: - resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} - engines: {node: '>=18'} - - path@0.12.7: - resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} - - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - - pathfinding@0.4.18: - resolution: {integrity: sha512-R0TGEQ9GRcFCDvAWlJAWC+KGJ9SLbW4c0nuZRcioVlXVTlw+F5RvXQ8SQgSqI9KXWC1ew95vgmIiyaWTlCe9Ag==} - - paths-js@0.4.11: - resolution: {integrity: sha512-3mqcLomDBXOo7Fo+UlaenG6f71bk1ZezPQy2JCmYHy2W2k5VKpP+Jbin9H0bjXynelTbglCqdFhSEkeIkKTYUA==} - engines: {node: '>=0.11.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} - engines: {node: '>= 14.16'} - - pathval@2.0.1: - resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} - engines: {node: '>= 14.16'} - - peek-readable@5.4.2: - resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} - engines: {node: '>=14.16'} - - peek-stream@1.1.3: - resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} - - pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - - performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - - picocolors@0.2.1: - resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} - - pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - - pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - - pify@5.0.0: - resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} - engines: {node: '>=10'} - - pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} - - pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - - pirates@4.0.7: - resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} - engines: {node: '>= 6'} - - pkce-challenge@3.1.0: - resolution: {integrity: sha512-bQ/0XPZZ7eX+cdAkd61uYWpfMhakH3NeteUF1R8GNa+LMqX8QFAkbCLqq+AYAns1/ueACBu/BMWhrlKGrdvGZg==} - - pkce-challenge@5.0.0: - resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} - engines: {node: '>=16.20.0'} - - pkg-dir@2.0.0: - resolution: {integrity: sha512-ojakdnUgL5pzJYWw2AIDEupaQCX5OPbM688ZevubICjdIX01PRSYKqm33fJoCOJBRseYCTUlQRnBNX+Pchaejw==} - engines: {node: '>=4'} - - pkg-dir@3.0.0: - resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} - engines: {node: '>=6'} - - pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - - pkg-dir@5.0.0: - resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} - engines: {node: '>=10'} - - pkg-dir@7.0.0: - resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} - engines: {node: '>=14.16'} - - pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - - playwright-core@1.52.0: - resolution: {integrity: sha512-l2osTgLXSMeuLZOML9qYODUQoPPnUsKsb5/P6LJ2e6uPKXUdPK5WYhN4z03G+YNbWmGDY4YENauNu4ZKczreHg==} - engines: {node: '>=18'} - hasBin: true - - playwright@1.52.0: - resolution: {integrity: sha512-JAwMNMBlxJ2oD1kce4KPtMkDeKGHQstdpFPcPH3maElAXon/QZeTvtsfXmTMRyO9TslfoYOXkSsvao2nE1ilTw==} - engines: {node: '>=18'} - hasBin: true - - plugin-error@1.0.1: - resolution: {integrity: sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==} - engines: {node: '>= 0.10'} - - pluralize@2.0.0: - resolution: {integrity: sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==} - - pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - - pn@1.1.0: - resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} - - pnp-webpack-plugin@1.6.4: - resolution: {integrity: sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==} - engines: {node: '>=6'} - - polished@4.3.1: - resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} - engines: {node: '>=10'} - - popmotion@11.0.3: - resolution: {integrity: sha512-Y55FLdj3UxkR7Vl3s7Qr4e9m0onSnP8W7d/xQLsoJM40vs6UKHFdygs6SWryasTZYqugMjm3BepCF4CWXDiHgA==} - - portfinder@1.0.37: - resolution: {integrity: sha512-yuGIEjDAYnnOex9ddMnKZEMFE0CcGo6zbfzDklkmT1m5z734ss6JMzN9rNB3+RR7iS+F10D4/BVIaXOyh8PQKw==} - engines: {node: '>= 10.12'} - - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} - - postcss-calc@5.3.1: - resolution: {integrity: sha512-iBcptYFq+QUh9gzP7ta2btw50o40s4uLI4UDVgd5yRAZtUDWc5APdl5yQDd2h/TyiZNbJrv0HiYhT102CMgN7Q==} - - postcss-calc@8.2.4: - resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} - peerDependencies: - postcss: ^8.2.2 - - postcss-colormin@2.2.2: - resolution: {integrity: sha512-XXitQe+jNNPf+vxvQXIQ1+pvdQKWKgkx8zlJNltcMEmLma1ypDRDQwlLt+6cP26fBreihNhZxohh1rcgCH2W5w==} - - postcss-colormin@5.3.1: - resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-convert-values@2.6.1: - resolution: {integrity: sha512-SE7mf25D3ORUEXpu3WUqQqy0nCbMuM5BEny+ULE/FXdS/0UMA58OdzwvzuHJRpIFlk1uojt16JhaEogtP6W2oA==} - - postcss-convert-values@5.1.3: - resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-discard-comments@2.0.4: - resolution: {integrity: sha512-yGbyBDo5FxsImE90LD8C87vgnNlweQkODMkUZlDVM/CBgLr9C5RasLGJxxh9GjVOBeG8NcCMatoqI1pXg8JNXg==} - - postcss-discard-comments@5.1.2: - resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-discard-duplicates@2.1.0: - resolution: {integrity: sha512-+lk5W1uqO8qIUTET+UETgj9GWykLC3LOldr7EehmymV0Wu36kyoHimC4cILrAAYpHQ+fr4ypKcWcVNaGzm0reA==} - - postcss-discard-duplicates@5.1.0: - resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-discard-empty@2.1.0: - resolution: {integrity: sha512-IBFoyrwk52dhF+5z/ZAbzq5Jy7Wq0aLUsOn69JNS+7YeuyHaNzJwBIYE0QlUH/p5d3L+OON72Fsexyb7OK/3og==} - - postcss-discard-empty@5.1.1: - resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-discard-overridden@0.1.1: - resolution: {integrity: sha512-IyKoDL8QNObOiUc6eBw8kMxBHCfxUaERYTUe2QF8k7j/xiirayDzzkmlR6lMQjrAM1p1DDRTvWrS7Aa8lp6/uA==} - - postcss-discard-overridden@5.1.0: - resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-discard-unused@2.2.3: - resolution: {integrity: sha512-nCbFNfqYAbKCw9J6PSJubpN9asnrwVLkRDFc4KCwyUEdOtM5XDE/eTW3OpqHrYY1L4fZxgan7LLRAAYYBzwzrg==} - - postcss-filter-plugins@2.0.3: - resolution: {integrity: sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==} - - postcss-flexbugs-fixes@3.2.0: - resolution: {integrity: sha512-0AuD9HG1Ey3/3nqPWu9yqf7rL0KCPu5VgjDsjf5mzEcuo9H/z8nco/fljKgjsOUrZypa95MI0kS4xBZeBzz2lw==} - - postcss-flexbugs-fixes@4.2.1: - resolution: {integrity: sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ==} - - postcss-import@15.1.0: - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 - - postcss-js@4.0.1: - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - - postcss-load-config@1.2.0: - resolution: {integrity: sha512-3fpCfnXo9Qd/O/q/XL4cJUhRsqjVD2V1Vhy3wOEcLE5kz0TGtdDXJSoiTdH4e847KphbEac4+EZSH4qLRYIgLw==} - engines: {node: '>=0.12'} - - postcss-load-config@3.1.4: - resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} - engines: {node: '>= 10'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - - postcss-load-config@4.0.2: - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - - postcss-load-options@1.2.0: - resolution: {integrity: sha512-WKS5LJMZLWGwtfhs5ahb2ycpoYF3m0kK4QEaM+elr5EpiMt0H296P/9ETa13WXzjPwB0DDTBiUBBWSHoApQIJg==} - engines: {node: '>=0.12'} - - postcss-load-plugins@2.3.0: - resolution: {integrity: sha512-/WGUMYhKiryWjYO6c7kAcqMuD7DVkaQ8HcbQenDme/d3OBOmrYMFObOKgUWyUy1uih5U2Dakq8H6VcJi5C9wHQ==} - engines: {node: '>=0.12'} - - postcss-loader@2.0.8: - resolution: {integrity: sha512-KtXBiQ/r/WYW8LxTSJK7h8wLqvCMSub/BqmRnud/Mu8RzwflW9cmXxwsMwbn15TNv287Hcufdb3ZSs7xHKnG8Q==} - engines: {node: '>= 4'} - - postcss-loader@4.3.0: - resolution: {integrity: sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==} - engines: {node: '>= 10.13.0'} - peerDependencies: - postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.94.0 - - postcss-loader@8.1.1: - resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==} - engines: {node: '>= 18.12.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.94.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true - - postcss-merge-idents@2.1.7: - resolution: {integrity: sha512-9DHmfCZ7/hNHhIKnNkz4CU0ejtGen5BbTRJc13Z2uHfCedeCUsK2WEQoAJRBL+phs68iWK6Qf8Jze71anuysWA==} - - postcss-merge-longhand@2.0.2: - resolution: {integrity: sha512-ma7YvxjdLQdifnc1HFsW/AW6fVfubGyR+X4bE3FOSdBVMY9bZjKVdklHT+odknKBB7FSCfKIHC3yHK7RUAqRPg==} - - postcss-merge-longhand@5.1.7: - resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-merge-rules@2.1.2: - resolution: {integrity: sha512-Wgg2FS6W3AYBl+5L9poL6ZUISi5YzL+sDCJfM7zNw/Q1qsyVQXXZ2cbVui6mu2cYJpt1hOKCGj1xA4mq/obz/Q==} - - postcss-merge-rules@5.1.4: - resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-message-helpers@2.0.0: - resolution: {integrity: sha512-tPLZzVAiIJp46TBbpXtrUAKqedXSyW5xDEo1sikrfEfnTs+49SBZR/xDdqCiJvSSbtr615xDsaMF3RrxS2jZlA==} - - postcss-minify-font-values@1.0.5: - resolution: {integrity: sha512-vFSPzrJhNe6/8McOLU13XIsERohBJiIFFuC1PolgajOZdRWqRgKITP/A4Z/n4GQhEmtbxmO9NDw3QLaFfE1dFQ==} - - postcss-minify-font-values@5.1.0: - resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-minify-gradients@1.0.5: - resolution: {integrity: sha512-DZhT0OE+RbVqVyGsTIKx84rU/5cury1jmwPa19bViqYPQu499ZU831yMzzsyC8EhiZVd73+h5Z9xb/DdaBpw7Q==} - - postcss-minify-gradients@5.1.1: - resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-minify-params@1.2.2: - resolution: {integrity: sha512-hhJdMVgP8vasrHbkKAk+ab28vEmPYgyuDzRl31V3BEB3QOR3L5TTIVEWLDNnZZ3+fiTi9d6Ker8GM8S1h8p2Ow==} - - postcss-minify-params@5.1.4: - resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-minify-selectors@2.1.1: - resolution: {integrity: sha512-e13vxPBSo3ZaPne43KVgM+UETkx3Bs4/Qvm6yXI9HQpQp4nyb7HZ0gKpkF+Wn2x+/dbQ+swNpCdZSbMOT7+TIA==} - - postcss-minify-selectors@5.2.1: - resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-modules-extract-imports@1.2.1: - resolution: {integrity: sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==} - - postcss-modules-extract-imports@2.0.0: - resolution: {integrity: sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==} - engines: {node: '>= 6'} - - postcss-modules-extract-imports@3.1.0: - resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-local-by-default@1.2.0: - resolution: {integrity: sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA==} - - postcss-modules-local-by-default@3.0.3: - resolution: {integrity: sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==} - engines: {node: '>= 6'} - - postcss-modules-local-by-default@4.2.0: - resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-scope@1.1.0: - resolution: {integrity: sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw==} - - postcss-modules-scope@2.2.0: - resolution: {integrity: sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==} - engines: {node: '>= 6'} - - postcss-modules-scope@3.2.1: - resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-values@1.3.0: - resolution: {integrity: sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA==} - - postcss-modules-values@3.0.0: - resolution: {integrity: sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==} - - postcss-modules-values@4.0.0: - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules@4.3.1: - resolution: {integrity: sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==} - peerDependencies: - postcss: ^8.0.0 - - postcss-nested@6.2.0: - resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - - postcss-normalize-charset@1.1.1: - resolution: {integrity: sha512-RKgjEks83l8w4yEhztOwNZ+nLSrJ+NvPNhpS+mVDzoaiRHZQVoG7NF2TP5qjwnaN9YswUhj6m1E0S0Z+WDCgEQ==} - - postcss-normalize-charset@5.1.0: - resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-display-values@5.1.0: - resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-positions@5.1.1: - resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-repeat-style@5.1.1: - resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-string@5.1.0: - resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-timing-functions@5.1.0: - resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-unicode@5.1.1: - resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-url@3.0.8: - resolution: {integrity: sha512-WqtWG6GV2nELsQEFES0RzfL2ebVwmGl/M8VmMbshKto/UClBo+mznX8Zi4/hkThdqx7ijwv+O8HWPdpK7nH/Ig==} - - postcss-normalize-url@5.1.0: - resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-normalize-whitespace@5.1.1: - resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-ordered-values@2.2.3: - resolution: {integrity: sha512-5RB1IUZhkxDCfa5fx/ogp/A82mtq+r7USqS+7zt0e428HJ7+BHCxyeY39ClmkkUtxdOd3mk8gD6d9bjH2BECMg==} - - postcss-ordered-values@5.1.3: - resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-reduce-idents@2.4.0: - resolution: {integrity: sha512-0+Ow9e8JLtffjumJJFPqvN4qAvokVbdQPnijUDSOX8tfTwrILLP4ETvrZcXZxAtpFLh/U0c+q8oRMJLr1Kiu4w==} - - postcss-reduce-initial@1.0.1: - resolution: {integrity: sha512-jJFrV1vWOPCQsIVitawGesRgMgunbclERQ/IRGW7r93uHrVzNQQmHQ7znsOIjJPZ4yWMzs5A8NFhp3AkPHPbDA==} - - postcss-reduce-initial@5.1.2: - resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-reduce-transforms@1.0.4: - resolution: {integrity: sha512-lGgRqnSuAR5i5uUg1TA33r9UngfTadWxOyL2qx1KuPoCQzfmtaHjp9PuwX7yVyRxG3BWBzeFUaS5uV9eVgnEgQ==} - - postcss-reduce-transforms@5.1.0: - resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-resolve-nested-selector@0.1.6: - resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} - - postcss-safe-parser@7.0.1: - resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} - engines: {node: '>=18.0'} - peerDependencies: - postcss: ^8.4.31 - - postcss-selector-parser@2.2.3: - resolution: {integrity: sha512-3pqyakeGhrO0BQ5+/tGTfvi5IAUAhHRayGK8WFSu06aEv2BmHoXw/Mhb+w7VY5HERIuC+QoUI7wgrCcq2hqCVA==} - - postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} - engines: {node: '>=4'} - - postcss-selector-parser@7.1.0: - resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} - engines: {node: '>=4'} - - postcss-svgo@2.1.6: - resolution: {integrity: sha512-y5AdQdgBoF4rbpdbeWAJuxE953g/ylRfVNp6mvAi61VCN/Y25Tu9p5mh3CyI42WbTRIiwR9a1GdFtmDnNPeskQ==} - - postcss-svgo@5.1.0: - resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-unique-selectors@2.0.2: - resolution: {integrity: sha512-WZX8r1M0+IyljoJOJleg3kYm10hxNYF9scqAT7v/xeSX1IdehutOM85SNO0gP9K+bgs86XERr7Ud5u3ch4+D8g==} - - postcss-unique-selectors@5.1.1: - resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - postcss-value-parser@3.3.1: - resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==} - - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - - postcss-zindex@2.2.0: - resolution: {integrity: sha512-uhRZ2hRgj0lorxm9cr62B01YzpUe63h0RXMXQ4gWW3oa2rpJh+FJAiEAytaFCPU/VgaBS+uW2SJ1XKyDNz1h4w==} - - postcss@5.2.18: - resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==} - engines: {node: '>=0.12'} - - postcss@6.0.23: - resolution: {integrity: sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==} - engines: {node: '>=4.0.0'} - - postcss@7.0.39: - resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} - engines: {node: '>=6.0.0'} - - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} - engines: {node: ^10 || ^12 || >=14} - - prebuild-install@7.1.3: - resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} - engines: {node: '>=10'} - hasBin: true - - prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prepend-http@1.0.4: - resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} - engines: {node: '>=0.10.0'} - - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - - prettier@1.19.1: - resolution: {integrity: sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==} - engines: {node: '>=4'} - hasBin: true - - prettier@2.3.0: - resolution: {integrity: sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w==} - engines: {node: '>=10.13.0'} - hasBin: true - - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - - prettier@3.5.3: - resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} - engines: {node: '>=14'} - hasBin: true - - prettier@3.6.2: - resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} - engines: {node: '>=14'} - hasBin: true - - pretty-bytes@4.0.2: - resolution: {integrity: sha512-yJAF+AjbHKlxQ8eezMd/34Mnj/YTQ3i6kLzvVsH4l/BfIFtp444n0wVbnsn66JimZ9uBofv815aRp1zCppxlWw==} - engines: {node: '>=4'} - - pretty-error@2.1.2: - resolution: {integrity: sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==} - - pretty-error@4.0.0: - resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} - - pretty-format@20.0.3: - resolution: {integrity: sha512-dSW/15bmtC3vuheyzWUveowskTAUAWKE08+x06rgYzvSoDzg6cVg/MPKgNvh87jRJvOQ/qaQZLLWml2jrukk6w==} - - pretty-format@22.4.3: - resolution: {integrity: sha512-S4oT9/sT6MN7/3COoOy+ZJeA92VmOnveLHgrwBE3Z1W5N9S2A1QGNYiE1z75DAENbJrXXUb+OWXhpJcg05QKQQ==} - - pretty-format@25.5.0: - resolution: {integrity: sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==} - engines: {node: '>= 8.3'} - - pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - pretty-hrtime@1.0.3: - resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} - engines: {node: '>= 0.8'} - - prism-react-renderer@2.4.1: - resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==} - peerDependencies: - react: '>=16.0.0' - - prismjs@1.30.0: - resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} - engines: {node: '>=6'} - - private@0.1.8: - resolution: {integrity: sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==} - engines: {node: '>= 0.6'} - - process-nextick-args@1.0.7: - resolution: {integrity: sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==} - - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - - progress-estimator@0.2.2: - resolution: {integrity: sha512-GF76Ac02MTJD6o2nMNtmtOFjwWCnHcvXyn5HOWPQnEMO8OTLw7LAvNmrwe8LmdsB+eZhwUu9fX/c9iQnBxWaFA==} - - progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - - promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - - promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} - - promise.allsettled@1.0.7: - resolution: {integrity: sha512-hezvKvQQmsFkOdrZfYxUxkyxl8mgFQeT259Ajj9PXdbg9VzBCWrItOev72JyWxkCD5VSSqAeHmlN3tWx4DlmsA==} - engines: {node: '>= 0.4'} - - promise.prototype.finally@3.1.8: - resolution: {integrity: sha512-aVDtsXOml9iuMJzUco9J1je/UrIT3oMYfWkCTiUhkt+AvZw72q4dUZnR/R/eB3h5GeAagQVXvM1ApoYniJiwoA==} - engines: {node: '>= 0.4'} - - promise.series@0.2.0: - resolution: {integrity: sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==} - engines: {node: '>=0.12'} - - promise@7.3.1: - resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} - - promise@8.0.1: - resolution: {integrity: sha512-6NO4VAynZF2J958bGr+U5mPDwK5n7Vi/S0mCW7bke3bJmcALGjCywH8sl6a2eN+xIX6Q1exH2lmqyjR9PKTiwg==} - - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - - proper-lockfile@1.2.0: - resolution: {integrity: sha512-YNjxtCoY3A+lohlLXWCYrHDhUdfU3MMnuC+ADhloDvJo586LKW23dPrjxGvRGuus05Amcf0cQy6vrjjtbJhWpw==} - - property-expr@2.0.6: - resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} - - property-information@5.6.0: - resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} - - property-information@6.5.0: - resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - - property-information@7.1.0: - resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - - proxy-from-env@0.0.1: - resolution: {integrity: sha512-B9Hnta3CATuMS0q6kt5hEezOPM+V3dgaRewkFtFoaRQYTVNsHqUvFXmndH06z3QO1ZdDnRELv5vfY6zAj/gG7A==} - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - prr@1.0.1: - resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - - psl@1.15.0: - resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} - - pump@1.0.3: - resolution: {integrity: sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==} - - pump@2.0.1: - resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - - pump@3.0.3: - resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} - - pumpify@1.5.1: - resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} - - punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} - - punycode@1.4.1: - resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - puppeteer-core@2.1.1: - resolution: {integrity: sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w==} - engines: {node: '>=8.16.0'} - - pure-color@1.3.0: - resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==} - - pure-rand@6.1.0: - resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} - - q@1.5.1: - resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} - engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - deprecated: |- - You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. - - (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) - - qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} - engines: {node: '>=0.6'} - - qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} - engines: {node: '>=0.6'} - - qs@6.5.3: - resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} - engines: {node: '>=0.6'} - - query-string@4.3.4: - resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==} - engines: {node: '>=0.10.0'} - - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - - quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - - raf@3.4.0: - resolution: {integrity: sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==} - - ramda-adjunct@5.1.0: - resolution: {integrity: sha512-8qCpl2vZBXEJyNbi4zqcgdfHtcdsWjOGbiNSEnEBrM6Y0OKOT8UxJbIVGm1TIcjaSu2MxaWcgtsNlKlCk7o7qg==} - engines: {node: '>=0.10.3'} - peerDependencies: - ramda: '>= 0.30.0' - - ramda@0.28.0: - resolution: {integrity: sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==} - - ramda@0.29.0: - resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} - - ramda@0.30.1: - resolution: {integrity: sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==} - - randexp@0.5.3: - resolution: {integrity: sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==} - engines: {node: '>=4'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - - raw-body@3.0.0: - resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} - engines: {node: '>= 0.8'} - - raw-loader@4.0.2: - resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^5.94.0 - - rc-config-loader@4.1.3: - resolution: {integrity: sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==} - - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - - react-base16-styling@0.6.0: - resolution: {integrity: sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==} - - react-collapse@5.1.1: - resolution: {integrity: sha512-k6cd7csF1o9LBhQ4AGBIdxB60SUEUMQDAnL2z1YvYNr9KoKr+nDkhN6FK7uGaBd/rYrYfrMpzpmJEIeHRYogBw==} - peerDependencies: - react: '>=16.3.0' - - react-colorful@5.6.1: - resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - react-copy-to-clipboard@5.1.0: - resolution: {integrity: sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==} - peerDependencies: - react: ^15.3.0 || 16 || 17 || 18 - - react-debounce-input@3.3.0: - resolution: {integrity: sha512-VEqkvs8JvY/IIZvh71Z0TC+mdbxERvYF33RcebnodlsUZ8RSgyKe2VWaHXv4+/8aoOgXLxWrdsYs2hDhcwbUgA==} - peerDependencies: - react: ^15.3.0 || 16 || 17 || 18 - - react-dev-utils@5.0.3: - resolution: {integrity: sha512-Mvs6ofsc2xTjeZIrMaIfbXfsPVrbdVy/cVqq6SAacnqfMlcBpDuivhWZ1ODGeJ8HgmyWTLH971PYjj/EPCDVAw==} - engines: {node: '>=6'} - peerDependencies: - typescript: '>=2.7' - webpack: ^5.94.0 - peerDependenciesMeta: - typescript: - optional: true - - react-dnd-html5-backend@16.0.1: - resolution: {integrity: sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==} - - react-dnd@16.0.1: - resolution: {integrity: sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==} - peerDependencies: - '@types/hoist-non-react-statics': '>= 3.3.1' - '@types/node': '>= 12' - '@types/react': '>= 16' - react: '>= 16.14' - peerDependenciesMeta: - '@types/hoist-non-react-statics': - optional: true - '@types/node': - optional: true - '@types/react': - optional: true - - react-docgen-typescript@2.4.0: - resolution: {integrity: sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==} - peerDependencies: - typescript: '>= 4.3.x' - - react-docgen@5.4.3: - resolution: {integrity: sha512-xlLJyOlnfr8lLEEeaDZ+X2J/KJoe6Nr9AzxnkdQWush5hz2ZSu66w6iLMOScMmxoSHWpWMn+k3v5ZiyCfcWsOA==} - engines: {node: '>=8.10.0'} - hasBin: true - - react-docgen@7.1.1: - resolution: {integrity: sha512-hlSJDQ2synMPKFZOsKo9Hi8WWZTC7POR8EmWvTSjow+VDgKzkmjQvFm2fk0tmRw+f0vTOIYKlarR0iL4996pdg==} - engines: {node: '>=16.14.0'} - - react-docgen@8.0.0: - resolution: {integrity: sha512-kmob/FOTwep7DUWf9KjuenKX0vyvChr3oTdvvPt09V60Iz75FJp+T/0ZeHMbAfJj2WaVWqAPP5Hmm3PYzSPPKg==} - engines: {node: ^20.9.0 || >=22} - - react-dom@18.2.0: - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 - - react-dom@19.1.0: - resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} - peerDependencies: - react: ^19.1.0 - - react-element-to-jsx-string@14.3.4: - resolution: {integrity: sha512-t4ZwvV6vwNxzujDQ+37bspnLwA4JlgUPWhLjBJWsNIDceAf6ZKUTCjdm08cN6WeZ5pTMKiCJkmAYnpmR4Bm+dg==} - peerDependencies: - react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 - react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 - - react-element-to-jsx-string@15.0.0: - resolution: {integrity: sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==} - peerDependencies: - react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 - react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 - - react-error-boundary@6.0.0: - resolution: {integrity: sha512-gdlJjD7NWr0IfkPlaREN2d9uUZUlksrfOx7SX62VRerwXbMY6ftGCIZua1VG1aXFNOimhISsTq+Owp725b9SiA==} - peerDependencies: - react: '>=16.13.1' - - react-error-overlay@4.0.1: - resolution: {integrity: sha512-xXUbDAZkU08aAkjtUvldqbvI04ogv+a1XdHxvYuHPYKIVk/42BIOD0zSKTHAWV4+gDy3yGm283z2072rA2gdtw==} - - react-hook-form@7.56.3: - resolution: {integrity: sha512-IK18V6GVbab4TAo1/cz3kqajxbDPGofdF0w7VHdCo0Nt8PrPlOZcuuDq9YYIV1BtjcX78x0XsldbQRQnQXWXmw==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 || ^19 - - react-hook-form@7.56.4: - resolution: {integrity: sha512-Rob7Ftz2vyZ/ZGsQZPaRdIefkgOSrQSPXfqBdvOPwJfoGnjwRJUs7EM7Kc1mcoDv3NOtqBzPGbcMB8CGn9CKgw==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 || ^19 - - react-hot-loader@4.13.1: - resolution: {integrity: sha512-ZlqCfVRqDJmMXTulUGic4lN7Ic1SXgHAFw7y/Jb7t25GBgTR0fYAJ8uY4mrpxjRyWGWmqw77qJQGnYbzCvBU7g==} - engines: {node: '>= 6'} - peerDependencies: - '@types/react': ^15.0.0 || ^16.0.0 || ^17.0.0 - react: ^15.0.0 || ^16.0.0 || ^17.0.0 - react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-icons@4.12.0: - resolution: {integrity: sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==} - peerDependencies: - react: '*' - - react-immutable-proptypes@2.2.0: - resolution: {integrity: sha512-Vf4gBsePlwdGvSZoLSBfd4HAP93HDauMY4fDjXhreg/vg6F3Fj/MXDNyTbltPC/xZKmZc+cjLu3598DdYK6sgQ==} - peerDependencies: - immutable: '>=3.6.2' - - react-immutable-pure-component@2.2.2: - resolution: {integrity: sha512-vkgoMJUDqHZfXXnjVlG3keCxSO/U6WeDQ5/Sl0GK2cH8TOxEzQ5jXqDXHEL/jqk6fsNxV05oH5kD7VNMUE2k+A==} - peerDependencies: - immutable: '>= 2 || >= 4.0.0-rc' - react: '>= 16.6' - react-dom: '>= 16.6' - - react-inspector@5.1.1: - resolution: {integrity: sha512-GURDaYzoLbW8pMGXwYPDBIv6nqei4kK7LPRZ9q9HCZF54wqXz/dnylBp/kfE9XmekBhHvLDdcYeyIwSrvtOiWg==} - peerDependencies: - react: ^16.8.4 || ^17.0.0 - - react-inspector@6.0.2: - resolution: {integrity: sha512-x+b7LxhmHXjHoU/VrFAzw5iutsILRoYyDq97EDYdFpPLcvqtEzk4ZSZSQjnFPbr5T57tLXnHcqFYoN1pI6u8uQ==} - peerDependencies: - react: ^16.8.4 || ^17.0.0 || ^18.0.0 - - react-intl@7.1.11: - resolution: {integrity: sha512-tnVoRCWvW5Ie2ikYSdPF7z3+880yCe/9xPmitFeRPw3RYDcCfR4m8ZYa4MBq19W4adt9Z+PQA4FaMBCJ7E+HCQ==} - peerDependencies: - react: 16 || 17 || 18 || 19 - typescript: ^5.6.0 - peerDependenciesMeta: - typescript: - optional: true - - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - - react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - - react-is@18.1.0: - resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} - - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - - react-is@19.1.0: - resolution: {integrity: sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==} - - react-json-view-lite@2.4.1: - resolution: {integrity: sha512-fwFYknRIBxjbFm0kBDrzgBy1xa5tDg2LyXXBepC5f1b+MY3BUClMCsvanMPn089JbV1Eg3nZcrp0VCuH43aXnA==} - engines: {node: '>=18'} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - - react-json-view@1.21.3: - resolution: {integrity: sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==} - peerDependencies: - react: ^17.0.0 || ^16.3.0 || ^15.5.4 - react-dom: ^17.0.0 || ^16.3.0 || ^15.5.4 - - react-lifecycles-compat@3.0.4: - resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} - - react-lottie@1.2.10: - resolution: {integrity: sha512-x0eWX3Z6zSx1XM5QSjnLupc6D22LlMCB0PH06O/N/epR2hsLaj1Vxd9RtMnbbEHjJ/qlsgHJ6bpN3vnZI92hjw==} - peerDependencies: - react: '>=15.0.0' - - react-markdown@10.1.0: - resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} - peerDependencies: - '@types/react': '>=18' - react: '>=18' - - react-markdown@7.1.2: - resolution: {integrity: sha512-ibMcc0EbfmbwApqJD8AUr0yls8BSrKzIbHaUsPidQljxToCqFh34nwtu3CXNEItcVJNzpjDHrhK8A+MAh2JW3A==} - peerDependencies: - '@types/react': '>=16' - react: '>=16' - - react-monaco-editor@0.58.0: - resolution: {integrity: sha512-e8JH0TQEzO96Wd/EXgzc9M9tQK1pxBECD+8GNob9slMURcCM36TiVrgc4topWCDGYxRuMj8IEkaX+s3eQcUUqw==} - peerDependencies: - monaco-editor: ^0.52.0 - react: '>=16.8.0 <20.0.0' - react-dom: '>=16.8.0 <20.0.0' - - react-redux@9.2.0: - resolution: {integrity: sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==} - peerDependencies: - '@types/react': ^18.2.25 || ^19 - react: ^18.0 || ^19 - redux: ^5.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - redux: - optional: true - - react-refresh@0.11.0: - resolution: {integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==} - engines: {node: '>=0.10.0'} - - react-refresh@0.17.0: - resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} - engines: {node: '>=0.10.0'} - - react-remove-scroll-bar@2.3.8: - resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-remove-scroll@2.5.5: - resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-remove-scroll@2.7.1: - resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - react-scripts-ts@3.1.0: - resolution: {integrity: sha512-D5MobGSGswNH3e8RVa8M50jIsazNIqizO5qwWYqfo/tMYSvG0ENotzD3SYMUWYb1E5fIcM+D9a0XEJgo3VgtCQ==} - engines: {node: '>=6'} - hasBin: true - peerDependencies: - typescript: 3.x.x - - react-split-pane@0.1.92: - resolution: {integrity: sha512-GfXP1xSzLMcLJI5BM36Vh7GgZBpy+U/X0no+VM3fxayv+p1Jly5HpMofZJraeaMl73b3hvlr+N9zJKvLB/uz9w==} - peerDependencies: - react: ^16.0.0-0 - react-dom: ^16.0.0-0 - - react-style-proptype@3.2.2: - resolution: {integrity: sha512-ywYLSjNkxKHiZOqNlso9PZByNEY+FTyh3C+7uuziK0xFXu9xzdyfHwg4S9iyiRRoPCR4k2LqaBBsWVmSBwCWYQ==} - - react-style-singleton@2.2.3: - resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - react-syntax-highlighter@15.6.1: - resolution: {integrity: sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==} - peerDependencies: - react: '>= 0.14.0' - - react-test-renderer@19.1.0: - resolution: {integrity: sha512-jXkSl3CpvPYEF+p/eGDLB4sPoDX8pKkYvRl9+rR8HxLY0X04vW7hCm1/0zHoUSjPZ3bDa+wXWNTDVIw/R8aDVw==} - peerDependencies: - react: ^19.1.0 - - react-textarea-autosize@8.5.9: - resolution: {integrity: sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==} - engines: {node: '>=10'} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - react-zoom-pan-pinch@3.7.0: - resolution: {integrity: sha512-UmReVZ0TxlKzxSbYiAj+LeGRW8s8LraAFTXRAxzMYnNRgGPsxCudwZKVkjvGmjtx7SW/hZamt69NUmGf4xrkXA==} - engines: {node: '>=8', npm: '>=5'} - peerDependencies: - react: '*' - react-dom: '*' - - react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} - - react@19.1.0: - resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} - engines: {node: '>=0.10.0'} - - read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - - read-pkg-up@1.0.1: - resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} - engines: {node: '>=0.10.0'} - - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - - read-pkg-up@8.0.0: - resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==} - engines: {node: '>=12'} - - read-pkg@1.1.0: - resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} - engines: {node: '>=0.10.0'} - - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - - read-pkg@6.0.0: - resolution: {integrity: sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==} - engines: {node: '>=12'} - - read-pkg@8.1.0: - resolution: {integrity: sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==} - engines: {node: '>=16'} - - read@1.0.7: - resolution: {integrity: sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==} - engines: {node: '>=0.8'} - - readable-stream@1.0.34: - resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} - - readable-stream@1.1.14: - resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} - - readable-stream@2.0.6: - resolution: {integrity: sha512-TXcFfb63BQe1+ySzsHZI/5v1aJPCShfqvWJ64ayNImXMsN1Cd0YGk/wm8KB7/OeessgPc9QvS9Zou8QTkFzsLw==} - - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - readable-stream@4.7.0: - resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - readable-web-to-node-stream@3.0.4: - resolution: {integrity: sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==} - engines: {node: '>=8'} - - readdirp@2.2.1: - resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} - engines: {node: '>=0.10'} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} - - realpath-native@2.0.0: - resolution: {integrity: sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==} - engines: {node: '>=8'} - - recast@0.23.11: - resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} - engines: {node: '>= 4'} - - rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} - - rechoir@0.7.1: - resolution: {integrity: sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==} - engines: {node: '>= 0.10'} - - rechoir@0.8.0: - resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} - engines: {node: '>= 10.13.0'} - - recursive-readdir@2.2.1: - resolution: {integrity: sha512-BKWLxPZb4B07G/4LzyzsHaw24fC41/tL7LrECr1//X9ykRhmxlYgyl7G7X+6A7nvJyOGE/ED7refqmSGORVYqQ==} - engines: {node: '>=0.10.0'} - - redent@1.0.0: - resolution: {integrity: sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==} - engines: {node: '>=0.10.0'} - - redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - - redent@4.0.0: - resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} - engines: {node: '>=12'} - - reduce-css-calc@1.3.0: - resolution: {integrity: sha512-0dVfwYVOlf/LBA2ec4OwQ6p3X9mYxn/wOl2xTcLwjnPYrkgEfPx3VI4eGCH3rQLlPISG5v9I9bkZosKsNRTRKA==} - - reduce-function-call@1.0.3: - resolution: {integrity: sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==} - - redux-immutable@4.0.0: - resolution: {integrity: sha512-SchSn/DWfGb3oAejd+1hhHx01xUoxY+V7TeK0BKqpkLKiQPVFf7DYzEaKmrEVxsWxielKfSK9/Xq66YyxgR1cg==} - peerDependencies: - immutable: ^3.8.1 || ^4.0.0-rc.1 - - redux@4.2.1: - resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} - - redux@5.0.1: - resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} - - reflect-metadata@0.1.14: - resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} - - reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} - - refractor@3.6.0: - resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} - - regenerate-unicode-properties@10.2.0: - resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} - engines: {node: '>=4'} - - regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - - regenerator-runtime@0.11.1: - resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} - - regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - - regenerator-transform@0.10.1: - resolution: {integrity: sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==} - - regexp.prototype.flags@1.5.4: - 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'} - - regexpu-core@2.0.0: - resolution: {integrity: sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ==} - - regexpu-core@6.2.0: - resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} - engines: {node: '>=4'} - - registry-auth-token@3.4.0: - resolution: {integrity: sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==} - - registry-url@3.1.0: - resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} - engines: {node: '>=0.10.0'} - - regjsgen@0.2.0: - resolution: {integrity: sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g==} - - regjsgen@0.8.0: - resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - - regjsparser@0.1.5: - resolution: {integrity: sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw==} - hasBin: true - - regjsparser@0.12.0: - resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} - hasBin: true - - rehype-raw@6.1.1: - resolution: {integrity: sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==} - - rehype-raw@7.0.0: - resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} - - relateurl@0.2.7: - resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} - engines: {node: '>= 0.10'} - - remap-istanbul@0.13.0: - resolution: {integrity: sha512-rS5ZpVAx3fGtKZkiBe1esXg5mKYbgW9iz8kkADFt3p6lo3NsBBUX1q6SwdhwUtYCGnr7nK6gRlbYK3i8R0jbRA==} - hasBin: true - - remark-breaks@4.0.0: - resolution: {integrity: sha512-IjEjJOkH4FuJvHZVIW0QCDWxcG96kCq7An/KVH2NfJe6rKZU2AsHeB3OEjPNRxi4QC34Xdx7I2KGYn6IpT7gxQ==} - - remark-external-links@8.0.0: - resolution: {integrity: sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==} - - remark-footnotes@2.0.0: - resolution: {integrity: sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==} - - remark-gfm@4.0.1: - resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} - - remark-mdx@1.6.22: - resolution: {integrity: sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==} - - remark-parse@10.0.2: - resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} - - remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} - - remark-parse@8.0.3: - resolution: {integrity: sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==} - - remark-rehype@11.1.2: - resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} - - remark-rehype@9.1.0: - resolution: {integrity: sha512-oLa6YmgAYg19zb0ZrBACh40hpBLteYROaPLhBXzLgjqyHQrN+gVP9N/FJvfzuNNuzCutktkroXEZBrxAxKhh7Q==} - - remark-slug@6.1.0: - resolution: {integrity: sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==} - - remark-squeeze-paragraphs@4.0.0: - resolution: {integrity: sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==} - - remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - - remarkable@2.0.1: - resolution: {integrity: sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==} - engines: {node: '>= 6.0.0'} - hasBin: true - - remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - - renderkid@2.0.7: - resolution: {integrity: sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==} - - renderkid@3.0.0: - resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} - - repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - - repeating@2.0.1: - resolution: {integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==} - engines: {node: '>=0.10.0'} - - request-promise-core@1.1.4: - resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} - engines: {node: '>=0.10.0'} - peerDependencies: - request: ^2.34 - - request-promise-native@1.0.9: - resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==} - engines: {node: '>=0.12.0'} - deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 - peerDependencies: - request: ^2.34 - - request@2.88.2: - resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} - engines: {node: '>= 6'} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - require-from-string@1.2.1: - resolution: {integrity: sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==} - engines: {node: '>=0.10.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - require-main-filename@1.0.1: - resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} - - require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - - reselect@5.1.1: - resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} - - resize-observer-polyfill@1.5.1: - resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} - - resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - - resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - - resolve-dir@1.0.1: - resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} - engines: {node: '>=0.10.0'} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - - resolve.exports@2.0.3: - resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} - engines: {node: '>=10'} - - resolve@1.1.7: - resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} - - resolve@1.17.0: - resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} - - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} - engines: {node: '>= 0.4'} - hasBin: true - - resolve@1.6.0: - resolution: {integrity: sha512-mw7JQNu5ExIkcw4LPih0owX/TZXjD/ZUF/ZQ/pDnkw3ZKhDcZZw5klmBlj6gVMwjQ3Pz5Jgu7F3d0jcDVuEWdw==} - - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true - - responselike@3.0.0: - resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} - engines: {node: '>=14.16'} - - restore-cursor@2.0.0: - resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} - engines: {node: '>=4'} - - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - - restore-cursor@5.1.0: - resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} - engines: {node: '>=18'} - - ret@0.2.2: - resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} - engines: {node: '>=4'} - - retry@0.10.1: - resolution: {integrity: sha512-ZXUSQYTHdl3uS7IuCehYfMzKyIDBNoAuUblvy5oGO5UJSUTmStUUVPXbA9Qxd173Bgre53yCQczQuHgRWAdvJQ==} - - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - - retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rev-hash@3.0.0: - resolution: {integrity: sha512-s+87HfEKAu95TaTxnbCobn0/BkbzR23LHSwVdYvr8mn5+PPjzy+hTWyh92b5oaLgig9TKPe5d6ZcubsVBtUrZg==} - engines: {node: '>=8'} - - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - - rimraf@2.6.3: - resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rimraf@6.0.1: - resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} - engines: {node: 20 || >=22} - hasBin: true - - rollup-plugin-import-css@3.5.8: - resolution: {integrity: sha512-a3YsZnwHz66mRHCKHjaPCSfWczczvS/HTkgDc+Eogn0mt/0JZXz0WjK0fzM5WwBpVtOqHB4/gHdmEY40ILsaVg==} - engines: {node: '>=16'} - peerDependencies: - rollup: ^2.x.x || ^3.x.x || ^4.x.x - - rollup-plugin-peer-deps-external@2.2.4: - resolution: {integrity: sha512-AWdukIM1+k5JDdAqV/Cxd+nejvno2FVLVeZ74NKggm3Q5s9cbbcOgUPGdbxPi4BXu7xGaZ8HG12F+thImYu/0g==} - peerDependencies: - rollup: '*' - - rollup-plugin-postcss@4.0.2: - resolution: {integrity: sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==} - engines: {node: '>=10'} - peerDependencies: - postcss: 8.x - - rollup-plugin-scss@4.0.1: - resolution: {integrity: sha512-3W3+3OzR+shkDl3hJ1XTAuGkP4AfiLgIjie2GtcoZ9pHfRiNqeDbtCu1EUnkjZ98EPIM6nnMIXkKlc7Sx5bRvA==} - - rollup-plugin-sourcemaps@0.6.3: - resolution: {integrity: sha512-paFu+nT1xvuO1tPFYXGe+XnQvg4Hjqv/eIhG8i5EspfYYPBKL57X7iVbfv55aNVASg3dzWvES9dmWsL2KhfByw==} - engines: {node: '>=10.0.0'} - peerDependencies: - '@types/node': '>=10.0.0' - rollup: '>=0.31.2' - peerDependenciesMeta: - '@types/node': - optional: true - - rollup-plugin-svg@2.0.0: - resolution: {integrity: sha512-DmE7dSQHo1SC5L2uH2qul3Mjyd5oV6U1aVVkyvTLX/mUsRink7f1b1zaIm+32GEBA6EHu8H/JJi3DdWqM53ySQ==} - - rollup-plugin-terser@5.3.1: - resolution: {integrity: sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==} - deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser - peerDependencies: - rollup: '>=0.66.0 <3' - - rollup-plugin-typescript2@0.27.3: - resolution: {integrity: sha512-gmYPIFmALj9D3Ga1ZbTZAKTXq1JKlTQBtj299DXhqYz9cL3g/AQfUvbb2UhH+Nf++cCq941W2Mv7UcrcgLzJJg==} - peerDependencies: - rollup: '>=1.26.3' - typescript: '>=2.4.0' - - rollup-plugin-typescript2@0.36.0: - resolution: {integrity: sha512-NB2CSQDxSe9+Oe2ahZbf+B4bh7pHwjV5L+RSYpCu7Q5ROuN94F9b6ioWwKfz3ueL3KTtmX4o2MUH2cgHDIEUsw==} - peerDependencies: - rollup: '>=1.26.3' - typescript: '>=2.4.0' - - rollup-pluginutils@1.5.2: - resolution: {integrity: sha512-SjdWWWO/CUoMpDy8RUbZ/pSpG68YHmhk5ROKNIoi2En9bJ8bTt3IhYi254RWiTclQmL7Awmrq+rZFOhZkJAHmQ==} - - rollup-pluginutils@2.8.2: - resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} - - rollup@1.32.1: - resolution: {integrity: sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==} - hasBin: true - - rollup@4.44.0: - resolution: {integrity: sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} - - rsvp@4.8.5: - resolution: {integrity: sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==} - engines: {node: 6.* || >= 7.*} - - run-applescript@7.0.0: - resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} - engines: {node: '>=18'} - - run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - run-queue@1.0.3: - resolution: {integrity: sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==} - - rx-lite-aggregates@4.0.8: - resolution: {integrity: sha512-3xPNZGW93oCjiO7PtKxRK6iOVYBWBvtf9QHDfU23Oc+dLIQmAV//UnyXV/yihv81VS/UqoQPk4NegS8EFi55Hg==} - - 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'} - - sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} - - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} - - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safe-identifier@0.4.2: - resolution: {integrity: sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==} - - safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} - - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - - safe-stable-stringify@2.5.0: - resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} - engines: {node: '>=10'} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - sane@1.6.0: - resolution: {integrity: sha512-r9zOMa72GMYfOja8DZvDrKQjKE7vxQD2AHFVV/cg05JmAhKoumAjrW/0QbKw6kGebgcG6HV/3u+EI8ZqrAPT3Q==} - engines: {node: '>=0.6.0'} - deprecated: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added - hasBin: true - - sane@4.1.0: - resolution: {integrity: sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==} - engines: {node: 6.* || 8.* || >= 10.*} - deprecated: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added - hasBin: true - - sanitize-filename@1.6.3: - resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} - - sass-graph@4.0.1: - resolution: {integrity: sha512-5YCfmGBmxoIRYHnKK2AKzrAkCoQ8ozO+iumT8K4tXJXRVCPf+7s1/9KxTSW3Rbvf+7Y7b4FR3mWyLnQr3PHocA==} - engines: {node: '>=12'} - hasBin: true - - sass-loader@16.0.5: - resolution: {integrity: sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==} - engines: {node: '>= 18.12.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 - sass: ^1.3.0 - sass-embedded: '*' - webpack: ^5.94.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - node-sass: - optional: true - sass: - optional: true - sass-embedded: - optional: true - webpack: - optional: true - - sass@1.89.2: - resolution: {integrity: sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==} - engines: {node: '>=14.0.0'} - hasBin: true - - sax@1.2.4: - resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - - saxes@3.1.11: - resolution: {integrity: sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==} - engines: {node: '>=8'} - - saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - - scheduler@0.26.0: - resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} - - schema-utils@0.3.0: - resolution: {integrity: sha512-QaVYBaD9U8scJw2EBWnCBY+LJ0AD+/2edTaigDs0XLDLBfJmSUK9KGqktg1rb32U3z4j/XwvFwHHH1YfbYFd7Q==} - engines: {node: '>= 4.3 < 5.0.0 || >= 5.10'} - - schema-utils@0.4.7: - resolution: {integrity: sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==} - engines: {node: '>= 4'} - - schema-utils@2.7.0: - resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} - engines: {node: '>= 8.9.0'} - - schema-utils@2.7.1: - resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} - engines: {node: '>= 8.9.0'} - - schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - - schema-utils@4.3.2: - resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} - engines: {node: '>= 10.13.0'} - - scss-tokenizer@0.4.3: - resolution: {integrity: sha512-raKLgf1LI5QMQnG+RxHz6oK0sL3x3I4FN2UDLqgLOGO8hodECNnNh5BXn7fAyBxrA8zVzdQizQ6XjNJQ+uBwMw==} - - secretlint@9.3.4: - resolution: {integrity: sha512-iNOzgMX/+W1SQNW/TW6eikGChyaPiazr2AEXjzjpoB0R6QJEulvlwhn0KLT1/xjPfdYrk3yiXZM40csUqET8uQ==} - engines: {node: ^14.13.1 || >=16.0.0} - hasBin: true - - secure-compare@3.0.1: - resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} - - select-hose@2.0.0: - resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - - selenium-webdriver@4.33.0: - resolution: {integrity: sha512-5vRhk4iI0B9nYbEitfnCjPDXBfG6o9DNhj5DG2355eQo8idETknhj1tigqqlkHsGephSZwLZqEm/d+3e1stGUA==} - engines: {node: '>= 18.20.5'} - - selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} - - semver-diff@2.1.0: - resolution: {integrity: sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==} - engines: {node: '>=0.10.0'} - - semver@5.3.0: - resolution: {integrity: sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw==} - hasBin: true - - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} - hasBin: true - - send@0.19.0: - resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} - engines: {node: '>= 0.8.0'} - - send@1.2.0: - resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} - engines: {node: '>= 18'} - - serialize-error@8.1.0: - resolution: {integrity: sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==} - engines: {node: '>=10'} - - serialize-javascript@1.9.1: - resolution: {integrity: sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==} - - serialize-javascript@4.0.0: - resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} - - serialize-javascript@5.0.1: - resolution: {integrity: sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==} - - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - - serve-favicon@2.5.1: - resolution: {integrity: sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==} - engines: {node: '>= 0.8.0'} - - serve-index@1.9.1: - resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} - engines: {node: '>= 0.8.0'} - - serve-static@1.16.2: - resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} - engines: {node: '>= 0.8.0'} - - serve-static@2.2.0: - resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} - engines: {node: '>= 18'} - - serviceworker-cache-polyfill@4.0.0: - resolution: {integrity: sha512-VMl1n99TbtKdO7DYNX0J9FQt1doo69V6fBniKC7o+CoJerbmFlQbsoxDa7P+b4b0tmpsdRIuzzS9sSJI7vFY2g==} - - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} - - set-value@4.1.0: - resolution: {integrity: sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==} - engines: {node: '>=11.0'} - - 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==} - - sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true - - shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - - shallowequal@1.1.0: - resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - shell-exec@1.0.2: - resolution: {integrity: sha512-jyVd+kU2X+mWKMmGhx4fpWbPsjvD53k9ivqetutVW/BQ+WIZoDoP4d8vUMGezV6saZsiNoW2f9GIhg9Dondohg==} - - shell-quote@1.6.1: - resolution: {integrity: sha512-V0iQEZ/uoem3NmD91rD8XiuozJnq9/ZJnbHVXHnWqP1ucAhS3yJ7sLIIzEi57wFFcK3oi3kFUC46uSyWr35mxg==} - - shell-quote@1.8.3: - resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} - engines: {node: '>= 0.4'} - - shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true - - shellwords@0.1.1: - resolution: {integrity: sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==} - - shimmer@1.2.1: - resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} - - short-unique-id@5.3.2: - resolution: {integrity: sha512-KRT/hufMSxXKEDSQujfVE0Faa/kZ51ihUcZQAcmP04t00DvPj7Ox5anHke1sJYUtzSuiT/Y5uyzg/W7bBEGhCg==} - hasBin: true - - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - - simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - - size-limit@11.2.0: - resolution: {integrity: sha512-2kpQq2DD/pRpx3Tal/qRW1SYwcIeQ0iq8li5CJHQgOC+FtPn2BVmuDtzUCgNnpCrbgtfEHqh+iWzxK+Tq6C+RQ==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - - slash@1.0.0: - resolution: {integrity: sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==} - engines: {node: '>=0.10.0'} - - slash@2.0.0: - resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} - engines: {node: '>=6'} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - - slash@5.1.0: - 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'} - - slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} - - slice-ansi@7.1.0: - resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} - engines: {node: '>=18'} - - slugify@1.6.6: - resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==} - engines: {node: '>=8.0.0'} - - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - - sockjs-client@1.1.5: - resolution: {integrity: sha512-PmPRkAYIeuRgX+ZSieViT4Z3Q23bLS2Itm/ck1tSf5P0/yVuFDiI5q9mcnpXoMdToaPSRS9MEyUx/aaBxrFzyw==} - - sockjs@0.3.24: - resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} - - socks-proxy-agent@6.2.1: - resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} - engines: {node: '>= 10'} - - socks-proxy-agent@7.0.0: - resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} - engines: {node: '>= 10'} - - socks@2.8.5: - resolution: {integrity: sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - - sort-keys@1.1.2: - resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} - engines: {node: '>=0.10.0'} - - sorted-array-functions@1.3.0: - resolution: {integrity: sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==} - - source-list-map@2.0.1: - resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - source-map-loader@0.2.4: - resolution: {integrity: sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==} - engines: {node: '>= 6'} - - source-map-loader@5.0.0: - resolution: {integrity: sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==} - engines: {node: '>= 18.12.0'} - peerDependencies: - webpack: ^5.94.0 - - source-map-resolve@0.6.0: - resolution: {integrity: sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==} - deprecated: See https://github.com/lydell/source-map-resolve#deprecated - - source-map-support@0.4.18: - resolution: {integrity: sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==} - - source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.2.0: - resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} - engines: {node: '>=0.8.0'} - - source-map@0.5.6: - resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==} - engines: {node: '>=0.10.0'} - - source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - - sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - - space-separated-tokens@1.1.5: - resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} - - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.21: - resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} - - spdy-transport@3.0.0: - resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} - - spdy@4.0.2: - resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} - engines: {node: '>=6.0.0'} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - - sshpk@1.18.0: - resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} - engines: {node: '>=0.10.0'} - hasBin: true - - ssri@5.3.0: - resolution: {integrity: sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==} - - ssri@8.0.1: - resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} - engines: {node: '>= 8'} - - ssri@9.0.1: - resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - stable@0.1.8: - resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} - deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' - - stack-chain@1.3.7: - resolution: {integrity: sha512-D8cWtWVdIe/jBA7v5p5Hwl5yOSOrmZPWDPe2KxQ5UAGD+nxbxU0lKXA4h85Ta6+qgdKVL3vUxsbIZjc1kBG7ug==} - - stack-generator@2.0.10: - resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} - - stack-trace@0.0.10: - resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} - - stack-utils@1.0.5: - resolution: {integrity: sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==} - engines: {node: '>=8'} - - stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - - stackframe@1.3.4: - resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} - - stacktrace-gps@3.1.2: - resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} - - stacktrace-js@2.0.2: - resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} - - state-local@1.0.7: - resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} - - state-toggle@1.0.3: - resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==} - - statuses@1.5.0: - 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'} - - stdin-discarder@0.2.2: - resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} - engines: {node: '>=18'} - - stdout-stream@1.4.1: - resolution: {integrity: sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==} - - stealthy-require@1.1.1: - resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} - engines: {node: '>=0.10.0'} - - stop-iteration-iterator@1.1.0: - resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} - engines: {node: '>= 0.4'} - - store2@2.14.4: - resolution: {integrity: sha512-srTItn1GOvyvOycgxjAnPA63FZNwy0PTyUBFMHRM+hVFltAeoh0LmNBz9SZqUS9mMqGk8rfyWyXn3GH5ReJ8Zw==} - - storybook@8.6.14: - resolution: {integrity: sha512-sVKbCj/OTx67jhmauhxc2dcr1P+yOgz/x3h0krwjyMgdc5Oubvxyg4NYDZmzAw+ym36g/lzH8N0Ccp4dwtdfxw==} - hasBin: true - peerDependencies: - prettier: ^2 || ^3 - peerDependenciesMeta: - prettier: - optional: true - - storybook@9.0.12: - resolution: {integrity: sha512-mpACe6BMd/M5sqcOiA8NmWIm2zdx0t4ujnA4NTcq4aErdK/KKuU255UM4pO3DIf5zWR5VrDfNV5UaMi/VgE2mA==} - hasBin: true - peerDependencies: - prettier: ^2 || ^3 - peerDependenciesMeta: - prettier: - optional: true - - storybook@9.0.17: - resolution: {integrity: sha512-O+9jgJ+Trlq9VGD1uY4OBLKQWHHDKM/A/pA8vMW6PVehhGHNvpzcIC1bngr6mL5gGHZP2nBv+9XG8pTMcggMmg==} - hasBin: true - peerDependencies: - prettier: ^2 || ^3 - peerDependenciesMeta: - prettier: - optional: true - - stream-each@1.2.3: - resolution: {integrity: sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==} - - stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - - streamroller@3.1.5: - resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} - engines: {node: '>=8.0'} - - strict-uri-encode@1.1.0: - resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} - engines: {node: '>=0.10.0'} - - string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - - string-hash@1.1.3: - resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==} - - string-length@1.0.1: - resolution: {integrity: sha512-MNCACnufWUf3pQ57O5WTBMkKhzYIaKEcUioO0XHrTMafrbBaNk4IyDOLHBv5xbXO0jLLdsYWeFjpjG2hVHRDtw==} - engines: {node: '>=0.10.0'} - - string-length@3.1.0: - resolution: {integrity: sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==} - engines: {node: '>=8'} - - string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - - string-width@1.0.2: - resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} - engines: {node: '>=0.10.0'} - - string-width@2.1.1: - 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'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} - - string.fromcodepoint@0.2.1: - resolution: {integrity: sha512-n69H31OnxSGSZyZbgBlvYIXlrMhJQ0dQAX1js1QDhpaUH6zmU3QYlj07bCwCNlPOu3oRXIubGPl2gDGnHsiCqg==} - - string.prototype.codepointat@0.2.1: - resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} - - string.prototype.includes@2.0.1: - resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} - engines: {node: '>= 0.4'} - - string.prototype.matchall@4.0.12: - resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} - engines: {node: '>= 0.4'} - - string.prototype.padend@3.1.6: - resolution: {integrity: sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==} - engines: {node: '>= 0.4'} - - string.prototype.padstart@3.1.7: - resolution: {integrity: sha512-hc5ZFzw8H2Bl4AeHxE5s+CniFg+bPcr7lRRS189GCM6KhJQBACNRhtMsdcnpBNbjc1XisnUOqbP0c94RZU4GCw==} - engines: {node: '>= 0.4'} - - string.prototype.repeat@1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - - string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - - strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} - - strip-ansi@4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} - - strip-ansi@5.2.0: - resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} - engines: {node: '>=6'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - - strip-bom@2.0.0: - resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} - engines: {node: '>=0.10.0'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - - strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - - strip-indent@1.0.1: - resolution: {integrity: sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==} - engines: {node: '>=0.10.0'} - hasBin: true - - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - - strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} - engines: {node: '>=12'} - - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - strip-outer@1.0.1: - resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} - engines: {node: '>=0.10.0'} - - strnum@1.1.2: - resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} - - strnum@2.1.1: - resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} - - strtok3@7.1.1: - resolution: {integrity: sha512-mKX8HA/cdBqMKUr0MMZAFssCkIGoZeSCMXgnt79yKxNFguMLVFgRe6wB+fsL0NmoHDbeyZXczy7vEPSoo3rkzg==} - engines: {node: '>=16'} - - structured-source@4.0.0: - resolution: {integrity: sha512-qGzRFNJDjFieQkl/sVOI2dUjHKRyL9dAJi2gCPGJLbJHBIkyOHxjuocpIEfbLioX+qSJpvbYdT49/YCdMznKxA==} - - style-inject@0.3.0: - resolution: {integrity: sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==} - - style-loader@0.19.0: - resolution: {integrity: sha512-9mx9sC9nX1dgP96MZOODpGC6l1RzQBITI2D5WJhu+wnbrSYVKLGuy14XJSLVQih/0GFrPpjelt+s//VcZQ2Evw==} - engines: {node: '>= 0.12.0'} - - style-loader@1.3.0: - resolution: {integrity: sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q==} - engines: {node: '>= 8.9.0'} - peerDependencies: - webpack: ^5.94.0 - - style-loader@2.0.0: - resolution: {integrity: sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^5.94.0 - - style-loader@3.3.4: - resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.94.0 - - style-loader@4.0.0: - resolution: {integrity: sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==} - engines: {node: '>= 18.12.0'} - peerDependencies: - webpack: ^5.94.0 - - style-mod@4.1.2: - resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} - - style-to-js@1.1.17: - resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} - - style-to-object@0.3.0: - resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} - - style-to-object@1.0.9: - resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} - - style-value-types@5.0.0: - resolution: {integrity: sha512-08yq36Ikn4kx4YU6RD7jWEv27v4V+PUsOGa4n/as8Et3CuODMJQ00ENeAVXAeydX4Z2j1XHZF1K2sX4mGl18fA==} - - stylehacks@5.1.1: - resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - - stylelint-config-recommended@16.0.0: - resolution: {integrity: sha512-4RSmPjQegF34wNcK1e1O3Uz91HN8P1aFdFzio90wNK9mjgAI19u5vsU868cVZboKzCaa5XbpvtTzAAGQAxpcXA==} - engines: {node: '>=18.12.0'} - peerDependencies: - stylelint: ^16.16.0 - - stylelint-config-standard@38.0.0: - resolution: {integrity: sha512-uj3JIX+dpFseqd/DJx8Gy3PcRAJhlEZ2IrlFOc4LUxBX/PNMEQ198x7LCOE2Q5oT9Vw8nyc4CIL78xSqPr6iag==} - engines: {node: '>=18.12.0'} - peerDependencies: - stylelint: ^16.18.0 - - stylelint@16.21.0: - resolution: {integrity: sha512-ki3PpJGG7xhm3WtINoWGnlvqAmbqSexoRMbEMJzlwewSIOqPRKPlq452c22xAdEJISVi80r+I7KL9GPUiwFgbg==} - engines: {node: '>=18.12.0'} - hasBin: true - - stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - - subarg@1.0.0: - resolution: {integrity: sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==} - - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - - supports-color@2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - - supports-color@3.2.3: - resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} - engines: {node: '>=0.8.0'} - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@6.1.0: - resolution: {integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==} - engines: {node: '>=6'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} - - supports-hyperlinks@3.2.0: - resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} - engines: {node: '>=14.18'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - svg-pathdata@1.0.4: - resolution: {integrity: sha512-afGVCE1xFbmI/uV6XiToTwnHZZtSiW9u8EBxZqRE25pPGk2Z9eEvT5nhAPRUnvUWs9FqwjdJeElkqoWKeW3JGA==} - engines: {node: '>= 0.10.0'} - - svg-pathdata@6.0.3: - resolution: {integrity: sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==} - engines: {node: '>=12.0.0'} - - svg-tags@1.0.0: - resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} - - svg-url-loader@8.0.0: - resolution: {integrity: sha512-5doSXvl18hY1fGsRLdhWAU5jgzgxJ06/gc/26cpuDnN0xOz1HmmfhkpL29SSrdIvhtxQ1UwGzmk7wTT/l48mKw==} - engines: {node: '>=14'} - peerDependencies: - webpack: ^5.94.0 - - svg2ttf@4.3.0: - resolution: {integrity: sha512-LZ0B7zzHWLWbzLzwaKGHQvPOuxCXLReIb3LSxFSGUy1gMw2Utk6KGNbTmbmRL6Rk1qDSmTixnDrQgnXaL9n0CA==} - hasBin: true - - svg2ttf@6.0.3: - resolution: {integrity: sha512-CgqMyZrbOPpc+WqH7aga4JWkDPso23EgypLsbQ6gN3uoPWwwiLjXvzgrwGADBExvCRJrWFzAeK1bSoSpE7ixSQ==} - hasBin: true - - svgicons2svgfont@12.0.0: - resolution: {integrity: sha512-fjyDkhiG0M1TPBtZzD12QV3yDcG2fUgiqHPOCYzf7hHE40Hl3GhnE6P1njsJCCByhwM7MiufyDW3L7IOR5dg9w==} - engines: {node: '>=16.15.0'} - hasBin: true - - svgicons2svgfont@5.0.2: - resolution: {integrity: sha512-N9GG8atI7eKksJpLLDYXHzKcNy698FL+Bdu0sXgwURgVzNmeD35iSCnZhNuPMs4Ve2tg8vqHXI1ZNEWU6vhwjw==} - engines: {node: '>= 0.10.0'} - hasBin: true - - svgo@0.7.2: - resolution: {integrity: sha512-jT/g9FFMoe9lu2IT6HtAxTA7RR2XOrmcrmCtGnyB/+GQnV6ZjNn+KOHZbZ35yL81+1F/aB6OeEsJztzBQ2EEwA==} - engines: {node: '>=0.10.0'} - deprecated: This SVGO version is no longer supported. Upgrade to v2.x.x. - hasBin: true - - svgo@2.8.0: - resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} - engines: {node: '>=10.13.0'} - hasBin: true - - svgpath@2.6.0: - resolution: {integrity: sha512-OIWR6bKzXvdXYyO4DK/UWa1VA1JeKq8E+0ug2DG98Y/vOmMpfZNj+TIG988HjfYSqtcy/hFOtZq/n/j5GSESNg==} - - sw-precache-webpack-plugin@0.11.4: - resolution: {integrity: sha512-czvYwc8cy3K2F62PYuuja1p5NTqI3suFuUy8fDhcgS9cV5gO8jDlewQhhyUctcsA2T1Nb39W16nzSx8RwqkAvQ==} - engines: {node: '>=4.0.0'} - peerDependencies: - webpack: ^5.94.0 - - sw-precache@5.2.1: - resolution: {integrity: sha512-8FAy+BP/FXE+ILfiVTt+GQJ6UEf4CVHD9OfhzH0JX+3zoy2uFk7Vn9EfXASOtVmmIVbL3jE/W8Z66VgPSZcMhw==} - engines: {node: '>=4.0.0'} - deprecated: 'Please migrate to Workbox: https://developers.google.com/web/tools/workbox/guides/migrations/migrate-from-sw' - hasBin: true - - sw-toolbox@3.6.0: - 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.35.5: - resolution: {integrity: sha512-ayCrpDAgm5jIdq1kmcVWJRfp27cqU9tSRiAfKg3BKeplOmvu3+lKTPPtz4x1uI8v5l5/92Aopvq0EzRkXEr7Rw==} - - swagger-ui-react@5.21.0: - resolution: {integrity: sha512-lS5paITM1kkcBb/BTTSMHKelh8elHfcuUP4T3R3mO80tDR0AYJL2HR5UdQD6nV1LwdvekzRM8gKjJA6hVayi0A==} - peerDependencies: - react: '>=16.8.0 <19' - react-dom: '>=16.8.0 <19' - - swagger-ui-react@5.25.2: - resolution: {integrity: sha512-derGtL7NKvF0w4XIULgiWmS1y3EMEVQAJwLVLTAzVo6/ilLhwP9HCz2yjkVVHzK58gvOzrhO3DKk/Effpr5LJw==} - peerDependencies: - react: '>=16.8.0 <19' - react-dom: '>=16.8.0 <19' - - swc-loader@0.2.6: - resolution: {integrity: sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==} - peerDependencies: - '@swc/core': ^1.2.147 - webpack: ^5.94.0 - - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - - symbol.prototype.description@1.0.7: - resolution: {integrity: sha512-HHGLabwmDRorfrwBGt3dD6iakQ1gNxbNK1jRb3rvr8XVsHmbAzaMdZGJtzL2W8IXdwfm3GEdw27qG86CWpuqOQ==} - engines: {node: '>= 0.4'} - - synchronous-promise@2.0.17: - resolution: {integrity: sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==} - - system-architecture@0.1.0: - resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} - engines: {node: '>=18'} - - tabbable@5.3.3: - resolution: {integrity: sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==} - - tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - - table@5.4.6: - resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==} - engines: {node: '>=6.0.0'} - - table@6.9.0: - resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} - engines: {node: '>=10.0.0'} - - tailwindcss@3.4.17: - resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} - engines: {node: '>=14.0.0'} - hasBin: true - - tailwindcss@4.1.10: - resolution: {integrity: sha512-P3nr6WkvKV/ONsTzj6Gb57sWPMX29EPNPopo7+FcpkQaNsrNpZ1pv8QmrYI2RqEKD7mlGqLnGovlcYnBK0IqUA==} - - tapable@0.2.9: - resolution: {integrity: sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==} - engines: {node: '>=0.6'} - - tapable@1.1.3: - resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} - engines: {node: '>=6'} - - tapable@2.2.2: - resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} - engines: {node: '>=6'} - - tar-fs@1.16.5: - resolution: {integrity: sha512-1ergVCCysmwHQNrOS+Pjm4DQ4nrGp43+Xnu4MRGjCnQu/m3hEgLNS78d5z+B8OJ1hN5EejJdCSFZE1oM6AQXAQ==} - - tar-fs@2.1.3: - resolution: {integrity: sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==} - - tar-stream@1.6.2: - resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} - engines: {node: '>= 0.8.0'} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - - 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. - - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - - targz@1.0.1: - resolution: {integrity: sha512-6q4tP9U55mZnRuMTBqnqc3nwYQY3kv+QthCFZuMk+Tn1qYUnMPmL/JZ/mzgXINzFpSqfU+242IFmFU9VPvqaQw==} - - tcp-port-used@1.0.2: - resolution: {integrity: sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==} - - telejson@6.0.8: - resolution: {integrity: sha512-nerNXi+j8NK1QEfBHtZUN/aLdDcyupA//9kAboYLrtzZlPLpUfqbVGWb9zz91f/mIjRbAYhbgtnJHY8I1b5MBg==} - - telejson@7.2.0: - resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==} - - temp-dir@2.0.0: - resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} - engines: {node: '>=8'} - - temp@0.8.4: - resolution: {integrity: sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==} - engines: {node: '>=6.0.0'} - - tempy@1.0.1: - resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} - engines: {node: '>=10'} - - term-size@1.2.0: - resolution: {integrity: sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==} - engines: {node: '>=4'} - - terminal-link@2.1.1: - resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} - engines: {node: '>=8'} - - terser-webpack-plugin@4.2.3: - resolution: {integrity: sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^5.94.0 - - terser-webpack-plugin@5.3.14: - resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.94.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - - terser@4.8.1: - resolution: {integrity: sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==} - engines: {node: '>=6.0.0'} - hasBin: true - - terser@5.43.1: - resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} - engines: {node: '>=10'} - hasBin: true - - test-exclude@4.2.3: - resolution: {integrity: sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==} - - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - - test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} - - text-hex@1.0.0: - resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - textextensions@6.11.0: - resolution: {integrity: sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==} - engines: {node: '>=4'} - - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - - thingies@1.21.0: - resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} - engines: {node: '>=10.18'} - peerDependencies: - tslib: ^2 - - throat@3.2.0: - resolution: {integrity: sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==} - - throat@5.0.0: - resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} - - through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - - through2@3.0.0: - resolution: {integrity: sha512-8B+sevlqP4OiCjonI1Zw03Sf8PuV1eRsYQgLad5eonILOdyeRsY27A/2Ze8IlvlMvq31OH+3fz/styI7Ya62yQ==} - - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - thunky@1.1.0: - resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - - timed-out@4.0.1: - 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'} - hasBin: true - - tiny-case@1.0.3: - resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} - - tiny-glob@0.2.9: - resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} - - tiny-invariant@1.3.3: - resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} - engines: {node: '>=12.0.0'} - - tinyrainbow@1.2.0: - resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} - engines: {node: '>=14.0.0'} - - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} - engines: {node: '>=14.0.0'} - - tinyspy@4.0.3: - resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} - engines: {node: '>=14.0.0'} - - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - - tmp@0.2.3: - resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} - engines: {node: '>=14.14'} - - tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - - to-buffer@1.2.1: - resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} - engines: {node: '>= 0.4'} - - to-fast-properties@1.0.3: - resolution: {integrity: sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==} - engines: {node: '>=0.10.0'} - - to-json-schema@0.2.5: - resolution: {integrity: sha512-jP1ievOee8pec3tV9ncxLSS48Bnw7DIybgy112rhMCEhf3K4uyVNZZHr03iQQBzbV5v5Hos+dlZRRyk6YSMNDw==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - tocbot@4.36.4: - resolution: {integrity: sha512-ffznkKnZ1NdghwR1y8hN6W7kjn4FwcXq32Z1mn35gA7jd8dt2cTVAwL3d0BXXZGPu0Hd0evverUvcYAb/7vn0g==} - - toggle-selection@1.0.6: - resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - token-types@5.0.1: - resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} - engines: {node: '>=14.16'} - - toml@3.0.0: - resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} - - toposort@1.0.7: - resolution: {integrity: sha512-FclLrw8b9bMWf4QlCJuHBEVhSRsqDj6u3nIjAzPeJvgl//1hBlffdlk0MALceL14+koWEdU4ofRAXofbODxQzg==} - - toposort@2.0.2: - resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} - - tough-cookie@2.5.0: - resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} - engines: {node: '>=0.8'} - - tough-cookie@3.0.1: - resolution: {integrity: sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==} - engines: {node: '>=6'} - - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - - tr46@3.0.0: - resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} - engines: {node: '>=12'} - - traverse@0.3.9: - resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} - - tree-dump@1.0.3: - resolution: {integrity: sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - - tree-sitter-json@0.24.8: - resolution: {integrity: sha512-Tc9ZZYwHyWZ3Tt1VEw7Pa2scu1YO7/d2BCBbKTx5hXwig3UfdQjsOPkPyLpDJOn/m1UBEWYAtSdGAwCSyagBqQ==} - peerDependencies: - tree-sitter: ^0.21.1 - peerDependenciesMeta: - 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==} - - trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - - trim-newlines@1.0.0: - resolution: {integrity: sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==} - engines: {node: '>=0.10.0'} - - trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - - trim-newlines@4.1.1: - resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} - engines: {node: '>=12'} - - trim-repeated@1.0.0: - resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} - engines: {node: '>=0.10.0'} - - trim-right@1.0.1: - resolution: {integrity: sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==} - engines: {node: '>=0.10.0'} - - trim-trailing-lines@1.1.4: - resolution: {integrity: sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==} - - trim@0.0.1: - resolution: {integrity: sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==} - deprecated: Use String.prototype.trim() instead - - triple-beam@1.3.0: - resolution: {integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==} - - triple-beam@1.4.1: - resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} - engines: {node: '>= 14.0.0'} - - trough@1.0.5: - resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} - - trough@2.2.0: - resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - - true-case-path@2.2.1: - resolution: {integrity: sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==} - - truncate-utf8-bytes@1.0.2: - resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} - - 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==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - - ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} - - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - - ts-jest@22.0.1: - resolution: {integrity: sha512-bc781gViU95lRZF0kzkHiincwmVu96jbC8MFk2SXUCrSj3Zx8sMC6c6gJnIluVQkm8yYaBl5ucqLnwHNRl5l0Q==} - peerDependencies: - jest: ^22.0.1 || ^22.1.0-alpha.1 || ^23.0.0-alpha.1 - typescript: 2.x - - ts-jest@25.5.1: - resolution: {integrity: sha512-kHEUlZMK8fn8vkxDjwbHlxXRB9dHYpyzqKIGDNxbzs+Rz+ssNDSDNusEK8Fk/sDd4xE6iKoQLfFkFVaskmTJyw==} - engines: {node: '>= 8'} - hasBin: true - peerDependencies: - jest: '>=25 <26' - typescript: '>=3.4 <4.0' - - ts-jest@29.3.4: - resolution: {integrity: sha512-Iqbrm8IXOmV+ggWHOTEbjwyCf2xZlUMv5npExksXohL+tk8va4Fjhb+X2+Rt9NBmgO7bJ8WpnMLOwih/DnMlFA==} - engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/transform': ^29.0.0 - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/transform': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - - ts-loader@2.3.7: - resolution: {integrity: sha512-8t3bu2FcEkXb+D4L+Cn8qiK2E2C6Ms4/GQChvz6IMbVurcFHLXrhW4EMtfaol1a1ASQACZGDUGit4NHnX9g7hQ==} - engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} - - ts-loader@9.5.2: - resolution: {integrity: sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==} - engines: {node: '>=12.0.0'} - peerDependencies: - typescript: '*' - webpack: ^5.94.0 - - ts-mixer@6.0.4: - resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} - - ts-morph@22.0.0: - resolution: {integrity: sha512-M9MqFGZREyeb5fTl6gNHKZLqBQA0TjA1lea+CR48R8EBTDuWrNqW6ccC5QvjNR4s6wDumD3LTCjOFSp9iwlzaw==} - - ts-morph@26.0.0: - resolution: {integrity: sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==} - - ts-pnp@1.2.0: - resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==} - engines: {node: '>=6'} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - ts-toolbelt@9.6.0: - resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} - - tsconfig-paths-webpack-plugin@2.0.0: - resolution: {integrity: sha512-reAnVEGP7mNwOcXXYxQpsH7uY8blNJM/xgN2KYttVX+qkwfqA+nhRPpA7Fnomnlhm5Jz0EoSVwk4rtQu8hC54g==} - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} - - tsdx@0.14.1: - resolution: {integrity: sha512-keHmFdCL2kx5nYFlBdbE3639HQ2v9iGedAFAajobrUTH2wfX0nLPdDhbHv+GHLQZqf0c5ur1XteE8ek/+Eyj5w==} - engines: {node: '>=10'} - hasBin: true - - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - tslib@2.0.1: - resolution: {integrity: sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - tslint-config-prettier@1.18.0: - resolution: {integrity: sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==} - engines: {node: '>=4.0.0'} - hasBin: true - - tslint-react-hooks@2.2.2: - resolution: {integrity: sha512-gtwA14+WevNUtlBhvAD5Ukpxt2qMegYI7IDD8zN/3JXLksdLdEuU/T/oqlI1CtZhMJffqyNn+aqq2oUqUFXiNA==} - peerDependencies: - tslint: 5 - 6 - typescript: '>=2.1.0' - - tslint-react@3.6.0: - resolution: {integrity: sha512-AIv1QcsSnj7e9pFir6cJ6vIncTqxfqeFF3Lzh8SuuBljueYzEAtByuB6zMaD27BL0xhMEqsZ9s5eHuCONydjBw==} - peerDependencies: - tslint: ^5.1.0 - typescript: '>=2.1.0 || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev' - - tslint-react@4.2.0: - resolution: {integrity: sha512-lO22+FKr9ZZGueGiuALzvZE/8ANoDoCHGCknX1Ge3ALrfcLQHQ1VGdyb1scZXQFdEQEfwBTIU40r5BUlJpn0JA==} - deprecated: TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint-react/issues/210 for more information. - peerDependencies: - tslint: ^5.1.0 - typescript: '>=2.8.0' - - tslint-react@5.0.0: - resolution: {integrity: sha512-/IbcSmoBPlFic8kQaRfQ4knTY4mivwo5LVzvozvX6Dyu2ynEnrh1dIcR2ujjyp/IodXqY/H5GbxFxSMo/Kf2Hg==} - deprecated: tslint-react is deprecated along with TSLint - peerDependencies: - tslint: ^6.0.0 - typescript: '>=3.4.1' - - tslint@5.20.1: - resolution: {integrity: sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==} - engines: {node: '>=4.8.0'} - hasBin: true - peerDependencies: - typescript: '>=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev' - - tslint@6.1.3: - resolution: {integrity: sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==} - engines: {node: '>=4.8.0'} - deprecated: TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information. - hasBin: true - peerDependencies: - typescript: '>=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev' - - tsutils@2.29.0: - resolution: {integrity: sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==} - peerDependencies: - typescript: '>=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev' - - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - 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 - - ttf2eot@3.1.0: - resolution: {integrity: sha512-aHTbcYosNHVqb2Qtt9Xfta77ae/5y0VfdwNLUS6sGBeGr22cX2JDMo/i5h3uuOf+FAD3akYOr17+fYd5NK8aXw==} - hasBin: true - - ttf2woff2@2.0.3: - resolution: {integrity: sha512-HVI+ZVmIbHAxfmbxV/Ahjh20che2WUCs4xWIcCUaD/BLEof/ylYUjnc0DAhpYsAzEJy1kQwkOQD45RLgtWQHfw==} - engines: {node: '>=0.12'} - hasBin: true - - ttf2woff2@5.0.0: - resolution: {integrity: sha512-FplhShJd3rT8JGa8N04YWQuP7xRvwr9AIq+9/z5O/5ubqNiCADshKl8v51zJDFkhDVcYpdUqUpm7T4M53Z2JoQ==} - engines: {node: '>=14'} - hasBin: true - - ttf2woff@2.0.2: - resolution: {integrity: sha512-X68badwBjAy/+itU49scLjXUL094up+rHuYk+YAOTTBYSUMOmLZ7VyhZJuqQESj1gnyLAC2/5V8Euv+mExmyPA==} - hasBin: true - - ttf2woff@3.0.0: - resolution: {integrity: sha512-OvmFcj70PhmAsVQKfC15XoKH55cRWuaRzvr2fpTNhTNer6JBpG8n6vOhRrIgxMjcikyYt88xqYXMMVapJ4Rjvg==} - hasBin: true - - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - - tunnel@0.0.6: - resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} - engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - - tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - - type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - - type-fest@0.16.0: - resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} - engines: {node: '>=10'} - - type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - - type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - - type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - - type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - - type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} - - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - - type-is@2.0.1: - resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} - engines: {node: '>= 0.6'} - - type@2.7.3: - resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} - - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} - - typed-rest-client@1.8.11: - resolution: {integrity: sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==} - - typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - - typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - - types-ramda@0.30.1: - resolution: {integrity: sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==} - - typescript@3.9.10: - resolution: {integrity: sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==} - engines: {node: '>=4.2.0'} - hasBin: true - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true - - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} - engines: {node: '>=14.17'} - hasBin: true - - ua-parser-js@1.0.40: - resolution: {integrity: sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==} - hasBin: true - - uc.micro@1.0.6: - resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} - - 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==} - - uglify-es@3.3.9: - resolution: {integrity: sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==} - engines: {node: '>=0.8.0'} - deprecated: support for ECMAScript is superseded by `uglify-js` as of v3.13.0 - hasBin: true - - uglify-js@3.19.3: - resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} - engines: {node: '>=0.8.0'} - hasBin: true - - uglify-js@3.4.10: - resolution: {integrity: sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==} - engines: {node: '>=0.8.0'} - hasBin: true - - uglifyjs-webpack-plugin@1.2.5: - resolution: {integrity: sha512-hIQJ1yxAPhEA2yW/i7Fr+SXZVMp+VEI3d42RTHBgQd2yhp/1UdBcR3QEWPV5ahBxlqQDMEMTuTEvDHSFINfwSw==} - engines: {node: '>= 4.8 < 5.0.0 || >= 5.10'} - peerDependencies: - webpack: ^5.94.0 - - unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} - - underscore@1.13.7: - resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==} - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - - undici-types@7.8.0: - resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} - - undici@7.10.0: - resolution: {integrity: sha512-u5otvFBOBZvmdjWLVW+5DAc9Nkq8f24g0O9oY7qw2JVIF1VocIFoyz9JFkuVOS2j41AufeO0xnlweJ2RLT8nGw==} - engines: {node: '>=20.18.1'} - - unfetch@4.2.0: - resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} - - unherit@1.1.3: - resolution: {integrity: sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==} - - unicode-canonical-property-names-ecmascript@2.0.1: - resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} - engines: {node: '>=4'} - - unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} - - unicode-match-property-value-ecmascript@2.2.0: - resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} - engines: {node: '>=4'} - - unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} - - unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} - - unicorn-magic@0.3.0: - resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} - engines: {node: '>=18'} - - unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} - - unified@11.0.5: - resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} - - unified@9.2.0: - resolution: {integrity: sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==} - - union@0.5.0: - resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} - engines: {node: '>= 0.8.0'} - - uniq@1.0.1: - resolution: {integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==} - - uniqs@2.0.0: - resolution: {integrity: sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==} - - unique-filename@1.1.1: - resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} - - unique-filename@2.0.1: - resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - unique-slug@2.0.2: - resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} - - unique-slug@3.0.0: - resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - unique-string@1.0.0: - resolution: {integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==} - engines: {node: '>=4'} - - unique-string@2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} - - unist-builder@2.0.3: - resolution: {integrity: sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==} - - unist-builder@3.0.1: - resolution: {integrity: sha512-gnpOw7DIpCA0vpr6NqdPvTWnlPTApCTRzr+38E6hCWx3rz/cjo83SsKIlS1Z+L5ttScQ2AwutNnb8+tAvpb6qQ==} - - unist-util-generated@1.1.6: - resolution: {integrity: sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==} - - unist-util-generated@2.0.1: - resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} - - unist-util-is@4.1.0: - resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} - - unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} - - unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - - unist-util-position@3.1.0: - resolution: {integrity: sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==} - - unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} - - unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - - unist-util-remove-position@2.0.1: - resolution: {integrity: sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==} - - unist-util-remove@2.1.0: - resolution: {integrity: sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==} - - unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} - - unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - - unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} - - unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} - - unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - - unist-util-visit@2.0.3: - resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} - - 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==} - - unit-compare@1.0.1: - resolution: {integrity: sha512-AeLMQr8gcen2WOTwV0Gvi1nKKbY4Mms79MoltZ6hrZV/VANgE/YQly3jtWZJA/fa9m4ajhynq3XMqh5rOyZclA==} - - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - - unplugin@1.16.1: - resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} - engines: {node: '>=14.0.0'} - - unraw@3.0.0: - resolution: {integrity: sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==} - - untildify@2.1.0: - resolution: {integrity: sha512-sJjbDp2GodvkB0FZZcn7k6afVisqX5BZD7Yq3xp4nN2O15BBK0cLm3Vwn2vQaF7UDS0UUsrQMkkplmDI5fskig==} - engines: {node: '>=0.10.0'} - - untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - - unzip-response@2.0.1: - resolution: {integrity: sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==} - engines: {node: '>=4'} - - unzipper@0.10.14: - resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} - - unzipper@0.12.3: - resolution: {integrity: sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==} - - upath@2.0.1: - resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} - engines: {node: '>=4'} - - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - update-notifier@2.5.0: - resolution: {integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==} - engines: {node: '>=4'} - - upper-case@1.1.3: - resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - urijs@1.19.11: - resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==} - - url-join@1.1.0: - resolution: {integrity: sha512-zz1wZk4Lb5PTVwZ3HWDmm8XnlPvmOof6/fjdDPA5yBrUcbtV64U6bV832Zf1BtU2WkBBWaUT46wCs+l0HP5nhg==} - - url-join@4.0.1: - resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} - - url-loader@0.6.2: - resolution: {integrity: sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==} - peerDependencies: - file-loader: '*' - - url-loader@4.1.1: - resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - file-loader: '*' - webpack: ^5.94.0 - peerDependenciesMeta: - file-loader: - optional: true - - url-parse-lax@1.0.0: - resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==} - engines: {node: '>=0.10.0'} - - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - - url@0.11.4: - resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} - engines: {node: '>= 0.4'} - - use-callback-ref@1.3.3: - resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - use-composed-ref@1.4.0: - resolution: {integrity: sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - use-isomorphic-layout-effect@1.2.1: - resolution: {integrity: sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - use-latest@1.3.0: - resolution: {integrity: sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - use-resize-observer@9.1.0: - resolution: {integrity: sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==} - peerDependencies: - react: 16.8.0 - 18 - react-dom: 16.8.0 - 18 - - use-sidecar@1.1.3: - resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - use-sync-external-store@1.5.0: - resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - utf8-byte-length@1.0.5: - resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - util.promisify@1.0.0: - resolution: {integrity: sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==} - - util@0.10.4: - resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} - - util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - - utila@0.4.0: - resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} - - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - - uuid-browser@3.1.0: - resolution: {integrity: sha512-dsNgbLaTrd6l3MMxTtouOCFw4CBFc/3a+GgYA2YyrJvyQ1u6q4pcu3ktLoUZ/VN/Aw9WsauazbgsgdfVWgAKQg==} - deprecated: Package no longer supported and required. Use the uuid package or crypto.randomUUID instead - - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true - - uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - - uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true - - 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} - - v8-to-istanbul@9.3.0: - resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} - engines: {node: '>=10.12.0'} - - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - - varstream@0.3.2: - resolution: {integrity: sha512-OpR3Usr9dGZZbDttlTxdviGdxiURI0prX68+DuaN/JfIDbK9ZOmREKM6PgmelsejMnhgjXmEEEgf+E4NbsSqMg==} - engines: {node: '>=0.10.*'} - hasBin: true - - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - - vendors@1.0.4: - resolution: {integrity: sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==} - - verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} - - version-range@4.14.0: - resolution: {integrity: sha512-gjb0ARm9qlcBAonU4zPwkl9ecKkas+tC2CGwFfptTCWWIVTWY1YUbT2zZKsOAF1jR/tNxxyLwwG0cb42XlYcTg==} - engines: {node: '>=4'} - - vfile-location@3.2.0: - resolution: {integrity: sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==} - - vfile-location@4.1.0: - resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} - - vfile-location@5.0.3: - resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} - - vfile-message@2.0.4: - resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} - - vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} - - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - - vfile@4.2.1: - resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} - - vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} - - vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - - vite@6.3.5: - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - - vscode-debugadapter-testsupport@1.51.0: - resolution: {integrity: sha512-rb8tfn7J3kxLi1rRhEyG5ggGkFcJH2WrYYrq6Vb1tDAcHoFXF580M1dAA2jPOrc0I14GuWxMnndvfGkfG10VxA==} - deprecated: This package has been renamed to @vscode/debugadapter-testsupport, please update to the new name - - vscode-debugadapter@1.51.0: - resolution: {integrity: sha512-mObaXD5/FH/z6aL2GDuyCLbnwLsYRCAJWgFid01vKW9Y5Si8OvINK+Tn+Yl/lRUbetjNuZW3j1euMEz6z8Yzqg==} - deprecated: This package has been renamed to @vscode/debugadapter, please update to the new name - - vscode-debugprotocol@1.51.0: - resolution: {integrity: sha512-dzKWTMMyebIMPF1VYMuuQj7gGFq7guR8AFya0mKacu+ayptJfaRuM0mdHCqiOth4FnRP8mPhEroFPx6Ift8wHA==} - deprecated: This package has been renamed to @vscode/debugprotocol, please update to the new name - - vscode-extension-telemetry@0.1.7: - resolution: {integrity: sha512-pZuZTHO9OpsrwlerOKotWBRLRYJ53DobYb7aWiRAXjlqkuqE+YJJaP+2WEy8GrLIF1EnitXTDMaTAKsmLQ5ORQ==} - engines: {vscode: ^1.5.0} - deprecated: This package has been renamed to @vscode/extension-telemetry, please update to the new name - - vscode-extension-tester-locators@3.12.2: - resolution: {integrity: sha512-RMN+AMGhK4dSPauJoAQ1Os4Kju9br7HvcwflkgWn7M81HEo2lt/wEsLKtEm0igSc3u4iKDH3R1D/kqbxW8A/UQ==} - deprecated: Deprecated - This package was replaced by @redhat-developer/locators - peerDependencies: - monaco-page-objects: ^3.14.1 - selenium-webdriver: '>=4.6.1' - - vscode-extension-tester@5.10.0: - resolution: {integrity: sha512-9tltf+hlwNTvi7XXjA7oH1kcTrIDOLqGB/5d+W6CSwTRMXHwxeIw4JUgKlriuy65elr06YB5IVpSBgn+fs4X5A==} - hasBin: true - peerDependencies: - mocha: '>=5.2.0' - typescript: '>=4.6.2' - - vscode-extension-tester@8.14.1: - resolution: {integrity: sha512-yu5nvQBI69Nwy7OZyNNmYcTMfcMbFy4jX2XjQc+jqenzifjOYLmr4iB427fA0A+fycl1S3ynbDlu9wKygcpdcA==} - hasBin: true - peerDependencies: - mocha: '>=5.2.0' - typescript: '>=4.6.2' - - vscode-jsonrpc@6.0.0: - resolution: {integrity: sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==} - engines: {node: '>=8.0.0 || >=10.0.0'} - - vscode-jsonrpc@8.1.0: - resolution: {integrity: sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==} - engines: {node: '>=14.0.0'} - - vscode-jsonrpc@8.2.0: - resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} - engines: {node: '>=14.0.0'} - - vscode-jsonrpc@8.2.1: - resolution: {integrity: sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ==} - engines: {node: '>=14.0.0'} - - vscode-languageclient@7.0.0: - resolution: {integrity: sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==} - engines: {vscode: ^1.52.0} - - vscode-languageclient@8.1.0: - resolution: {integrity: sha512-GL4QdbYUF/XxQlAsvYWZRV3V34kOkpRlvV60/72ghHfsYFnS/v2MANZ9P6sHmxFcZKOse8O+L9G7Czg0NUWing==} - engines: {vscode: ^1.67.0} - - vscode-languageclient@9.0.1: - resolution: {integrity: sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==} - engines: {vscode: ^1.82.0} - - vscode-languageserver-protocol@3.16.0: - resolution: {integrity: sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==} - - vscode-languageserver-protocol@3.17.3: - resolution: {integrity: sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==} - - vscode-languageserver-protocol@3.17.5: - resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} - - vscode-languageserver-textdocument@1.0.12: - resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} - - vscode-languageserver-types@3.16.0: - resolution: {integrity: sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==} - - vscode-languageserver-types@3.17.3: - resolution: {integrity: sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==} - - vscode-languageserver-types@3.17.5: - resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} - - vscode-messenger-common@0.4.5: - resolution: {integrity: sha512-opA+BEYTWdy1fFC3oOw30b0zc/KEuMtw+1pOiH5fEp+BGeA5xff7omSQTZeZJSDJszM471Vi+YY/ipRdRglAlQ==} - - vscode-messenger-common@0.5.1: - resolution: {integrity: sha512-YJRUdK278/K7vNyhVoePINOHmz3xjQFQbSiuNXCm3+GfQ6NSmjjWTpumAYAzNs05HKAeF9glU532livdwc3W0A==} - - vscode-messenger-webview@0.5.1: - resolution: {integrity: sha512-3IXFORcjD3c9khECdqRUeBh05mt0AZA/86FhY/MlCRB2YHGzqpJeD/5rRX92fO2M42rUjXLi5bnzmXSvVGXadw==} - - vscode-messenger@0.4.5: - resolution: {integrity: sha512-a6e54dpPRi/ITmVex49LGU6YXlqcuxGPlDPauvZig20G1D1/QD2E8GfhtvlTj3ml5aU/QV3LHghyepq3riy7sw==} - - vscode-messenger@0.5.1: - resolution: {integrity: sha512-pHexyKLr6FgVkdXi9NcCgygikVkFsbpk9PoObT4JXSQfnosNLTWS2NTdGJ+nv/xhUw5OodmVId/oJwNU7HxoQw==} - - vscode-test@1.6.1: - resolution: {integrity: sha512-086q88T2ca1k95mUzffvbzb7esqQNvJgiwY4h29ukPhFo8u+vXOOmelUoU5EQUHs3Of8+JuQ3oGdbVCqaxuTXA==} - engines: {node: '>=8.9.3'} - deprecated: This package has been renamed to @vscode/test-electron, please update to the new name - - vscode-uri@3.1.0: - resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - - vscode-ws-jsonrpc@3.4.0: - resolution: {integrity: sha512-jkNZvX0LdHt4skPxMw/jFePr3jRCJU6ZmO28oPoQ7RwNSkwU3uN8mgtxACYEbOY68bYmi/b/uJzhxewKCz1P4w==} - engines: {node: '>=18.19.0', npm: '>=10.2.3'} - - w3c-hr-time@1.0.2: - resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} - deprecated: Use your platform's native performance.now() and performance.timeOrigin. - - w3c-keyname@2.2.8: - resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} - - w3c-xmlserializer@1.1.2: - resolution: {integrity: sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==} - - w3c-xmlserializer@4.0.0: - resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} - engines: {node: '>=14'} - - walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - - watch@0.10.0: - resolution: {integrity: sha512-FAk18nzhYggg939xgRRLJjvqmAKZciO24wr8neoxNPl87w8J3m784wxL4zFBwME+0gNQ2Sv/vfsCrUxPxU2Dmg==} - engines: {'0': node >=0.1.95} - - watchpack@2.4.4: - resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} - engines: {node: '>=10.13.0'} - - wbuf@1.7.3: - resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} - - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - - web-namespaces@1.1.4: - resolution: {integrity: sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==} - - web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - - web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} - - web-tree-sitter@0.24.5: - resolution: {integrity: sha512-+J/2VSHN8J47gQUAvF8KDadrfz6uFYVjxoxbKWDoXVsH2u7yLdarCnIURnrMA6uSRkgX3SdmqM5BOoQjPdSh5w==} - - webfonts-generator@0.4.0: - resolution: {integrity: sha512-2tz14d9lDYkNopbogp3cCEo0oQj6tHYo17v6nYlJQT57CwzQy/7Y6a1UzleNK9jSshez2qau6MHcHy/gbDwssQ==} - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - - webpack-cli@4.10.0: - resolution: {integrity: sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - '@webpack-cli/generators': '*' - '@webpack-cli/migrate': '*' - webpack: ^5.94.0 - webpack-bundle-analyzer: '*' - webpack-dev-server: '*' - peerDependenciesMeta: - '@webpack-cli/generators': - optional: true - '@webpack-cli/migrate': - optional: true - webpack-bundle-analyzer: - optional: true - webpack-dev-server: - optional: true - - webpack-cli@5.1.4: - resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} - engines: {node: '>=14.15.0'} - hasBin: true - peerDependencies: - '@webpack-cli/generators': '*' - webpack: ^5.94.0 - webpack-bundle-analyzer: '*' - webpack-dev-server: '*' - peerDependenciesMeta: - '@webpack-cli/generators': - optional: true - webpack-bundle-analyzer: - optional: true - webpack-dev-server: - optional: true - - webpack-cli@6.0.1: - resolution: {integrity: sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==} - engines: {node: '>=18.12.0'} - hasBin: true - peerDependencies: - webpack: ^5.94.0 - webpack-bundle-analyzer: '*' - webpack-dev-server: '*' - peerDependenciesMeta: - webpack-bundle-analyzer: - optional: true - webpack-dev-server: - optional: true - - webpack-dev-middleware@3.7.3: - resolution: {integrity: sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==} - engines: {node: '>= 6'} - peerDependencies: - webpack: ^5.94.0 - - webpack-dev-middleware@4.3.0: - resolution: {integrity: sha512-PjwyVY95/bhBh6VUqt6z4THplYcsvQ8YNNBTBM873xLVmw8FLeALn0qurHbs9EmcfhzQis/eoqypSnZeuUz26w==} - engines: {node: '>= v10.23.3'} - peerDependencies: - webpack: ^5.94.0 - - webpack-dev-middleware@6.1.3: - resolution: {integrity: sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==} - engines: {node: '>= 14.15.0'} - peerDependencies: - webpack: ^5.94.0 - peerDependenciesMeta: - webpack: - optional: true - - webpack-dev-middleware@7.4.2: - resolution: {integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==} - engines: {node: '>= 18.12.0'} - peerDependencies: - webpack: ^5.94.0 - peerDependenciesMeta: - webpack: - optional: true - - webpack-dev-server@5.2.2: - resolution: {integrity: sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==} - engines: {node: '>= 18.12.0'} - hasBin: true - peerDependencies: - webpack: ^5.94.0 - webpack-cli: '*' - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true - - webpack-filter-warnings-plugin@1.2.1: - resolution: {integrity: sha512-Ez6ytc9IseDMLPo0qCuNNYzgtUl8NovOqjIq4uAU8LTD4uoa1w1KpZyyzFtLTEMZpkkOkLfL9eN+KGYdk1Qtwg==} - engines: {node: '>= 4.3 < 5.0.0 || >= 5.10'} - peerDependencies: - webpack: ^5.94.0 - - webpack-hot-middleware@2.26.1: - resolution: {integrity: sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==} - - webpack-log@2.0.0: - resolution: {integrity: sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==} - engines: {node: '>= 6'} - - webpack-manifest-plugin@1.3.2: - resolution: {integrity: sha512-MX60Bv2G83Zks9pi3oLOmRgnPAnwrlMn+lftMrWBm199VQjk46/xgzBi9lPfpZldw2+EI2S+OevuLIaDuxCWRw==} - engines: {node: '>=0.10'} - peerDependencies: - webpack: ^5.94.0 - - webpack-merge-and-include-globally@2.3.4: - resolution: {integrity: sha512-s5dd7m3ycVBlC7C6GAx91JQzbjhxC/NJRuT2sCkg8WCcF8CE1x/7xwVXqgmt0Fr/H/0sX5C5HE2RdU6+vCY5yg==} - peerDependencies: - webpack: ^5.94.0 - - webpack-merge@5.10.0: - resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} - engines: {node: '>=10.0.0'} - - webpack-merge@6.0.1: - resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} - engines: {node: '>=18.0.0'} - - webpack-permissions-plugin@1.0.10: - resolution: {integrity: sha512-5b99jU4IEYYzQbHK8vPRVax7D0dNJl9Ns47IPbpDl8hcRp/geA/U0RmNO/WuXEVTObh3stT/0kC7mC1b575zHA==} - - webpack-sources@1.4.3: - resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} - - webpack-sources@3.3.3: - resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} - engines: {node: '>=10.13.0'} - - webpack-virtual-modules@0.2.2: - resolution: {integrity: sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA==} - - webpack-virtual-modules@0.4.6: - resolution: {integrity: sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==} - - webpack-virtual-modules@0.5.0: - resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} - - webpack-virtual-modules@0.6.2: - resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - - webpack@5.100.2: - resolution: {integrity: sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - - websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} - - websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} - - whatwg-encoding@1.0.5: - resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} - - whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} - - whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} - - whatwg-fetch@2.0.3: - resolution: {integrity: sha512-SA2KdOXATOroD3EBUYvcdugsusXS5YiQFqwskSbsp5b1gK8HpNi/YP0jcy/BDpdllp305HMnrsVf9K7Be9GiEQ==} - - whatwg-mimetype@2.3.0: - resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} - - whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} - - whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} - - whatwg-url@11.0.0: - resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} - engines: {node: '>=12'} - - whatwg-url@4.8.0: - resolution: {integrity: sha512-nUvUPuenPFtPfy/X+dAYh/TfRbTBlnXTM5iIfLseJFkkQewmpG9pGR6i87E9qL+lZaJzv+99kkQWoGOtLfkZQQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - whatwg-url@6.5.0: - resolution: {integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==} - - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - - whet.extend@0.9.9: - resolution: {integrity: sha512-mmIPAft2vTgEILgPeZFqE/wWh24SEsR/k+N9fJ3Jxrz44iDFy9aemCxdksfURSHYFCLmvs/d/7Iso5XjPpNfrA==} - engines: {node: '>=0.6.0'} - - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} - - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - - which-module@1.0.0: - resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} - - which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} - - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - which@5.0.0: - resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} - engines: {node: ^18.17.0 || >=20.5.0} - hasBin: true - - wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - - widest-line@2.0.1: - resolution: {integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==} - engines: {node: '>=4'} - - widest-line@3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} - - wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} - - winston-transport@4.6.0: - resolution: {integrity: sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==} - engines: {node: '>= 12.0.0'} - - winston@3.11.0: - resolution: {integrity: sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==} - engines: {node: '>= 12.0.0'} - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - - wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - - worker-farm@1.7.0: - resolution: {integrity: sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==} - - worker-rpc@0.1.1: - resolution: {integrity: sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==} - - workerpool@6.5.1: - resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} - - workerpool@9.3.2: - resolution: {integrity: sha512-Xz4Nm9c+LiBHhDR5bDLnNzmj6+5F+cyEAWPMkbs2awq/dYazR/efelZzUAjB/y3kNHL+uzkHvxVVpaOfGCPV7A==} - - wrap-ansi@2.1.0: - resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} - engines: {node: '>=0.10.0'} - - wrap-ansi@3.0.1: - resolution: {integrity: sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==} - engines: {node: '>=4'} - - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} - engines: {node: '>=18'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - write-file-atomic@2.4.3: - resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} - - write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - - write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - write-file-atomic@5.0.1: - 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==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@6.2.3: - resolution: {integrity: sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - x-default-browser@0.4.0: - resolution: {integrity: sha512-7LKo7RtWfoFN/rHx1UELv/2zHGMx8MkZKDq1xENmOCTkfIqZJ0zZ26NEJX8czhnPXVcqS0ARjjfJB+eJ0/5Cvw==} - hasBin: true - - xdg-basedir@3.0.0: - resolution: {integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==} - engines: {node: '>=4'} - - xml-but-prettier@1.0.1: - resolution: {integrity: sha512-C2CJaadHrZTqESlH03WOyw0oZTtoy2uEg6dSDF6YRg+9GnYNub53RRemLpnvtbHDFelxMx4LajiFsYeR6XJHgQ==} - - xml-js@1.6.11: - resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} - hasBin: true - - xml-name-validator@2.0.1: - resolution: {integrity: sha512-jRKe/iQYMyVJpzPH+3HL97Lgu5HrCfii+qSo+TfjKHtOnvbnvdVfMYrn9Q34YV81M2e5sviJlI6Ko9y+nByzvA==} - - xml-name-validator@3.0.0: - resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} - - xml-name-validator@4.0.0: - resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} - engines: {node: '>=12'} - - xml2js@0.5.0: - resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} - engines: {node: '>=4.0.0'} - - xml2js@0.6.2: - resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} - engines: {node: '>=4.0.0'} - - xml@1.0.1: - resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} - - xmlbuilder2@3.1.1: - resolution: {integrity: sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==} - engines: {node: '>=12.0'} - - xmlbuilder@11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} - - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - - xmlhttprequest@1.8.0: - resolution: {integrity: sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==} - engines: {node: '>=0.4.0'} - - xstate@4.38.3: - resolution: {integrity: sha512-SH7nAaaPQx57dx6qvfcIgqKRXIh4L0A1iYEqim4s1u7c9VoCgzZc+63FY90AKU4ZzOC2cfJzTnpO4zK7fCUzzw==} - - xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - - y18n@3.2.2: - resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} - - y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - - yaml@2.8.0: - resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} - engines: {node: '>= 14.6'} - hasBin: true - - yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} - - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs-parser@5.0.1: - resolution: {integrity: sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==} - - yargs-parser@8.1.0: - resolution: {integrity: sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@10.1.2: - resolution: {integrity: sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==} - - yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yargs@7.1.2: - resolution: {integrity: sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==} - - yarn@1.22.22: - resolution: {integrity: sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg==} - engines: {node: '>=4.0.0'} - hasBin: true - - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - - yazl@2.5.1: - resolution: {integrity: sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - yocto-queue@1.2.1: - resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} - engines: {node: '>=12.20'} - - yup@1.6.1: - resolution: {integrity: sha512-JED8pB50qbA4FOkDol0bYF/p60qSEDQqBD0/qeIrUCG1KbPBIQ776fCUNb9ldbPcSTxA69g/47XTo4TqWiuXOA==} - - zenscroll@4.0.2: - resolution: {integrity: sha512-jEA1znR7b4C/NnaycInCU6h/d15ZzCd1jmsruqOKnZP6WXQSMH3W2GL+OXbkruslU4h+Tzuos0HdswzRUk/Vgg==} - - zod-to-json-schema@3.24.5: - resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} - peerDependencies: - zod: ^3.24.1 - - zod@3.25.67: - resolution: {integrity: sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==} - - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - - zustand@4.5.7: - resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==} - engines: {node: '>=12.7.0'} - peerDependencies: - '@types/react': '>=16.8' - immer: '>=9.0.6' - react: '>=16.8' - peerDependenciesMeta: - '@types/react': - optional: true - immer: - optional: true - react: - optional: true - - zustand@5.0.5: - resolution: {integrity: sha512-mILtRfKW9xM47hqxGIxCv12gXusoY/xTSHBYApXozR0HmQv299whhBeeAcRy+KrPPybzosvJBCOmVjq6x12fCg==} - engines: {node: '>=12.20.0'} - peerDependencies: - '@types/react': '>=18.0.0' - immer: '>=9.0.6' - react: '>=18.0.0' - use-sync-external-store: '>=1.2.0' - peerDependenciesMeta: - '@types/react': - optional: true - immer: - optional: true - react: - optional: true - use-sync-external-store: - optional: true - - zwitch@1.0.5: - resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} - - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - -snapshots: - - '@adobe/css-tools@4.4.3': {} - - '@alloc/quick-lru@5.2.0': {} - - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - - '@apidevtools/json-schema-ref-parser@12.0.2': - dependencies: - '@jsdevtools/ono': 7.1.3 - '@types/json-schema': 7.0.15 - js-yaml: 4.1.0 - - '@aw-web-design/x-default-browser@1.4.126': - dependencies: - default-browser-id: 3.0.0 - - '@aws-crypto/crc32@5.2.0': - dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.821.0 - tslib: 2.8.1 - - '@aws-crypto/crc32c@5.2.0': - dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.821.0 - 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.821.0 - '@aws-sdk/util-locate-window': 3.804.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - - '@aws-crypto/sha256-browser@5.2.0': - dependencies: - '@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.821.0 - '@aws-sdk/util-locate-window': 3.804.0 - '@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.821.0 - tslib: 2.8.1 - - '@aws-crypto/supports-web-crypto@5.2.0': - dependencies: - tslib: 2.8.1 - - '@aws-crypto/util@5.2.0': - dependencies: - '@aws-sdk/types': 3.821.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - - '@aws-sdk/client-s3@3.832.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.826.0 - '@aws-sdk/credential-provider-node': 3.830.0 - '@aws-sdk/middleware-bucket-endpoint': 3.830.0 - '@aws-sdk/middleware-expect-continue': 3.821.0 - '@aws-sdk/middleware-flexible-checksums': 3.826.0 - '@aws-sdk/middleware-host-header': 3.821.0 - '@aws-sdk/middleware-location-constraint': 3.821.0 - '@aws-sdk/middleware-logger': 3.821.0 - '@aws-sdk/middleware-recursion-detection': 3.821.0 - '@aws-sdk/middleware-sdk-s3': 3.826.0 - '@aws-sdk/middleware-ssec': 3.821.0 - '@aws-sdk/middleware-user-agent': 3.828.0 - '@aws-sdk/region-config-resolver': 3.821.0 - '@aws-sdk/signature-v4-multi-region': 3.826.0 - '@aws-sdk/types': 3.821.0 - '@aws-sdk/util-endpoints': 3.828.0 - '@aws-sdk/util-user-agent-browser': 3.821.0 - '@aws-sdk/util-user-agent-node': 3.828.0 - '@aws-sdk/xml-builder': 3.821.0 - '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.5.3 - '@smithy/eventstream-serde-browser': 4.0.4 - '@smithy/eventstream-serde-config-resolver': 4.1.2 - '@smithy/eventstream-serde-node': 4.0.4 - '@smithy/fetch-http-handler': 5.0.4 - '@smithy/hash-blob-browser': 4.0.4 - '@smithy/hash-node': 4.0.4 - '@smithy/hash-stream-node': 4.0.4 - '@smithy/invalid-dependency': 4.0.4 - '@smithy/md5-js': 4.0.4 - '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.11 - '@smithy/middleware-retry': 4.1.12 - '@smithy/middleware-serde': 4.0.8 - '@smithy/middleware-stack': 4.0.4 - '@smithy/node-config-provider': 4.1.3 - '@smithy/node-http-handler': 4.0.6 - '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.3 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.19 - '@smithy/util-defaults-mode-node': 4.0.19 - '@smithy/util-endpoints': 3.0.6 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-retry': 4.0.5 - '@smithy/util-stream': 4.2.2 - '@smithy/util-utf8': 4.0.0 - '@smithy/util-waiter': 4.0.5 - '@types/uuid': 9.0.8 - tslib: 2.8.1 - uuid: 9.0.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sso@3.830.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.826.0 - '@aws-sdk/middleware-host-header': 3.821.0 - '@aws-sdk/middleware-logger': 3.821.0 - '@aws-sdk/middleware-recursion-detection': 3.821.0 - '@aws-sdk/middleware-user-agent': 3.828.0 - '@aws-sdk/region-config-resolver': 3.821.0 - '@aws-sdk/types': 3.821.0 - '@aws-sdk/util-endpoints': 3.828.0 - '@aws-sdk/util-user-agent-browser': 3.821.0 - '@aws-sdk/util-user-agent-node': 3.828.0 - '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.5.3 - '@smithy/fetch-http-handler': 5.0.4 - '@smithy/hash-node': 4.0.4 - '@smithy/invalid-dependency': 4.0.4 - '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.11 - '@smithy/middleware-retry': 4.1.12 - '@smithy/middleware-serde': 4.0.8 - '@smithy/middleware-stack': 4.0.4 - '@smithy/node-config-provider': 4.1.3 - '@smithy/node-http-handler': 4.0.6 - '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.3 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.19 - '@smithy/util-defaults-mode-node': 4.0.19 - '@smithy/util-endpoints': 3.0.6 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-retry': 4.0.5 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/core@3.826.0': - dependencies: - '@aws-sdk/types': 3.821.0 - '@aws-sdk/xml-builder': 3.821.0 - '@smithy/core': 3.5.3 - '@smithy/node-config-provider': 4.1.3 - '@smithy/property-provider': 4.0.4 - '@smithy/protocol-http': 5.1.2 - '@smithy/signature-v4': 5.1.2 - '@smithy/smithy-client': 4.4.3 - '@smithy/types': 4.3.1 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-utf8': 4.0.0 - fast-xml-parser: 4.4.1 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-env@3.826.0': - dependencies: - '@aws-sdk/core': 3.826.0 - '@aws-sdk/types': 3.821.0 - '@smithy/property-provider': 4.0.4 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-http@3.826.0': - dependencies: - '@aws-sdk/core': 3.826.0 - '@aws-sdk/types': 3.821.0 - '@smithy/fetch-http-handler': 5.0.4 - '@smithy/node-http-handler': 4.0.6 - '@smithy/property-provider': 4.0.4 - '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.3 - '@smithy/types': 4.3.1 - '@smithy/util-stream': 4.2.2 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-ini@3.830.0': - dependencies: - '@aws-sdk/core': 3.826.0 - '@aws-sdk/credential-provider-env': 3.826.0 - '@aws-sdk/credential-provider-http': 3.826.0 - '@aws-sdk/credential-provider-process': 3.826.0 - '@aws-sdk/credential-provider-sso': 3.830.0 - '@aws-sdk/credential-provider-web-identity': 3.830.0 - '@aws-sdk/nested-clients': 3.830.0 - '@aws-sdk/types': 3.821.0 - '@smithy/credential-provider-imds': 4.0.6 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-node@3.830.0': - dependencies: - '@aws-sdk/credential-provider-env': 3.826.0 - '@aws-sdk/credential-provider-http': 3.826.0 - '@aws-sdk/credential-provider-ini': 3.830.0 - '@aws-sdk/credential-provider-process': 3.826.0 - '@aws-sdk/credential-provider-sso': 3.830.0 - '@aws-sdk/credential-provider-web-identity': 3.830.0 - '@aws-sdk/types': 3.821.0 - '@smithy/credential-provider-imds': 4.0.6 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-process@3.826.0': - dependencies: - '@aws-sdk/core': 3.826.0 - '@aws-sdk/types': 3.821.0 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-sso@3.830.0': - dependencies: - '@aws-sdk/client-sso': 3.830.0 - '@aws-sdk/core': 3.826.0 - '@aws-sdk/token-providers': 3.830.0 - '@aws-sdk/types': 3.821.0 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-web-identity@3.830.0': - dependencies: - '@aws-sdk/core': 3.826.0 - '@aws-sdk/nested-clients': 3.830.0 - '@aws-sdk/types': 3.821.0 - '@smithy/property-provider': 4.0.4 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/middleware-bucket-endpoint@3.830.0': - dependencies: - '@aws-sdk/types': 3.821.0 - '@aws-sdk/util-arn-parser': 3.804.0 - '@smithy/node-config-provider': 4.1.3 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - '@smithy/util-config-provider': 4.0.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-expect-continue@3.821.0': - dependencies: - '@aws-sdk/types': 3.821.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@aws-sdk/middleware-flexible-checksums@3.826.0': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@aws-crypto/crc32c': 5.2.0 - '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.826.0 - '@aws-sdk/types': 3.821.0 - '@smithy/is-array-buffer': 4.0.0 - '@smithy/node-config-provider': 4.1.3 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-stream': 4.2.2 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-host-header@3.821.0': - dependencies: - '@aws-sdk/types': 3.821.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@aws-sdk/middleware-location-constraint@3.821.0': - dependencies: - '@aws-sdk/types': 3.821.0 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@aws-sdk/middleware-logger@3.821.0': - dependencies: - '@aws-sdk/types': 3.821.0 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@aws-sdk/middleware-recursion-detection@3.821.0': - dependencies: - '@aws-sdk/types': 3.821.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@aws-sdk/middleware-sdk-s3@3.826.0': - dependencies: - '@aws-sdk/core': 3.826.0 - '@aws-sdk/types': 3.821.0 - '@aws-sdk/util-arn-parser': 3.804.0 - '@smithy/core': 3.5.3 - '@smithy/node-config-provider': 4.1.3 - '@smithy/protocol-http': 5.1.2 - '@smithy/signature-v4': 5.1.2 - '@smithy/smithy-client': 4.4.3 - '@smithy/types': 4.3.1 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-stream': 4.2.2 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-ssec@3.821.0': - dependencies: - '@aws-sdk/types': 3.821.0 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@aws-sdk/middleware-user-agent@3.828.0': - dependencies: - '@aws-sdk/core': 3.826.0 - '@aws-sdk/types': 3.821.0 - '@aws-sdk/util-endpoints': 3.828.0 - '@smithy/core': 3.5.3 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@aws-sdk/nested-clients@3.830.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.826.0 - '@aws-sdk/middleware-host-header': 3.821.0 - '@aws-sdk/middleware-logger': 3.821.0 - '@aws-sdk/middleware-recursion-detection': 3.821.0 - '@aws-sdk/middleware-user-agent': 3.828.0 - '@aws-sdk/region-config-resolver': 3.821.0 - '@aws-sdk/types': 3.821.0 - '@aws-sdk/util-endpoints': 3.828.0 - '@aws-sdk/util-user-agent-browser': 3.821.0 - '@aws-sdk/util-user-agent-node': 3.828.0 - '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.5.3 - '@smithy/fetch-http-handler': 5.0.4 - '@smithy/hash-node': 4.0.4 - '@smithy/invalid-dependency': 4.0.4 - '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.11 - '@smithy/middleware-retry': 4.1.12 - '@smithy/middleware-serde': 4.0.8 - '@smithy/middleware-stack': 4.0.4 - '@smithy/node-config-provider': 4.1.3 - '@smithy/node-http-handler': 4.0.6 - '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.3 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.19 - '@smithy/util-defaults-mode-node': 4.0.19 - '@smithy/util-endpoints': 3.0.6 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-retry': 4.0.5 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/region-config-resolver@3.821.0': - dependencies: - '@aws-sdk/types': 3.821.0 - '@smithy/node-config-provider': 4.1.3 - '@smithy/types': 4.3.1 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.4 - tslib: 2.8.1 - - '@aws-sdk/signature-v4-multi-region@3.826.0': - dependencies: - '@aws-sdk/middleware-sdk-s3': 3.826.0 - '@aws-sdk/types': 3.821.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/signature-v4': 5.1.2 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@aws-sdk/token-providers@3.830.0': - dependencies: - '@aws-sdk/core': 3.826.0 - '@aws-sdk/nested-clients': 3.830.0 - '@aws-sdk/types': 3.821.0 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/types@3.821.0': - dependencies: - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@aws-sdk/util-arn-parser@3.804.0': - dependencies: - tslib: 2.8.1 - - '@aws-sdk/util-endpoints@3.828.0': - dependencies: - '@aws-sdk/types': 3.821.0 - '@smithy/types': 4.3.1 - '@smithy/util-endpoints': 3.0.6 - tslib: 2.8.1 - - '@aws-sdk/util-locate-window@3.804.0': - dependencies: - tslib: 2.8.1 - - '@aws-sdk/util-user-agent-browser@3.821.0': - dependencies: - '@aws-sdk/types': 3.821.0 - '@smithy/types': 4.3.1 - bowser: 2.11.0 - tslib: 2.8.1 - - '@aws-sdk/util-user-agent-node@3.828.0': - dependencies: - '@aws-sdk/middleware-user-agent': 3.828.0 - '@aws-sdk/types': 3.821.0 - '@smithy/node-config-provider': 4.1.3 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@aws-sdk/xml-builder@3.821.0': - dependencies: - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@azu/format-text@1.0.2': {} - - '@azu/style-format@1.0.1': - dependencies: - '@azu/format-text': 1.0.2 - - '@azure/abort-controller@2.1.2': - dependencies: - tslib: 2.8.1 - - '@azure/core-auth@1.9.0': - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-util': 1.12.0 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - '@azure/core-client@1.9.4': - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.9.0 - '@azure/core-rest-pipeline': 1.21.0 - '@azure/core-tracing': 1.2.0 - '@azure/core-util': 1.12.0 - '@azure/logger': 1.2.0 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - '@azure/core-rest-pipeline@1.21.0': - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.9.0 - '@azure/core-tracing': 1.2.0 - '@azure/core-util': 1.12.0 - '@azure/logger': 1.2.0 - '@typespec/ts-http-runtime': 0.2.3 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - '@azure/core-tracing@1.2.0': - dependencies: - tslib: 2.8.1 - - '@azure/core-util@1.12.0': - dependencies: - '@azure/abort-controller': 2.1.2 - '@typespec/ts-http-runtime': 0.2.3 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - '@azure/identity@4.10.1': - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.9.0 - '@azure/core-client': 1.9.4 - '@azure/core-rest-pipeline': 1.21.0 - '@azure/core-tracing': 1.2.0 - '@azure/core-util': 1.12.0 - '@azure/logger': 1.2.0 - '@azure/msal-browser': 4.13.2 - '@azure/msal-node': 3.6.1 - open: 10.1.2 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - '@azure/logger@1.2.0': - dependencies: - '@typespec/ts-http-runtime': 0.2.3 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - '@azure/msal-browser@4.13.2': - dependencies: - '@azure/msal-common': 15.7.1 - - '@azure/msal-common@15.7.1': {} - - '@azure/msal-node@3.6.1': - dependencies: - '@azure/msal-common': 15.7.1 - jsonwebtoken: 9.0.2 - uuid: 8.3.2 - - '@babel/code-frame@7.27.1': - dependencies: - '@babel/helper-validator-identifier': 7.27.1 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/compat-data@7.27.5': {} - - '@babel/core@7.12.9': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.12.9) - '@babel/helpers': 7.27.6 - '@babel/parser': 7.27.5 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.27.6 - convert-source-map: 1.9.0 - debug: 4.4.1(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - lodash: 4.17.21 - resolve: 1.22.10 - semver: 5.7.2 - source-map: 0.5.7 - transitivePeerDependencies: - - supports-color - - '@babel/core@7.27.4': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) - '@babel/helpers': 7.27.6 - '@babel/parser': 7.27.5 - '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 - convert-source-map: 2.0.0 - debug: 4.4.1(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/core@7.28.0': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helpers': 7.27.6 - '@babel/parser': 7.28.0 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 - convert-source-map: 2.0.0 - debug: 4.4.1(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.27.5': - dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.1.0 - - '@babel/generator@7.28.0': - dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 - jsesc: 3.1.0 - - '@babel/helper-annotate-as-pure@7.27.3': - dependencies: - '@babel/types': 7.27.6 - - '@babel/helper-compilation-targets@7.27.2': - dependencies: - '@babel/compat-data': 7.27.5 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.0 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.27.4 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.27.4 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-annotate-as-pure': 7.27.3 - regexpu-core: 6.2.0 - semver: 6.3.1 - - '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - regexpu-core: 6.2.0 - semver: 6.3.1 - optional: true - - '@babel/helper-define-polyfill-provider@0.0.3(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4 - debug: 4.4.1(supports-color@8.1.1) - lodash.debounce: 4.0.8 - resolve: 1.22.10 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-define-polyfill-provider@0.1.5(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@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.0 - debug: 4.4.1(supports-color@8.1.1) - lodash.debounce: 4.0.8 - resolve: 1.22.10 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.1(supports-color@8.1.1) - lodash.debounce: 4.0.8 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - - '@babel/helper-define-polyfill-provider@0.6.4(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.1(supports-color@8.1.1) - lodash.debounce: 4.0.8 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - optional: true - - '@babel/helper-globals@7.28.0': {} - - '@babel/helper-member-expression-to-functions@7.27.1': - dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.28.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-imports@7.27.1': - dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.27.3(@babel/core@7.12.9)': - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - - '@babel/helper-optimise-call-expression@7.27.1': - dependencies: - '@babel/types': 7.28.1 - - '@babel/helper-plugin-utils@7.10.4': {} - - '@babel/helper-plugin-utils@7.27.1': {} - - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.27.1 - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.27.1 - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - optional: true - - '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - - '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - dependencies: - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-string-parser@7.27.1': {} - - '@babel/helper-validator-identifier@7.27.1': {} - - '@babel/helper-validator-option@7.27.1': {} - - '@babel/helper-wrap-function@7.27.1': - dependencies: - '@babel/template': 7.27.2 - '@babel/traverse': 7.27.4 - '@babel/types': 7.28.1 - transitivePeerDependencies: - - supports-color - - '@babel/helpers@7.27.6': - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.27.6 - - '@babel/parser@7.27.5': - dependencies: - '@babel/types': 7.27.6 - - '@babel/parser@7.28.0': - dependencies: - '@babel/types': 7.28.1 - - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - optional: true - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - optional: true - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - optional: true - - '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-decorators@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.27.4) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-export-default-from@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) - - '@babel/plugin-proposal-object-rest-spread@7.12.1(@babel/core@7.12.9)': - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.12.9) - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.12.9) - - '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.27.4)': - dependencies: - '@babel/compat-data': 7.27.5 - '@babel/core': 7.27.4 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) - - '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - optional: true - - '@babel/plugin-proposal-private-property-in-object@7.21.11(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.4) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@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/plugin-syntax-jsx@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@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/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-async-generator-functions@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-async-generator-functions@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0) - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - optional: true - - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.4) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - optional: true - - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-block-scoping@7.27.5(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-block-scoping@7.27.5(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-class-static-block@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - optional: true - - '@babel/plugin-transform-classes@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) - '@babel/traverse': 7.27.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-classes@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) - '@babel/traverse': 7.27.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - optional: true - - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/template': 7.27.2 - - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/template': 7.27.2 - optional: true - - '@babel/plugin-transform-destructuring@7.27.3(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-destructuring@7.27.3(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.27.4) - - '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.0) - - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - optional: true - - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - optional: true - - '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - optional: true - - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.4 - transitivePeerDependencies: - - supports-color - optional: true - - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - optional: true - - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-object-rest-spread@7.27.3(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) - - '@babel/plugin-transform-object-rest-spread@7.27.3(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.28.0) - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.28.0) - optional: true - - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.4) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - optional: true - - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-parameters@7.27.1(@babel/core@7.12.9)': - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-parameters@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-parameters@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color - optional: true - - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-react-display-name@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-react-display-name@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@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.4) - '@babel/types': 7.27.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@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.28.0) - '@babel/types': 7.27.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-regenerator@7.27.5(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-regenerator@7.27.5(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - optional: true - - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.27.4) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.27.1 - optional: true - - '@babel/preset-env@7.27.2(@babel/core@7.27.4)': - dependencies: - '@babel/compat-data': 7.27.5 - '@babel/core': 7.27.4 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.4) - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.4) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) - '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-object-rest-spread': 7.27.3(@babel/core@7.27.4) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-regenerator': 7.27.5(@babel/core@7.27.4) - '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.27.4) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.27.4) - babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.27.4) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.4) - babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.27.4) - core-js-compat: 3.43.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/preset-env@7.27.2(@babel/core@7.28.0)': - dependencies: - '@babel/compat-data': 7.27.5 - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0) - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.0) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-async-generator-functions': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.28.0) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-class-static-block': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.28.0) - '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-object-rest-spread': 7.27.3(@babel/core@7.28.0) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-regenerator': 7.27.5(@babel/core@7.28.0) - '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.0) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.0) - babel-plugin-polyfill-corejs2: 0.4.13(@babel/core@7.28.0) - babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.28.0) - babel-plugin-polyfill-regenerator: 0.6.4(@babel/core@7.28.0) - core-js-compat: 3.43.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - optional: true - - '@babel/preset-flow@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.27.4) - - '@babel/preset-flow@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.0) - - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.27.6 - esutils: 2.0.3 - - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.27.6 - esutils: 2.0.3 - optional: true - - '@babel/preset-react@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.27.4) - transitivePeerDependencies: - - supports-color - - '@babel/preset-react@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - - '@babel/preset-typescript@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.4) - transitivePeerDependencies: - - supports-color - - '@babel/preset-typescript@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - - '@babel/register@7.27.1(@babel/core@7.27.4)': - dependencies: - '@babel/core': 7.27.4 - clone-deep: 4.0.1 - find-cache-dir: 2.1.0 - make-dir: 2.1.0 - pirates: 4.0.7 - source-map-support: 0.5.21 - - '@babel/register@7.27.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - clone-deep: 4.0.1 - find-cache-dir: 2.1.0 - make-dir: 2.1.0 - pirates: 4.0.7 - source-map-support: 0.5.21 - - '@babel/runtime-corejs3@7.27.6': - dependencies: - core-js-pure: 3.43.0 - - '@babel/runtime@7.27.6': {} - - '@babel/template@7.27.2': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - - '@babel/traverse@7.27.4': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 - '@babel/template': 7.27.2 - '@babel/types': 7.27.6 - debug: 4.4.1(supports-color@8.1.1) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/traverse@7.28.0': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.0 - '@babel/template': 7.27.2 - '@babel/types': 7.28.1 - debug: 4.4.1(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - '@babel/types@7.27.6': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - - '@babel/types@7.28.1': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - - '@base2/pretty-print-object@1.0.1': {} - - '@bazel/runfiles@6.3.1': {} - - '@bcoe/v8-coverage@0.2.3': {} - - '@bcoe/v8-coverage@1.0.2': {} - - '@biomejs/biome@1.9.4': - optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.9.4 - '@biomejs/cli-darwin-x64': 1.9.4 - '@biomejs/cli-linux-arm64': 1.9.4 - '@biomejs/cli-linux-arm64-musl': 1.9.4 - '@biomejs/cli-linux-x64': 1.9.4 - '@biomejs/cli-linux-x64-musl': 1.9.4 - '@biomejs/cli-win32-arm64': 1.9.4 - '@biomejs/cli-win32-x64': 1.9.4 - - '@biomejs/cli-darwin-arm64@1.9.4': - optional: true - - '@biomejs/cli-darwin-x64@1.9.4': - optional: true - - '@biomejs/cli-linux-arm64-musl@1.9.4': - optional: true - - '@biomejs/cli-linux-arm64@1.9.4': - optional: true - - '@biomejs/cli-linux-x64-musl@1.9.4': - optional: true - - '@biomejs/cli-linux-x64@1.9.4': - optional: true - - '@biomejs/cli-win32-arm64@1.9.4': - optional: true - - '@biomejs/cli-win32-x64@1.9.4': - optional: true - - '@cnakazawa/watch@1.0.4': - dependencies: - exec-sh: 0.3.6 - minimist: 1.2.8 - - '@codemirror/autocomplete@6.18.6': - dependencies: - '@codemirror/language': 6.11.1 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.37.2 - '@lezer/common': 1.2.3 - - '@codemirror/commands@6.8.1': - dependencies: - '@codemirror/language': 6.11.1 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.37.2 - '@lezer/common': 1.2.3 - - '@codemirror/lang-xml@6.1.0': - dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/language': 6.11.1 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.37.2 - '@lezer/common': 1.2.3 - '@lezer/xml': 1.0.6 - - '@codemirror/language@6.11.1': - dependencies: - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.37.2 - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - style-mod: 4.1.2 - - '@codemirror/lint@6.8.5': - dependencies: - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.37.2 - crelt: 1.0.6 - - '@codemirror/search@6.5.11': - dependencies: - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.37.2 - crelt: 1.0.6 - - '@codemirror/state@6.5.2': - dependencies: - '@marijn/find-cluster-break': 1.0.2 - - '@codemirror/theme-one-dark@6.1.3': - dependencies: - '@codemirror/language': 6.11.1 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.37.2 - '@lezer/highlight': 1.2.1 - - '@codemirror/view@6.37.2': - dependencies: - '@codemirror/state': 6.5.2 - crelt: 1.0.6 - style-mod: 4.1.2 - w3c-keyname: 2.2.8 - - '@colors/colors@1.5.0': - optional: true - - '@colors/colors@1.6.0': {} - - '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': - dependencies: - '@csstools/css-tokenizer': 3.0.4 - - '@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)': - dependencies: - '@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.0)': - dependencies: - postcss-selector-parser: 7.1.0 - - '@dabh/diagnostics@2.0.3': - dependencies: - colorspace: 1.1.4 - enabled: 2.0.0 - kuler: 2.0.0 - - '@date-io/core@3.2.0': {} - - '@date-io/date-fns@3.2.1(date-fns@4.1.0)': - dependencies: - '@date-io/core': 3.2.0 - optionalDependencies: - date-fns: 4.1.0 - - '@discoveryjs/json-ext@0.5.7': {} - - '@discoveryjs/json-ext@0.6.3': {} - - '@dual-bundle/import-meta-resolve@4.1.0': {} - - '@emotion/babel-plugin@11.13.5': - dependencies: - '@babel/helper-module-imports': 7.27.1 - '@babel/runtime': 7.27.6 - '@emotion/hash': 0.9.2 - '@emotion/memoize': 0.9.0 - '@emotion/serialize': 1.3.3 - babel-plugin-macros: 3.1.0 - convert-source-map: 1.9.0 - escape-string-regexp: 4.0.0 - find-root: 1.1.0 - source-map: 0.5.7 - stylis: 4.2.0 - transitivePeerDependencies: - - supports-color - - '@emotion/cache@11.14.0': - dependencies: - '@emotion/memoize': 0.9.0 - '@emotion/sheet': 1.4.0 - '@emotion/utils': 1.4.2 - '@emotion/weak-memoize': 0.4.0 - stylis: 4.2.0 - - '@emotion/css@11.13.5': - dependencies: - '@emotion/babel-plugin': 11.13.5 - '@emotion/cache': 11.14.0 - '@emotion/serialize': 1.3.3 - '@emotion/sheet': 1.4.0 - '@emotion/utils': 1.4.2 - transitivePeerDependencies: - - supports-color - - '@emotion/hash@0.9.2': {} - - '@emotion/is-prop-valid@0.8.8': - dependencies: - '@emotion/memoize': 0.7.4 - optional: true - - '@emotion/is-prop-valid@1.3.1': - dependencies: - '@emotion/memoize': 0.9.0 - - '@emotion/memoize@0.7.4': - optional: true - - '@emotion/memoize@0.9.0': {} - - '@emotion/react@11.14.0(@types/react@17.0.87)(react@19.1.0)': - dependencies: - '@babel/runtime': 7.27.6 - '@emotion/babel-plugin': 11.13.5 - '@emotion/cache': 11.14.0 - '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.1.0) - '@emotion/utils': 1.4.2 - '@emotion/weak-memoize': 0.4.0 - hoist-non-react-statics: 3.3.2 - react: 19.1.0 - optionalDependencies: - '@types/react': 17.0.87 - transitivePeerDependencies: - - supports-color - - '@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.27.6 - '@emotion/babel-plugin': 11.13.5 - '@emotion/cache': 11.14.0 - '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.2.0) - '@emotion/utils': 1.4.2 - '@emotion/weak-memoize': 0.4.0 - hoist-non-react-statics: 3.3.2 - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - transitivePeerDependencies: - - supports-color - - '@emotion/serialize@1.3.3': - dependencies: - '@emotion/hash': 0.9.2 - '@emotion/memoize': 0.9.0 - '@emotion/unitless': 0.10.0 - '@emotion/utils': 1.4.2 - csstype: 3.1.3 - - '@emotion/sheet@1.4.0': {} - - '@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@17.0.87)(react@19.1.0))(@types/react@17.0.87)(react@19.1.0)': - dependencies: - '@babel/runtime': 7.27.6 - '@emotion/babel-plugin': 11.13.5 - '@emotion/is-prop-valid': 1.3.1 - '@emotion/react': 11.14.0(@types/react@17.0.87)(react@19.1.0) - '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@19.1.0) - '@emotion/utils': 1.4.2 - react: 19.1.0 - optionalDependencies: - '@types/react': 17.0.87 - transitivePeerDependencies: - - supports-color - - '@emotion/styled@11.14.0(@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.27.6 - '@emotion/babel-plugin': 11.13.5 - '@emotion/is-prop-valid': 1.3.1 - '@emotion/react': 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/serialize': 1.3.3 - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.2.0) - '@emotion/utils': 1.4.2 - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - transitivePeerDependencies: - - supports-color - - '@emotion/unitless@0.10.0': {} - - '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@18.2.0)': - dependencies: - react: 18.2.0 - - '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@19.1.0)': - dependencies: - react: 19.1.0 - - '@emotion/utils@1.4.2': {} - - '@emotion/weak-memoize@0.4.0': {} - - '@esbuild/aix-ppc64@0.25.5': - optional: true - - '@esbuild/aix-ppc64@0.25.6': - optional: true - - '@esbuild/android-arm64@0.25.5': - optional: true - - '@esbuild/android-arm64@0.25.6': - optional: true - - '@esbuild/android-arm@0.25.5': - optional: true - - '@esbuild/android-arm@0.25.6': - optional: true - - '@esbuild/android-x64@0.25.5': - optional: true - - '@esbuild/android-x64@0.25.6': - optional: true - - '@esbuild/darwin-arm64@0.25.5': - optional: true - - '@esbuild/darwin-arm64@0.25.6': - optional: true - - '@esbuild/darwin-x64@0.25.5': - optional: true - - '@esbuild/darwin-x64@0.25.6': - optional: true - - '@esbuild/freebsd-arm64@0.25.5': - optional: true - - '@esbuild/freebsd-arm64@0.25.6': - optional: true - - '@esbuild/freebsd-x64@0.25.5': - optional: true - - '@esbuild/freebsd-x64@0.25.6': - optional: true - - '@esbuild/linux-arm64@0.25.5': - optional: true - - '@esbuild/linux-arm64@0.25.6': - optional: true - - '@esbuild/linux-arm@0.25.5': - optional: true - - '@esbuild/linux-arm@0.25.6': - optional: true - - '@esbuild/linux-ia32@0.25.5': - optional: true - - '@esbuild/linux-ia32@0.25.6': - optional: true - - '@esbuild/linux-loong64@0.25.5': - optional: true - - '@esbuild/linux-loong64@0.25.6': - optional: true - - '@esbuild/linux-mips64el@0.25.5': - optional: true - - '@esbuild/linux-mips64el@0.25.6': - optional: true - - '@esbuild/linux-ppc64@0.25.5': - optional: true - - '@esbuild/linux-ppc64@0.25.6': - optional: true - - '@esbuild/linux-riscv64@0.25.5': - optional: true - - '@esbuild/linux-riscv64@0.25.6': - optional: true - - '@esbuild/linux-s390x@0.25.5': - optional: true - - '@esbuild/linux-s390x@0.25.6': - optional: true - - '@esbuild/linux-x64@0.25.5': - optional: true - - '@esbuild/linux-x64@0.25.6': - optional: true - - '@esbuild/netbsd-arm64@0.25.5': - optional: true - - '@esbuild/netbsd-arm64@0.25.6': - optional: true - - '@esbuild/netbsd-x64@0.25.5': - optional: true - - '@esbuild/netbsd-x64@0.25.6': - optional: true - - '@esbuild/openbsd-arm64@0.25.5': - optional: true - - '@esbuild/openbsd-arm64@0.25.6': - optional: true - - '@esbuild/openbsd-x64@0.25.5': - optional: true - - '@esbuild/openbsd-x64@0.25.6': - optional: true - - '@esbuild/openharmony-arm64@0.25.6': - optional: true - - '@esbuild/sunos-x64@0.25.5': - optional: true - - '@esbuild/sunos-x64@0.25.6': - optional: true - - '@esbuild/win32-arm64@0.25.5': - optional: true - - '@esbuild/win32-arm64@0.25.6': - optional: true - - '@esbuild/win32-ia32@0.25.5': - optional: true - - '@esbuild/win32-ia32@0.25.6': - optional: true - - '@esbuild/win32-x64@0.25.5': - optional: true - - '@esbuild/win32-x64@0.25.6': - optional: true - - '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/eslint-utils@4.7.0(eslint@9.26.0(jiti@2.4.2))': - dependencies: - eslint: 9.26.0(jiti@2.4.2) - eslint-visitor-keys: 3.4.3 - - '@eslint-community/eslint-utils@4.7.0(eslint@9.27.0(jiti@2.4.2))': - dependencies: - eslint: 9.27.0(jiti@2.4.2) - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.12.1': {} - - '@eslint/config-array@0.20.1': - dependencies: - '@eslint/object-schema': 2.1.6 - debug: 4.4.1(supports-color@8.1.1) - minimatch: 3.1.2 - 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': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/core@0.15.1': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.4.1(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.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/eslintrc@3.3.1': - dependencies: - ajv: 6.12.6 - debug: 4.4.1(supports-color@8.1.1) - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@8.57.1': {} - - '@eslint/js@9.26.0': {} - - '@eslint/js@9.27.0': {} - - '@eslint/object-schema@2.1.6': {} - - '@eslint/plugin-kit@0.3.4': - dependencies: - '@eslint/core': 0.15.1 - levn: 0.4.1 - - '@fal-works/esbuild-plugin-global-externals@2.1.2': {} - - '@floating-ui/core@1.7.1': - dependencies: - '@floating-ui/utils': 0.2.9 - - '@floating-ui/core@1.7.2': - dependencies: - '@floating-ui/utils': 0.2.10 - - '@floating-ui/dom@1.7.1': - dependencies: - '@floating-ui/core': 1.7.1 - '@floating-ui/utils': 0.2.9 - - '@floating-ui/dom@1.7.2': - dependencies: - '@floating-ui/core': 1.7.2 - '@floating-ui/utils': 0.2.10 - - '@floating-ui/react-dom@2.1.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@floating-ui/dom': 1.7.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@floating-ui/react-dom@2.1.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@floating-ui/dom': 1.7.2 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.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.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@floating-ui/utils': 0.2.9 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - tabbable: 6.2.0 - - '@floating-ui/utils@0.2.10': {} - - '@floating-ui/utils@0.2.9': {} - - '@formatjs/ecma402-abstract@2.3.4': - dependencies: - '@formatjs/fast-memoize': 2.2.7 - '@formatjs/intl-localematcher': 0.6.1 - decimal.js: 10.5.0 - tslib: 2.8.1 - - '@formatjs/fast-memoize@2.2.7': - dependencies: - tslib: 2.8.1 - - '@formatjs/icu-messageformat-parser@2.11.2': - dependencies: - '@formatjs/ecma402-abstract': 2.3.4 - '@formatjs/icu-skeleton-parser': 1.8.14 - tslib: 2.8.1 - - '@formatjs/icu-skeleton-parser@1.8.14': - dependencies: - '@formatjs/ecma402-abstract': 2.3.4 - tslib: 2.8.1 - - '@formatjs/intl-localematcher@0.6.1': - dependencies: - tslib: 2.8.1 - - '@formatjs/intl@3.1.6(typescript@4.9.5)': - dependencies: - '@formatjs/ecma402-abstract': 2.3.4 - '@formatjs/fast-memoize': 2.2.7 - '@formatjs/icu-messageformat-parser': 2.11.2 - intl-messageformat: 10.7.16 - tslib: 2.8.1 - optionalDependencies: - typescript: 4.9.5 - - '@formatjs/intl@3.1.6(typescript@5.8.3)': - dependencies: - '@formatjs/ecma402-abstract': 2.3.4 - '@formatjs/fast-memoize': 2.2.7 - '@formatjs/icu-messageformat-parser': 2.11.2 - intl-messageformat: 10.7.16 - tslib: 2.8.1 - optionalDependencies: - typescript: 5.8.3 - - '@formkit/auto-animate@0.8.2': {} - - '@gar/promisify@1.1.3': {} - - '@graphiql/react@0.26.2(@codemirror/language@6.11.1)(@types/node@24.0.14)(@types/react-dom@18.2.0)(@types/react@18.2.0)(graphql@16.11.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@graphiql/toolkit': 0.11.3(@types/node@24.0.14)(graphql@16.11.0) - '@headlessui/react': 1.7.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-dialog': 1.1.14(@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-dropdown-menu': 2.1.15(@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.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-visually-hidden': 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) - '@types/codemirror': 5.60.16 - clsx: 1.2.1 - codemirror: 5.65.19 - codemirror-graphql: 2.2.3(@codemirror/language@6.11.1)(codemirror@5.65.19)(graphql@16.11.0) - copy-to-clipboard: 3.3.3 - framer-motion: 6.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - get-value: 3.0.1 - graphql: 16.11.0 - graphql-language-service: 5.4.0(graphql@16.11.0) - markdown-it: 14.1.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - set-value: 4.1.0 - transitivePeerDependencies: - - '@codemirror/language' - - '@types/node' - - '@types/react' - - '@types/react-dom' - - graphql-ws - - '@graphiql/toolkit@0.11.3(@types/node@24.0.14)(graphql@16.11.0)': - dependencies: - '@n1ru4l/push-pull-async-iterable-iterator': 3.2.0 - graphql: 16.11.0 - meros: 1.3.1(@types/node@24.0.14) - transitivePeerDependencies: - - '@types/node' - - '@hapi/hoek@9.3.0': {} - - '@hapi/topo@5.1.0': - dependencies: - '@hapi/hoek': 9.3.0 - - '@headlessui/react@1.7.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@tanstack/react-virtual': 3.13.10(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@2.2.4(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.20.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@react-aria/interactions': 3.25.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@tanstack/react-virtual': 3.13.10(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.5.0(react@18.2.0) - - '@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) - - '@hookform/resolvers@5.0.1(react-hook-form@7.56.4(react@18.2.0))': - dependencies: - '@standard-schema/utils': 0.3.0 - react-hook-form: 7.56.4(react@18.2.0) - - '@humanfs/core@0.19.1': {} - - '@humanfs/node@0.16.6': - dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 - - '@humanwhocodes/config-array@0.13.0': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.1(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.3.1': {} - - '@humanwhocodes/retry@0.4.3': {} - - '@iarna/toml@2.2.5': {} - - '@isaacs/balanced-match@4.0.1': {} - - '@isaacs/brace-expansion@5.0.0': - dependencies: - '@isaacs/balanced-match': 4.0.1 - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@istanbuljs/load-nyc-config@1.1.0': - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - - '@istanbuljs/schema@0.1.3': {} - - '@jest/console@25.5.0': - dependencies: - '@jest/types': 25.5.0 - chalk: 3.0.0 - jest-message-util: 25.5.0 - jest-util: 25.5.0 - slash: 3.0.0 - - '@jest/console@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@types/node': 22.15.32 - chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - - '@jest/core@25.5.4': - dependencies: - '@jest/console': 25.5.0 - '@jest/reporters': 25.5.1 - '@jest/test-result': 25.5.0 - '@jest/transform': 25.5.1 - '@jest/types': 25.5.0 - ansi-escapes: 4.3.2 - chalk: 3.0.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 25.5.0 - jest-config: 25.5.4 - jest-haste-map: 25.5.1 - jest-message-util: 25.5.0 - jest-regex-util: 25.2.6 - jest-resolve: 25.5.1 - jest-resolve-dependencies: 25.5.4 - jest-runner: 25.5.4 - jest-runtime: 25.5.4 - jest-snapshot: 25.5.1 - jest-util: 25.5.0 - jest-validate: 25.5.0 - jest-watcher: 25.5.0 - micromatch: 4.0.8 - p-each-series: 2.2.0 - realpath-native: 2.0.0 - rimraf: 3.0.2 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.15.32 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.15.32)(babel-plugin-macros@3.1.0) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - - '@jest/environment@25.5.0': - dependencies: - '@jest/fake-timers': 25.5.0 - '@jest/types': 25.5.0 - jest-mock: 25.5.0 - - '@jest/environment@29.7.0': - dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.15.32 - jest-mock: 29.7.0 - - '@jest/expect-utils@29.7.0': - dependencies: - jest-get-type: 29.6.3 - - '@jest/expect@29.7.0': - dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - - '@jest/fake-timers@25.5.0': - dependencies: - '@jest/types': 25.5.0 - jest-message-util: 25.5.0 - jest-mock: 25.5.0 - jest-util: 25.5.0 - lolex: 5.1.2 - - '@jest/fake-timers@29.7.0': - dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.15.32 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 - - '@jest/globals@25.5.2': - dependencies: - '@jest/environment': 25.5.0 - '@jest/types': 25.5.0 - expect: 25.5.0 - - '@jest/globals@29.7.0': - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 - jest-mock: 29.7.0 - transitivePeerDependencies: - - supports-color - - '@jest/reporters@25.5.1': - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 25.5.0 - '@jest/test-result': 25.5.0 - '@jest/transform': 25.5.1 - '@jest/types': 25.5.0 - chalk: 3.0.0 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 4.0.3 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 - jest-haste-map: 25.5.1 - jest-resolve: 25.5.1 - jest-util: 25.5.0 - jest-worker: 25.5.0 - slash: 3.0.0 - source-map: 0.6.1 - string-length: 3.1.0 - terminal-link: 2.1.1 - v8-to-istanbul: 4.1.4 - optionalDependencies: - node-notifier: 6.0.0 - transitivePeerDependencies: - - supports-color - - '@jest/reporters@29.7.0': - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 22.15.32 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.3 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.3.0 - transitivePeerDependencies: - - supports-color - - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - - '@jest/source-map@25.5.0': - dependencies: - callsites: 3.1.0 - graceful-fs: 4.2.11 - source-map: 0.6.1 - - '@jest/source-map@29.6.3': - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - callsites: 3.1.0 - graceful-fs: 4.2.11 - - '@jest/test-result@25.5.0': - dependencies: - '@jest/console': 25.5.0 - '@jest/types': 25.5.0 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 - - '@jest/test-result@29.7.0': - dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 - - '@jest/test-sequencer@25.5.4': - dependencies: - '@jest/test-result': 25.5.0 - graceful-fs: 4.2.11 - jest-haste-map: 25.5.1 - jest-runner: 25.5.4 - jest-runtime: 25.5.4 - transitivePeerDependencies: - - supports-color - - '@jest/test-sequencer@29.7.0': - dependencies: - '@jest/test-result': 29.7.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - slash: 3.0.0 - - '@jest/transform@25.5.1': - dependencies: - '@babel/core': 7.27.4 - '@jest/types': 25.5.0 - babel-plugin-istanbul: 6.1.1 - chalk: 3.0.0 - convert-source-map: 1.9.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 25.5.1 - jest-regex-util: 25.2.6 - jest-util: 25.5.0 - micromatch: 4.0.8 - pirates: 4.0.7 - realpath-native: 2.0.0 - slash: 3.0.0 - source-map: 0.6.1 - write-file-atomic: 3.0.3 - transitivePeerDependencies: - - supports-color - - '@jest/transform@26.6.2': - dependencies: - '@babel/core': 7.27.4 - '@jest/types': 26.6.2 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 1.9.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 26.6.2 - jest-regex-util: 26.0.0 - jest-util: 26.6.2 - micromatch: 4.0.8 - pirates: 4.0.7 - slash: 3.0.0 - source-map: 0.6.1 - write-file-atomic: 3.0.3 - transitivePeerDependencies: - - supports-color - - '@jest/transform@29.7.0': - dependencies: - '@babel/core': 7.27.4 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.8 - pirates: 4.0.7 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - - '@jest/types@25.5.0': - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 1.1.2 - '@types/yargs': 15.0.19 - chalk: 3.0.0 - - '@jest/types@26.6.2': - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 22.15.32 - '@types/yargs': 15.0.19 - chalk: 4.1.2 - - '@jest/types@29.6.3': - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 22.15.32 - '@types/yargs': 17.0.33 - chalk: 4.1.2 - - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))': - dependencies: - glob: 10.4.5 - magic-string: 0.30.17 - react-docgen-typescript: 2.4.0(typescript@5.8.3) - vite: 6.3.5(@types/node@24.0.14)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) - optionalDependencies: - typescript: 5.8.3 - - '@jridgewell/gen-mapping@0.3.12': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 - '@jridgewell/trace-mapping': 0.3.29 - - '@jridgewell/gen-mapping@0.3.8': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/source-map@0.3.6': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/sourcemap-codec@1.5.4': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@jridgewell/trace-mapping@0.3.29': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 - - '@jsdevtools/ono@7.1.3': {} - - '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/json-pack@1.2.0(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) - '@jsonjoy.com/util': 1.6.0(tslib@2.8.1) - hyperdyperid: 1.2.0 - thingies: 1.21.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/util@1.6.0(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@juggle/resize-observer@3.4.0': {} - - '@keyv/serialize@1.0.3': - dependencies: - buffer: 6.0.3 - - '@leichtgewicht/ip-codec@2.0.5': {} - - '@lezer/common@1.2.3': {} - - '@lezer/highlight@1.2.1': - dependencies: - '@lezer/common': 1.2.3 - - '@lezer/lr@1.4.2': - dependencies: - '@lezer/common': 1.2.3 - - '@lezer/xml@1.0.6': - dependencies: - '@lezer/common': 1.2.3 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - - '@marijn/find-cluster-break@1.0.2': {} - - '@mdx-js/mdx@1.6.22': - dependencies: - '@babel/core': 7.12.9 - '@babel/plugin-syntax-jsx': 7.12.1(@babel/core@7.12.9) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.12.9) - '@mdx-js/util': 1.6.22 - babel-plugin-apply-mdx-type-prop: 1.6.22(@babel/core@7.12.9) - babel-plugin-extract-import-names: 1.6.22 - camelcase-css: 2.0.1 - detab: 2.0.4 - hast-util-raw: 6.0.1 - lodash.uniq: 4.5.0 - mdast-util-to-hast: 10.0.1 - remark-footnotes: 2.0.0 - remark-mdx: 1.6.22 - remark-parse: 8.0.3 - remark-squeeze-paragraphs: 4.0.0 - style-to-object: 0.3.0 - unified: 9.2.0 - unist-builder: 2.0.3 - unist-util-visit: 2.0.3 - transitivePeerDependencies: - - supports-color - - '@mdx-js/react@1.6.22(react@18.2.0)': - dependencies: - react: 18.2.0 - - '@mdx-js/react@2.3.0(react@18.2.0)': - dependencies: - '@types/mdx': 2.0.13 - '@types/react': 18.2.0 - react: 18.2.0 - - '@mdx-js/react@3.1.0(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@types/mdx': 2.0.13 - '@types/react': 18.2.0 - react: 18.2.0 - - '@mdx-js/util@1.6.22': {} - - '@microsoft/1ds-core-js@4.3.8(tslib@2.8.1)': - dependencies: - '@microsoft/applicationinsights-core-js': 3.3.8(tslib@2.8.1) - '@microsoft/applicationinsights-shims': 3.0.1 - '@microsoft/dynamicproto-js': 2.0.3 - '@nevware21/ts-async': 0.5.4 - '@nevware21/ts-utils': 0.12.5 - transitivePeerDependencies: - - tslib - - '@microsoft/1ds-post-js@4.3.8(tslib@2.8.1)': - dependencies: - '@microsoft/1ds-core-js': 4.3.8(tslib@2.8.1) - '@microsoft/applicationinsights-shims': 3.0.1 - '@microsoft/dynamicproto-js': 2.0.3 - '@nevware21/ts-async': 0.5.4 - '@nevware21/ts-utils': 0.12.5 - transitivePeerDependencies: - - tslib - - '@microsoft/applicationinsights-channel-js@3.3.8(tslib@2.8.1)': - dependencies: - '@microsoft/applicationinsights-common': 3.3.8(tslib@2.8.1) - '@microsoft/applicationinsights-core-js': 3.3.8(tslib@2.8.1) - '@microsoft/applicationinsights-shims': 3.0.1 - '@microsoft/dynamicproto-js': 2.0.3 - '@nevware21/ts-async': 0.5.4 - '@nevware21/ts-utils': 0.12.5 - tslib: 2.8.1 - - '@microsoft/applicationinsights-common@3.3.8(tslib@2.8.1)': - dependencies: - '@microsoft/applicationinsights-core-js': 3.3.8(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.8(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-utils': 0.12.5 - tslib: 2.8.1 - - '@microsoft/applicationinsights-shims@3.0.1': - dependencies: - '@nevware21/ts-utils': 0.12.5 - - '@microsoft/applicationinsights-web-basic@3.3.8(tslib@2.8.1)': - dependencies: - '@microsoft/applicationinsights-channel-js': 3.3.8(tslib@2.8.1) - '@microsoft/applicationinsights-common': 3.3.8(tslib@2.8.1) - '@microsoft/applicationinsights-core-js': 3.3.8(tslib@2.8.1) - '@microsoft/applicationinsights-shims': 3.0.1 - '@microsoft/dynamicproto-js': 2.0.3 - '@nevware21/ts-async': 0.5.4 - '@nevware21/ts-utils': 0.12.5 - tslib: 2.8.1 - - '@microsoft/dynamicproto-js@2.0.3': - dependencies: - '@nevware21/ts-utils': 0.12.5 - - '@microsoft/fast-element@1.14.0': {} - - '@microsoft/fast-foundation@2.50.0': - dependencies: - '@microsoft/fast-element': 1.14.0 - '@microsoft/fast-web-utilities': 5.4.1 - tabbable: 5.3.3 - tslib: 1.14.1 - - '@microsoft/fast-react-wrapper@0.3.25(react@18.2.0)': - dependencies: - '@microsoft/fast-element': 1.14.0 - '@microsoft/fast-foundation': 2.50.0 - react: 18.2.0 - - '@microsoft/fast-react-wrapper@0.3.25(react@19.1.0)': - dependencies: - '@microsoft/fast-element': 1.14.0 - '@microsoft/fast-foundation': 2.50.0 - react: 19.1.0 - - '@microsoft/fast-web-utilities@5.4.1': - dependencies: - exenv-es6: 1.1.1 - - '@modelcontextprotocol/sdk@1.13.0': - dependencies: - ajv: 6.12.6 - content-type: 1.0.5 - cors: 2.8.5 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - express: 5.1.0 - express-rate-limit: 7.5.1(express@5.1.0) - pkce-challenge: 5.0.0 - raw-body: 3.0.0 - zod: 3.25.67 - zod-to-json-schema: 3.24.5(zod@3.25.67) - transitivePeerDependencies: - - supports-color - - '@monaco-editor/loader@1.5.0': - dependencies: - state-local: 1.0.7 - - '@monaco-editor/react@4.7.0(monaco-editor@0.52.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@monaco-editor/loader': 1.5.0 - monaco-editor: 0.52.2 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@motionone/animation@10.18.0': - dependencies: - '@motionone/easing': 10.18.0 - '@motionone/types': 10.17.1 - '@motionone/utils': 10.18.0 - tslib: 2.8.1 - - '@motionone/dom@10.12.0': - dependencies: - '@motionone/animation': 10.18.0 - '@motionone/generators': 10.18.0 - '@motionone/types': 10.17.1 - '@motionone/utils': 10.18.0 - hey-listen: 1.0.8 - tslib: 2.8.1 - - '@motionone/easing@10.18.0': - dependencies: - '@motionone/utils': 10.18.0 - tslib: 2.8.1 - - '@motionone/generators@10.18.0': - dependencies: - '@motionone/types': 10.17.1 - '@motionone/utils': 10.18.0 - tslib: 2.8.1 - - '@motionone/types@10.17.1': {} - - '@motionone/utils@10.18.0': - dependencies: - '@motionone/types': 10.17.1 - hey-listen: 1.0.8 - tslib: 2.8.1 - - '@mrmlnc/readdir-enhanced@2.2.1': - dependencies: - call-me-maybe: 1.0.2 - glob-to-regexp: 0.3.0 - - '@n1ru4l/push-pull-async-iterable-iterator@3.2.0': {} - - '@ndelangen/get-tarball@3.0.9': - dependencies: - gunzip-maybe: 1.4.2 - pump: 3.0.3 - tar-fs: 2.1.3 - - '@nevware21/ts-async@0.5.4': - dependencies: - '@nevware21/ts-utils': 0.12.5 - - '@nevware21/ts-utils@0.12.5': {} - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@1.1.3': {} - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 - - '@npmcli/fs@1.1.1': - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.7.2 - - '@npmcli/fs@2.1.2': - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.7.2 - - '@npmcli/move-file@1.1.2': - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - - '@npmcli/move-file@2.0.1': - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - - '@oozcitak/dom@1.15.10': - dependencies: - '@oozcitak/infra': 1.0.8 - '@oozcitak/url': 1.0.4 - '@oozcitak/util': 8.3.8 - - '@oozcitak/infra@1.0.8': - dependencies: - '@oozcitak/util': 8.3.8 - - '@oozcitak/url@1.0.4': - dependencies: - '@oozcitak/infra': 1.0.8 - '@oozcitak/util': 8.3.8 - - '@oozcitak/util@8.3.8': {} - - '@parcel/watcher-android-arm64@2.5.1': - optional: true - - '@parcel/watcher-darwin-arm64@2.5.1': - optional: true - - '@parcel/watcher-darwin-x64@2.5.1': - optional: true - - '@parcel/watcher-freebsd-x64@2.5.1': - optional: true - - '@parcel/watcher-linux-arm-glibc@2.5.1': - optional: true - - '@parcel/watcher-linux-arm-musl@2.5.1': - optional: true - - '@parcel/watcher-linux-arm64-glibc@2.5.1': - optional: true - - '@parcel/watcher-linux-arm64-musl@2.5.1': - optional: true - - '@parcel/watcher-linux-x64-glibc@2.5.1': - optional: true - - '@parcel/watcher-linux-x64-musl@2.5.1': - optional: true - - '@parcel/watcher-win32-arm64@2.5.1': - optional: true - - '@parcel/watcher-win32-ia32@2.5.1': - optional: true - - '@parcel/watcher-win32-x64@2.5.1': - optional: true - - '@parcel/watcher@2.5.1': - dependencies: - detect-libc: 1.0.3 - is-glob: 4.0.3 - micromatch: 4.0.8 - node-addon-api: 7.1.1 - 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 - optional: true - - '@pkgjs/parseargs@0.11.0': - optional: true - - '@playwright/test@1.52.0': - dependencies: - playwright: 1.52.0 - - '@pmmmwh/react-refresh-webpack-plugin@0.5.16(@types/webpack@5.28.5(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)))(webpack-hot-middleware@2.26.1)(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6))': - dependencies: - ansi-html: 0.0.9 - core-js-pure: 3.43.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.2 - source-map: 0.7.4 - webpack: 5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6) - optionalDependencies: - '@types/webpack': 5.28.5(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6) - type-fest: 4.41.0 - webpack-dev-server: 5.2.2(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)) - webpack-hot-middleware: 2.26.1 - - '@pmmmwh/react-refresh-webpack-plugin@0.5.16(@types/webpack@5.28.5(esbuild@0.25.5)(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.100.2)': - dependencies: - ansi-html: 0.0.9 - core-js-pure: 3.43.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.2 - source-map: 0.7.4 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - optionalDependencies: - '@types/webpack': 5.28.5(esbuild@0.25.5)(webpack-cli@6.0.1) - type-fest: 4.41.0 - webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) - webpack-hot-middleware: 2.26.1 - - '@pmmmwh/react-refresh-webpack-plugin@0.5.16(@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.100.2)': - dependencies: - ansi-html: 0.0.9 - core-js-pure: 3.43.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.2 - source-map: 0.7.4 - webpack: 5.100.2(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.100.2) - webpack-hot-middleware: 2.26.1 - - '@pmmmwh/react-refresh-webpack-plugin@0.5.16(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.100.2))(webpack-hot-middleware@2.26.1)(webpack@5.100.2)': - dependencies: - ansi-html: 0.0.9 - core-js-pure: 3.43.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.2 - source-map: 0.7.4 - webpack: 5.100.2(webpack-cli@4.10.0) - optionalDependencies: - '@types/webpack': 5.28.5 - type-fest: 4.41.0 - webpack-dev-server: 5.2.2(webpack@5.100.2) - webpack-hot-middleware: 2.26.1 - - '@pmmmwh/react-refresh-webpack-plugin@0.6.0(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.17.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.100.2)': - dependencies: - anser: 2.3.2 - core-js-pure: 3.43.0 - error-stack-parser: 2.1.4 - html-entities: 2.6.0 - react-refresh: 0.17.0 - schema-utils: 4.3.2 - source-map: 0.7.4 - webpack: 5.100.2(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.100.2) - webpack-hot-middleware: 2.26.1 - - '@projectstorm/geometry@6.7.4': {} - - '@projectstorm/geometry@7.0.3': - dependencies: - lodash: 4.17.21 - - '@projectstorm/react-canvas-core@6.7.4(lodash@4.17.21)(react@18.2.0)': - dependencies: - '@projectstorm/geometry': 6.7.4 - lodash: 4.17.21 - react: 18.2.0 - - '@projectstorm/react-canvas-core@7.0.3(@types/react@18.2.0)': - dependencies: - '@emotion/react': 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': 11.14.0(@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 - 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)': - 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 - react: 18.2.0 - resize-observer-polyfill: 1.5.1 - - '@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)': - dependencies: - '@emotion/styled': 11.14.0(@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 - react: 18.2.0 - resize-observer-polyfill: 1.5.1 - transitivePeerDependencies: - - '@emotion/react' - - '@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.0(@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)': - dependencies: - '@emotion/react': 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': 11.14.0(@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 - react: 18.2.0 - transitivePeerDependencies: - - resize-observer-polyfill - - '@projectstorm/react-diagrams-defaults@7.1.3(@types/react@18.2.0)': - dependencies: - '@emotion/react': 11.14.0(@types/react@18.2.0)(react@18.2.0) - '@emotion/styled': 11.14.0(@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) - '@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 - 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.0(@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)': - 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.0(@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) - dagre: 0.8.5 - lodash: 4.17.21 - pathfinding: 0.4.18 - paths-js: 0.4.11 - react: 18.2.0 - transitivePeerDependencies: - - '@emotion/react' - - '@emotion/styled' - - resize-observer-polyfill - - '@projectstorm/react-diagrams-routing@7.1.3(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)': - dependencies: - '@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) - '@projectstorm/react-diagrams-defaults': 7.1.3(@types/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 - transitivePeerDependencies: - - '@emotion/react' - - '@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.0(@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)': - 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.0(@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.0(@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) - transitivePeerDependencies: - - '@emotion/react' - - '@emotion/styled' - - dagre - - lodash - - pathfinding - - paths-js - - react - - resize-observer-polyfill - - '@projectstorm/react-diagrams@7.0.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)': - dependencies: - '@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) - '@projectstorm/react-diagrams-defaults': 7.1.3(@types/react@18.2.0) - '@projectstorm/react-diagrams-routing': 7.1.3(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) - transitivePeerDependencies: - - '@emotion/react' - - '@types/react' - - supports-color - - '@radix-ui/number@1.0.1': - dependencies: - '@babel/runtime': 7.27.6 - - '@radix-ui/primitive@1.0.1': - dependencies: - '@babel/runtime': 7.27.6 - - '@radix-ui/primitive@1.1.2': {} - - '@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.27.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) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 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)': - dependencies: - '@radix-ui/react-primitive': 2.1.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) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@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.27.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) - '@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) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-collection@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)': - dependencies: - '@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) - '@radix-ui/react-primitive': 2.1.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-slot': 1.2.3(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.27.6 - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-compose-refs@1.1.2(@types/react@18.2.0)(react@18.2.0)': - dependencies: - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-context@1.0.1(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.27.6 - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-context@1.1.2(@types/react@18.2.0)(react@18.2.0)': - dependencies: - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-dialog@1.1.14(@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: - '@radix-ui/primitive': 1.1.2 - '@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) - '@radix-ui/react-dismissable-layer': 1.1.10(@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-focus-guards': 1.1.2(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-scope': 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-id': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.1.9(@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-presence': 1.1.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) - '@radix-ui/react-primitive': 2.1.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-slot': 1.2.3(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.2.0)(react@18.2.0) - aria-hidden: 1.2.6 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.7.1(@types/react@18.2.0)(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-direction@1.0.1(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.27.6 - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-direction@1.1.1(@types/react@18.2.0)(react@18.2.0)': - dependencies: - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@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.27.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) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-dismissable-layer@1.1.10(@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: - '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 2.1.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.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-dropdown-menu@2.1.15(@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: - '@radix-ui/primitive': 1.1.2 - '@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) - '@radix-ui/react-id': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-menu': 2.1.15(@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-primitive': 2.1.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-controllable-state': 1.2.2(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.27.6 - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-focus-guards@1.1.2(@types/react@18.2.0)(react@18.2.0)': - dependencies: - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@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.27.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) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-focus-scope@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)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 2.1.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.1.1(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-id@1.0.1(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.27.6 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-id@1.1.1(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-menu@2.1.15(@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: - '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 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) - '@radix-ui/react-direction': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.1.10(@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-focus-guards': 1.1.2(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-scope': 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-id': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-popper': 1.2.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-portal': 1.1.9(@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-presence': 1.1.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) - '@radix-ui/react-primitive': 2.1.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-roving-focus': 1.1.10(@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-slot': 1.2.3(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.2.0)(react@18.2.0) - aria-hidden: 1.2.6 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.7.1(@types/react@18.2.0)(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@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.27.6 - '@floating-ui/react-dom': 2.1.3(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) - '@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) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/rect': 1.0.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-popper@1.2.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)': - dependencies: - '@floating-ui/react-dom': 2.1.4(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) - '@radix-ui/react-primitive': 2.1.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.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-use-rect': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/rect': 1.1.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@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.27.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) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-portal@1.1.9(@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: - '@radix-ui/react-primitive': 2.1.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-layout-effect': 1.1.1(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-presence@1.1.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: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 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)': - dependencies: - '@babel/runtime': 7.27.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) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-primitive@2.1.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: - '@radix-ui/react-slot': 1.2.3(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-roving-focus@1.1.10(@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: - '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 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) - '@radix-ui/react-direction': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 2.1.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.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@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.27.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) - '@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-direction': 1.0.1(@types/react@18.2.0)(react@18.2.0) - '@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) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.0)(react@18.2.0) - '@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) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.0)(react@18.2.0) - '@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) - '@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) - '@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-slot': 1.0.2(@types/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) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.0)(react@18.2.0) - '@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) - aria-hidden: 1.2.6 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.0)(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-separator@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)': - dependencies: - '@radix-ui/react-primitive': 2.1.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) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-slot@1.0.2(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.27.6 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-slot@1.2.3(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-toggle-group@1.1.10(@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: - '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 2.1.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-roving-focus': 1.1.10(@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-toggle': 1.1.9(@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-controllable-state': 1.2.2(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-toggle@1.1.9(@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: - '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-primitive': 2.1.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-controllable-state': 1.2.2(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-toolbar@1.1.10(@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: - '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 2.1.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-roving-focus': 1.1.10(@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-separator': 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-toggle-group': 1.1.10(@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) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-tooltip@1.2.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)': - dependencies: - '@radix-ui/primitive': 1.1.2 - '@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) - '@radix-ui/react-dismissable-layer': 1.1.10(@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-id': 1.1.1(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-popper': 1.2.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-portal': 1.1.9(@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-presence': 1.1.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) - '@radix-ui/react-primitive': 2.1.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-slot': 1.2.3(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-visually-hidden': 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) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.27.6 - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@18.2.0)(react@18.2.0)': - dependencies: - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.27.6 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.2.0)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-use-effect-event@0.0.2(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.27.6 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.2.0)(react@18.2.0) - 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@18.2.0)': - dependencies: - '@babel/runtime': 7.27.6 - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.2.0)(react@18.2.0)': - dependencies: - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-use-previous@1.0.1(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.27.6 - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-use-rect@1.0.1(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.27.6 - '@radix-ui/rect': 1.0.1 - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-use-rect@1.1.1(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@radix-ui/rect': 1.1.1 - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-use-size@1.0.1(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@babel/runtime': 7.27.6 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@radix-ui/react-use-size@1.1.1(@types/react@18.2.0)(react@18.2.0)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.2.0)(react@18.2.0) - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - '@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.27.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) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/react-visually-hidden@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)': - dependencies: - '@radix-ui/react-primitive': 2.1.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) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@radix-ui/rect@1.0.1': - dependencies: - '@babel/runtime': 7.27.6 - - '@radix-ui/rect@1.1.1': {} - - '@react-aria/focus@3.20.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@react-aria/interactions': 3.25.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@react-aria/utils': 3.29.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@react-types/shared': 3.30.0(react@18.2.0) - '@swc/helpers': 0.5.17 - clsx: 2.1.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@react-aria/interactions@3.25.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@react-aria/ssr': 3.9.9(react@18.2.0) - '@react-aria/utils': 3.29.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@react-stately/flags': 3.1.2 - '@react-types/shared': 3.30.0(react@18.2.0) - '@swc/helpers': 0.5.17 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@react-aria/ssr@3.9.9(react@18.2.0)': - dependencies: - '@swc/helpers': 0.5.17 - react: 18.2.0 - - '@react-aria/utils@3.29.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@react-aria/ssr': 3.9.9(react@18.2.0) - '@react-stately/flags': 3.1.2 - '@react-stately/utils': 3.10.7(react@18.2.0) - '@react-types/shared': 3.30.0(react@18.2.0) - '@swc/helpers': 0.5.17 - clsx: 2.1.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@react-dnd/asap@5.0.2': {} - - '@react-dnd/invariant@4.0.2': {} - - '@react-dnd/shallowequal@4.0.2': {} - - '@react-stately/flags@3.1.2': - dependencies: - '@swc/helpers': 0.5.17 - - '@react-stately/utils@3.10.7(react@18.2.0)': - dependencies: - '@swc/helpers': 0.5.17 - react: 18.2.0 - - '@react-types/shared@3.30.0(react@18.2.0)': - dependencies: - react: 18.2.0 - - '@redhat-developer/locators@1.13.0(@redhat-developer/page-objects@1.13.0(selenium-webdriver@4.33.0)(typescript@5.8.3))(selenium-webdriver@4.33.0)': - dependencies: - '@redhat-developer/page-objects': 1.13.0(selenium-webdriver@4.33.0)(typescript@5.8.3) - selenium-webdriver: 4.33.0 - - '@redhat-developer/page-objects@1.13.0(selenium-webdriver@4.33.0)(typescript@5.8.3)': - dependencies: - clipboardy: 4.0.0 - clone-deep: 4.0.1 - compare-versions: 6.1.1 - fs-extra: 11.3.0 - selenium-webdriver: 4.33.0 - type-fest: 4.41.0 - typescript: 5.8.3 - - '@rolldown/pluginutils@1.0.0-beta.11': {} - - '@rollup/plugin-babel@5.3.1(@babel/core@7.27.4)(@types/babel__core@7.20.5)(rollup@1.32.1)': - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-imports': 7.27.1 - '@rollup/pluginutils': 3.1.0(rollup@1.32.1) - rollup: 1.32.1 - optionalDependencies: - '@types/babel__core': 7.20.5 - transitivePeerDependencies: - - supports-color - - '@rollup/plugin-commonjs@11.1.0(rollup@1.32.1)': - dependencies: - '@rollup/pluginutils': 3.1.0(rollup@1.32.1) - commondir: 1.0.1 - estree-walker: 1.0.1 - glob: 7.2.3 - is-reference: 1.2.1 - magic-string: 0.25.9 - resolve: 1.22.10 - rollup: 1.32.1 - - '@rollup/plugin-commonjs@28.0.6(rollup@4.44.0)': - dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.44.0) - commondir: 1.0.1 - estree-walker: 2.0.2 - fdir: 6.4.6(picomatch@4.0.2) - is-reference: 1.2.1 - magic-string: 0.30.17 - picomatch: 4.0.2 - optionalDependencies: - rollup: 4.44.0 - - '@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.44.0)': - dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.44.0) - optionalDependencies: - rollup: 4.44.0 - - '@rollup/plugin-node-resolve@16.0.1(rollup@4.44.0)': - dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.44.0) - '@types/resolve': 1.20.2 - deepmerge: 4.3.1 - is-module: 1.0.0 - resolve: 1.22.10 - optionalDependencies: - rollup: 4.44.0 - - '@rollup/plugin-node-resolve@9.0.0(rollup@1.32.1)': - dependencies: - '@rollup/pluginutils': 3.1.0(rollup@1.32.1) - '@types/resolve': 1.17.1 - builtin-modules: 3.3.0 - deepmerge: 4.3.1 - is-module: 1.0.0 - resolve: 1.22.10 - rollup: 1.32.1 - - '@rollup/plugin-replace@2.4.2(rollup@1.32.1)': - dependencies: - '@rollup/pluginutils': 3.1.0(rollup@1.32.1) - magic-string: 0.25.9 - rollup: 1.32.1 - - '@rollup/pluginutils@3.1.0(rollup@1.32.1)': - dependencies: - '@types/estree': 0.0.39 - estree-walker: 1.0.1 - picomatch: 2.3.1 - rollup: 1.32.1 - - '@rollup/pluginutils@4.2.1': - dependencies: - estree-walker: 2.0.2 - picomatch: 2.3.1 - - '@rollup/pluginutils@5.2.0(rollup@4.44.0)': - dependencies: - '@types/estree': 1.0.8 - estree-walker: 2.0.2 - picomatch: 4.0.3 - optionalDependencies: - rollup: 4.44.0 - - '@rollup/rollup-android-arm-eabi@4.44.0': - optional: true - - '@rollup/rollup-android-arm64@4.44.0': - optional: true - - '@rollup/rollup-darwin-arm64@4.44.0': - optional: true - - '@rollup/rollup-darwin-x64@4.44.0': - optional: true - - '@rollup/rollup-freebsd-arm64@4.44.0': - optional: true - - '@rollup/rollup-freebsd-x64@4.44.0': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.44.0': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.44.0': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.44.0': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.44.0': - optional: true - - '@rollup/rollup-linux-loongarch64-gnu@4.44.0': - optional: true - - '@rollup/rollup-linux-powerpc64le-gnu@4.44.0': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.44.0': - optional: true - - '@rollup/rollup-linux-riscv64-musl@4.44.0': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.44.0': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.44.0': - optional: true - - '@rollup/rollup-linux-x64-musl@4.44.0': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.44.0': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.44.0': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.44.0': - optional: true - - '@rtsao/scc@1.1.0': {} - - '@scarf/scarf@1.4.0': {} - - '@sec-ant/readable-stream@0.4.1': {} - - '@secretlint/config-creator@9.3.4': - dependencies: - '@secretlint/types': 9.3.4 - - '@secretlint/config-loader@9.3.4': - dependencies: - '@secretlint/profiler': 9.3.4 - '@secretlint/resolver': 9.3.4 - '@secretlint/types': 9.3.4 - ajv: 8.17.1 - debug: 4.4.1(supports-color@8.1.1) - rc-config-loader: 4.1.3 - transitivePeerDependencies: - - supports-color - - '@secretlint/core@9.3.4': - dependencies: - '@secretlint/profiler': 9.3.4 - '@secretlint/types': 9.3.4 - debug: 4.4.1(supports-color@8.1.1) - structured-source: 4.0.0 - transitivePeerDependencies: - - supports-color - - '@secretlint/formatter@9.3.4': - dependencies: - '@secretlint/resolver': 9.3.4 - '@secretlint/types': 9.3.4 - '@textlint/linter-formatter': 14.8.4 - '@textlint/module-interop': 14.8.4 - '@textlint/types': 14.8.4 - chalk: 4.1.2 - debug: 4.4.1(supports-color@8.1.1) - pluralize: 8.0.0 - strip-ansi: 6.0.1 - table: 6.9.0 - terminal-link: 2.1.1 - transitivePeerDependencies: - - supports-color - - '@secretlint/node@9.3.4': - dependencies: - '@secretlint/config-loader': 9.3.4 - '@secretlint/core': 9.3.4 - '@secretlint/formatter': 9.3.4 - '@secretlint/profiler': 9.3.4 - '@secretlint/source-creator': 9.3.4 - '@secretlint/types': 9.3.4 - debug: 4.4.1(supports-color@8.1.1) - p-map: 4.0.0 - transitivePeerDependencies: - - supports-color - - '@secretlint/profiler@9.3.4': {} - - '@secretlint/resolver@9.3.4': {} - - '@secretlint/secretlint-formatter-sarif@9.3.4': - dependencies: - node-sarif-builder: 2.0.3 - - '@secretlint/secretlint-rule-no-dotenv@9.3.4': - dependencies: - '@secretlint/types': 9.3.4 - - '@secretlint/secretlint-rule-preset-recommend@9.3.4': {} - - '@secretlint/source-creator@9.3.4': - dependencies: - '@secretlint/types': 9.3.4 - istextorbinary: 9.5.0 - - '@secretlint/types@9.3.4': {} - - '@sentry/cli@1.77.3(encoding@0.1.13)': - dependencies: - https-proxy-agent: 5.0.1 - mkdirp: 0.5.6 - node-fetch: 2.7.0(encoding@0.1.13) - progress: 2.0.3 - proxy-from-env: 1.1.0 - which: 2.0.2 - transitivePeerDependencies: - - encoding - - supports-color - - '@sentry/webpack-plugin@1.21.0(encoding@0.1.13)': - dependencies: - '@sentry/cli': 1.77.3(encoding@0.1.13) - webpack-sources: 3.3.3 - transitivePeerDependencies: - - encoding - - supports-color - - '@sideway/address@4.1.5': - dependencies: - '@hapi/hoek': 9.3.0 - - '@sideway/formula@3.0.1': {} - - '@sideway/pinpoint@2.0.0': {} - - '@sinclair/typebox@0.27.8': {} - - '@sindresorhus/is@5.6.0': {} - - '@sindresorhus/is@7.0.2': {} - - '@sindresorhus/merge-streams@2.3.0': {} - - '@sinonjs/commons@1.8.6': - dependencies: - type-detect: 4.0.8 - - '@sinonjs/commons@3.0.1': - dependencies: - type-detect: 4.0.8 - - '@sinonjs/fake-timers@10.3.0': - dependencies: - '@sinonjs/commons': 3.0.1 - - '@size-limit/esbuild@11.2.0(size-limit@11.2.0)': - dependencies: - esbuild: 0.25.5 - nanoid: 5.1.5 - size-limit: 11.2.0 - - '@size-limit/file@11.2.0(size-limit@11.2.0)': - dependencies: - size-limit: 11.2.0 - - '@size-limit/preset-small-lib@11.2.0(size-limit@11.2.0)': - dependencies: - '@size-limit/esbuild': 11.2.0(size-limit@11.2.0) - '@size-limit/file': 11.2.0(size-limit@11.2.0) - size-limit: 11.2.0 - - '@smithy/abort-controller@4.0.4': - dependencies: - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/chunked-blob-reader-native@4.0.0': - dependencies: - '@smithy/util-base64': 4.0.0 - tslib: 2.8.1 - - '@smithy/chunked-blob-reader@5.0.0': - dependencies: - tslib: 2.8.1 - - '@smithy/config-resolver@4.1.4': - dependencies: - '@smithy/node-config-provider': 4.1.3 - '@smithy/types': 4.3.1 - '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.4 - tslib: 2.8.1 - - '@smithy/core@3.5.3': - dependencies: - '@smithy/middleware-serde': 4.0.8 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-stream': 4.2.2 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 - - '@smithy/credential-provider-imds@4.0.6': - dependencies: - '@smithy/node-config-provider': 4.1.3 - '@smithy/property-provider': 4.0.4 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - tslib: 2.8.1 - - '@smithy/eventstream-codec@4.0.4': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.3.1 - '@smithy/util-hex-encoding': 4.0.0 - tslib: 2.8.1 - - '@smithy/eventstream-serde-browser@4.0.4': - dependencies: - '@smithy/eventstream-serde-universal': 4.0.4 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/eventstream-serde-config-resolver@4.1.2': - dependencies: - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/eventstream-serde-node@4.0.4': - dependencies: - '@smithy/eventstream-serde-universal': 4.0.4 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/eventstream-serde-universal@4.0.4': - dependencies: - '@smithy/eventstream-codec': 4.0.4 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/fetch-http-handler@5.0.4': - dependencies: - '@smithy/protocol-http': 5.1.2 - '@smithy/querystring-builder': 4.0.4 - '@smithy/types': 4.3.1 - '@smithy/util-base64': 4.0.0 - tslib: 2.8.1 - - '@smithy/hash-blob-browser@4.0.4': - dependencies: - '@smithy/chunked-blob-reader': 5.0.0 - '@smithy/chunked-blob-reader-native': 4.0.0 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/hash-node@4.0.4': - dependencies: - '@smithy/types': 4.3.1 - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 - - '@smithy/hash-stream-node@4.0.4': - dependencies: - '@smithy/types': 4.3.1 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 - - '@smithy/invalid-dependency@4.0.4': - dependencies: - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/is-array-buffer@2.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/is-array-buffer@4.0.0': - dependencies: - tslib: 2.8.1 - - '@smithy/md5-js@4.0.4': - dependencies: - '@smithy/types': 4.3.1 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 - - '@smithy/middleware-content-length@4.0.4': - dependencies: - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/middleware-endpoint@4.1.11': - dependencies: - '@smithy/core': 3.5.3 - '@smithy/middleware-serde': 4.0.8 - '@smithy/node-config-provider': 4.1.3 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - '@smithy/util-middleware': 4.0.4 - tslib: 2.8.1 - - '@smithy/middleware-retry@4.1.12': - dependencies: - '@smithy/node-config-provider': 4.1.3 - '@smithy/protocol-http': 5.1.2 - '@smithy/service-error-classification': 4.0.5 - '@smithy/smithy-client': 4.4.3 - '@smithy/types': 4.3.1 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-retry': 4.0.5 - tslib: 2.8.1 - uuid: 9.0.1 - - '@smithy/middleware-serde@4.0.8': - dependencies: - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/middleware-stack@4.0.4': - dependencies: - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/node-config-provider@4.1.3': - dependencies: - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/node-http-handler@4.0.6': - dependencies: - '@smithy/abort-controller': 4.0.4 - '@smithy/protocol-http': 5.1.2 - '@smithy/querystring-builder': 4.0.4 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/property-provider@4.0.4': - dependencies: - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/protocol-http@5.1.2': - dependencies: - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/querystring-builder@4.0.4': - dependencies: - '@smithy/types': 4.3.1 - '@smithy/util-uri-escape': 4.0.0 - tslib: 2.8.1 - - '@smithy/querystring-parser@4.0.4': - dependencies: - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/service-error-classification@4.0.5': - dependencies: - '@smithy/types': 4.3.1 - - '@smithy/shared-ini-file-loader@4.0.4': - dependencies: - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/signature-v4@5.1.2': - dependencies: - '@smithy/is-array-buffer': 4.0.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - '@smithy/util-hex-encoding': 4.0.0 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-uri-escape': 4.0.0 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 - - '@smithy/smithy-client@4.4.3': - dependencies: - '@smithy/core': 3.5.3 - '@smithy/middleware-endpoint': 4.1.11 - '@smithy/middleware-stack': 4.0.4 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - '@smithy/util-stream': 4.2.2 - tslib: 2.8.1 - - '@smithy/types@4.3.1': - dependencies: - tslib: 2.8.1 - - '@smithy/url-parser@4.0.4': - dependencies: - '@smithy/querystring-parser': 4.0.4 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/util-base64@4.0.0': - dependencies: - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 - - '@smithy/util-body-length-browser@4.0.0': - dependencies: - tslib: 2.8.1 - - '@smithy/util-body-length-node@4.0.0': - dependencies: - tslib: 2.8.1 - - '@smithy/util-buffer-from@2.2.0': - dependencies: - '@smithy/is-array-buffer': 2.2.0 - tslib: 2.8.1 - - '@smithy/util-buffer-from@4.0.0': - dependencies: - '@smithy/is-array-buffer': 4.0.0 - tslib: 2.8.1 - - '@smithy/util-config-provider@4.0.0': - dependencies: - tslib: 2.8.1 - - '@smithy/util-defaults-mode-browser@4.0.19': - dependencies: - '@smithy/property-provider': 4.0.4 - '@smithy/smithy-client': 4.4.3 - '@smithy/types': 4.3.1 - bowser: 2.11.0 - tslib: 2.8.1 - - '@smithy/util-defaults-mode-node@4.0.19': - dependencies: - '@smithy/config-resolver': 4.1.4 - '@smithy/credential-provider-imds': 4.0.6 - '@smithy/node-config-provider': 4.1.3 - '@smithy/property-provider': 4.0.4 - '@smithy/smithy-client': 4.4.3 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/util-endpoints@3.0.6': - dependencies: - '@smithy/node-config-provider': 4.1.3 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/util-hex-encoding@4.0.0': - dependencies: - tslib: 2.8.1 - - '@smithy/util-middleware@4.0.4': - dependencies: - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/util-retry@4.0.5': - dependencies: - '@smithy/service-error-classification': 4.0.5 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@smithy/util-stream@4.2.2': - dependencies: - '@smithy/fetch-http-handler': 5.0.4 - '@smithy/node-http-handler': 4.0.6 - '@smithy/types': 4.3.1 - '@smithy/util-base64': 4.0.0 - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-hex-encoding': 4.0.0 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 - - '@smithy/util-uri-escape@4.0.0': - dependencies: - tslib: 2.8.1 - - '@smithy/util-utf8@2.3.0': - dependencies: - '@smithy/util-buffer-from': 2.2.0 - tslib: 2.8.1 - - '@smithy/util-utf8@4.0.0': - dependencies: - '@smithy/util-buffer-from': 4.0.0 - tslib: 2.8.1 - - '@smithy/util-waiter@4.0.5': - dependencies: - '@smithy/abort-controller': 4.0.4 - '@smithy/types': 4.3.1 - tslib: 2.8.1 - - '@standard-schema/utils@0.3.0': {} - - '@storybook/addon-actions@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.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-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.43.0 - fast-deep-equal: 3.1.3 - global: 4.4.0 - lodash: 4.17.21 - polished: 4.3.1 - prop-types: 15.8.1 - react-inspector: 5.1.1(react@18.2.0) - regenerator-runtime: 0.13.11 - telejson: 6.0.8 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - uuid-browser: 3.1.0 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@storybook/addon-actions@7.4.6(@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: - '@storybook/client-logger': 7.4.6 - '@storybook/components': 7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-events': 7.4.6 - '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@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 - dequal: 2.0.3 - lodash: 4.17.21 - polished: 4.3.1 - prop-types: 15.8.1 - react-inspector: 6.0.2(react@18.2.0) - telejson: 7.2.0 - ts-dedent: 2.2.0 - uuid: 9.0.1 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - '@storybook/addon-actions@8.6.14(storybook@8.6.14(prettier@3.6.2))': - 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.6.2) - uuid: 9.0.1 - - '@storybook/addon-actions@8.6.14(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - '@types/uuid': 9.0.8 - dequal: 2.0.3 - polished: 4.3.1 - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - uuid: 9.0.1 - - '@storybook/addon-actions@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - '@types/uuid': 9.0.8 - dequal: 2.0.3 - polished: 4.3.1 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - uuid: 9.0.1 - - '@storybook/addon-backgrounds@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.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-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.43.0 - global: 4.4.0 - memoizerific: 1.11.3 - regenerator-runtime: 0.13.11 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@storybook/addon-backgrounds@7.4.6(@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: - '@storybook/client-logger': 7.4.6 - '@storybook/components': 7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-events': 7.4.6 - '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@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 - memoizerific: 1.11.3 - ts-dedent: 2.2.0 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - '@storybook/addon-backgrounds@8.6.14(storybook@8.6.14(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - memoizerific: 1.11.3 - storybook: 8.6.14(prettier@3.6.2) - ts-dedent: 2.2.0 - - '@storybook/addon-backgrounds@8.6.14(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - memoizerific: 1.11.3 - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - ts-dedent: 2.2.0 - - '@storybook/addon-backgrounds@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - memoizerific: 1.11.3 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - ts-dedent: 2.2.0 - - '@storybook/addon-controls@6.5.16(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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.43.0 - lodash: 4.17.21 - ts-dedent: 2.2.0 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@swc/core' - - esbuild - - eslint - - supports-color - - typescript - - uglify-js - - vue-template-compiler - - webpack-cli - - '@storybook/addon-controls@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4.2))(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.43.0 - lodash: 4.17.21 - ts-dedent: 2.2.0 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@swc/core' - - esbuild - - eslint - - supports-color - - typescript - - uglify-js - - vue-template-compiler - - webpack-cli - - '@storybook/addon-controls@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)': - dependencies: - '@storybook/blocks': 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/client-logger': 7.4.6 - '@storybook/components': 7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 7.4.6(encoding@0.1.13) - '@storybook/core-events': 7.4.6 - '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/node-logger': 7.4.6 - '@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 - ts-dedent: 2.2.0 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - encoding - - supports-color - - '@storybook/addon-controls@8.6.14(storybook@8.6.14(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - dequal: 2.0.3 - storybook: 8.6.14(prettier@3.6.2) - ts-dedent: 2.2.0 - - '@storybook/addon-controls@8.6.14(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - dequal: 2.0.3 - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - ts-dedent: 2.2.0 - - '@storybook/addon-controls@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - dequal: 2.0.3 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - ts-dedent: 2.2.0 - - '@storybook/addon-docs@6.5.16(@babel/core@7.27.4)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.100.2)': - dependencies: - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/preset-env': 7.27.2(@babel/core@7.27.4) - '@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(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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) - '@storybook/mdx1-csf': 0.0.1(@babel/core@7.27.4) - '@storybook/node-logger': 6.5.16 - '@storybook/postinstall': 6.5.16 - '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@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.4)(webpack@5.100.2) - core-js: 3.43.0 - fast-deep-equal: 3.1.3 - global: 4.4.0 - lodash: 4.17.21 - regenerator-runtime: 0.13.11 - remark-external-links: 8.0.0 - remark-slug: 6.1.0 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@babel/core' - - '@swc/core' - - esbuild - - eslint - - supports-color - - typescript - - uglify-js - - vue-template-compiler - - webpack - - webpack-cli - - '@storybook/addon-docs@6.5.16(@babel/core@7.27.4)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.100.2)': - dependencies: - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/preset-env': 7.27.2(@babel/core@7.27.4) - '@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.4.2))(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) - '@storybook/mdx1-csf': 0.0.1(@babel/core@7.27.4) - '@storybook/node-logger': 6.5.16 - '@storybook/postinstall': 6.5.16 - '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@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.4)(webpack@5.100.2) - core-js: 3.43.0 - fast-deep-equal: 3.1.3 - global: 4.4.0 - lodash: 4.17.21 - regenerator-runtime: 0.13.11 - remark-external-links: 8.0.0 - remark-slug: 6.1.0 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@babel/core' - - '@swc/core' - - esbuild - - eslint - - supports-color - - typescript - - uglify-js - - vue-template-compiler - - webpack - - webpack-cli - - '@storybook/addon-docs@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)': - dependencies: - '@jest/transform': 29.7.0 - '@mdx-js/react': 2.3.0(react@18.2.0) - '@storybook/blocks': 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/client-logger': 7.4.6 - '@storybook/components': 7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/csf-plugin': 7.4.6 - '@storybook/csf-tools': 7.4.6 - '@storybook/global': 5.0.0 - '@storybook/mdx2-csf': 1.1.0 - '@storybook/node-logger': 7.4.6 - '@storybook/postinstall': 7.4.6 - '@storybook/preview-api': 7.4.6 - '@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.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - remark-external-links: 8.0.0 - remark-slug: 6.1.0 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - encoding - - supports-color - - '@storybook/addon-docs@8.6.14(@types/react@18.2.0)(storybook@8.6.14(prettier@3.6.2))': - dependencies: - '@mdx-js/react': 3.1.0(@types/react@18.2.0)(react@18.2.0) - '@storybook/blocks': 8.6.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.6.2)) - '@storybook/csf-plugin': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@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.6.2)) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - storybook: 8.6.14(prettier@3.6.2) - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@storybook/addon-docs@8.6.14(@types/react@18.2.0)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@mdx-js/react': 3.1.0(@types/react@18.2.0)(react@18.2.0) - '@storybook/blocks': 8.6.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/csf-plugin': 8.6.14(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/react-dom-shim': 8.6.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2)) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@storybook/addon-docs@8.6.14(@types/react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@mdx-js/react': 3.1.0(@types/react@18.2.0)(react@18.2.0) - '@storybook/blocks': 8.6.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/csf-plugin': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/react-dom-shim': 8.6.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@storybook/addon-docs@9.0.12(@types/react@18.2.0)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@mdx-js/react': 3.1.0(@types/react@18.2.0)(react@18.2.0) - '@storybook/csf-plugin': 9.0.12(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/icons': 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/react-dom-shim': 9.0.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2)) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@storybook/addon-essentials@6.5.16(@babel/core@7.27.4)(@storybook/builder-webpack5@6.5.16(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.100.2)': - dependencies: - '@babel/core': 7.27.4 - '@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(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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.4)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.100.2) - '@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(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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.43.0 - regenerator-runtime: 0.13.11 - ts-dedent: 2.2.0 - optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - transitivePeerDependencies: - - '@storybook/mdx2-csf' - - '@swc/core' - - esbuild - - eslint - - supports-color - - typescript - - uglify-js - - vue-template-compiler - - webpack-cli - - '@storybook/addon-essentials@6.5.16(@babel/core@7.27.4)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.100.2)': - dependencies: - '@babel/core': 7.27.4 - '@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.4.2))(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.4)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.100.2) - '@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.4.2))(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.43.0 - regenerator-runtime: 0.13.11 - ts-dedent: 2.2.0 - optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.100.2(webpack-cli@4.10.0) - transitivePeerDependencies: - - '@storybook/mdx2-csf' - - '@swc/core' - - esbuild - - eslint - - supports-color - - typescript - - uglify-js - - vue-template-compiler - - webpack-cli - - '@storybook/addon-essentials@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)': - dependencies: - '@storybook/addon-actions': 7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/addon-backgrounds': 7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/addon-controls': 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/addon-docs': 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/addon-highlight': 7.4.6 - '@storybook/addon-measure': 7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/addon-outline': 7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/addon-toolbars': 7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/addon-viewport': 7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 7.4.6(encoding@0.1.13) - '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/node-logger': 7.4.6 - '@storybook/preview-api': 7.4.6 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - encoding - - supports-color - - '@storybook/addon-essentials@8.6.14(@types/react@18.2.0)(storybook@8.6.14(prettier@3.6.2))': - dependencies: - '@storybook/addon-actions': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@storybook/addon-backgrounds': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@storybook/addon-controls': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@storybook/addon-docs': 8.6.14(@types/react@18.2.0)(storybook@8.6.14(prettier@3.6.2)) - '@storybook/addon-highlight': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@storybook/addon-measure': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@storybook/addon-outline': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@storybook/addon-toolbars': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@storybook/addon-viewport': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - storybook: 8.6.14(prettier@3.6.2) - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@storybook/addon-essentials@8.6.14(@types/react@18.2.0)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@storybook/addon-actions': 8.6.14(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/addon-backgrounds': 8.6.14(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/addon-controls': 8.6.14(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/addon-docs': 8.6.14(@types/react@18.2.0)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/addon-highlight': 8.6.14(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/addon-measure': 8.6.14(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/addon-outline': 8.6.14(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/addon-toolbars': 8.6.14(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/addon-viewport': 8.6.14(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2)) - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@storybook/addon-essentials@8.6.14(@types/react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@storybook/addon-actions': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/addon-backgrounds': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/addon-controls': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/addon-docs': 8.6.14(@types/react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/addon-highlight': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/addon-measure': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/addon-outline': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/addon-toolbars': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/addon-viewport': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@types/react' - - '@storybook/addon-highlight@7.4.6': - dependencies: - '@storybook/core-events': 7.4.6 - '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.4.6 - - '@storybook/addon-highlight@8.6.14(storybook@8.6.14(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - storybook: 8.6.14(prettier@3.6.2) - - '@storybook/addon-highlight@8.6.14(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - - '@storybook/addon-highlight@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - - '@storybook/addon-interactions@8.6.14(storybook@8.6.14(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@storybook/test': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - polished: 4.3.1 - storybook: 8.6.14(prettier@3.6.2) - ts-dedent: 2.2.0 - - '@storybook/addon-links@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@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-events': 6.5.16 - '@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.43.0 - global: 4.4.0 - prop-types: 15.8.1 - qs: 6.14.0 - regenerator-runtime: 0.13.11 - ts-dedent: 2.2.0 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@storybook/addon-links@7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@storybook/client-logger': 7.4.6 - '@storybook/core-events': 7.4.6 - '@storybook/csf': 0.1.13 - '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/preview-api': 7.4.6 - '@storybook/router': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/types': 7.4.6 - prop-types: 15.8.1 - ts-dedent: 2.2.0 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@storybook/addon-links@8.6.14(react@18.2.0)(storybook@8.6.14(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - storybook: 8.6.14(prettier@3.6.2) - ts-dedent: 2.2.0 - optionalDependencies: - react: 18.2.0 - - '@storybook/addon-links@8.6.14(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - ts-dedent: 2.2.0 - optionalDependencies: - react: 18.2.0 - - '@storybook/addon-measure@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.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-events': 6.5.16 - '@storybook/csf': 0.0.2--canary.4566f4d.1 - core-js: 3.43.0 - global: 4.4.0 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@storybook/addon-measure@7.4.6(@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: - '@storybook/client-logger': 7.4.6 - '@storybook/components': 7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-events': 7.4.6 - '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/preview-api': 7.4.6 - '@storybook/types': 7.4.6 - tiny-invariant: 1.3.3 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - '@storybook/addon-measure@8.6.14(storybook@8.6.14(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - storybook: 8.6.14(prettier@3.6.2) - tiny-invariant: 1.3.3 - - '@storybook/addon-measure@8.6.14(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - tiny-invariant: 1.3.3 - - '@storybook/addon-measure@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - tiny-invariant: 1.3.3 - - '@storybook/addon-onboarding@8.6.14(storybook@8.6.14(prettier@3.6.2))': - dependencies: - storybook: 8.6.14(prettier@3.6.2) - - '@storybook/addon-outline@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.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-events': 6.5.16 - '@storybook/csf': 0.0.2--canary.4566f4d.1 - core-js: 3.43.0 - global: 4.4.0 - regenerator-runtime: 0.13.11 - ts-dedent: 2.2.0 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@storybook/addon-outline@7.4.6(@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: - '@storybook/client-logger': 7.4.6 - '@storybook/components': 7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-events': 7.4.6 - '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/preview-api': 7.4.6 - '@storybook/types': 7.4.6 - ts-dedent: 2.2.0 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - '@storybook/addon-outline@8.6.14(storybook@8.6.14(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - storybook: 8.6.14(prettier@3.6.2) - ts-dedent: 2.2.0 - - '@storybook/addon-outline@8.6.14(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - ts-dedent: 2.2.0 - - '@storybook/addon-outline@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - ts-dedent: 2.2.0 - - '@storybook/addon-toolbars@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.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/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.43.0 - regenerator-runtime: 0.13.11 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@storybook/addon-toolbars@7.4.6(@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: - '@storybook/client-logger': 7.4.6 - '@storybook/components': 7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/preview-api': 7.4.6 - '@storybook/theming': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - '@storybook/addon-toolbars@8.6.14(storybook@8.6.14(prettier@3.6.2))': - dependencies: - storybook: 8.6.14(prettier@3.6.2) - - '@storybook/addon-toolbars@8.6.14(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - - '@storybook/addon-toolbars@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - - '@storybook/addon-viewport@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.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-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.43.0 - global: 4.4.0 - memoizerific: 1.11.3 - prop-types: 15.8.1 - regenerator-runtime: 0.13.11 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@storybook/addon-viewport@7.4.6(@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: - '@storybook/client-logger': 7.4.6 - '@storybook/components': 7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-events': 7.4.6 - '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/preview-api': 7.4.6 - '@storybook/theming': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - memoizerific: 1.11.3 - prop-types: 15.8.1 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - '@storybook/addon-viewport@8.6.14(storybook@8.6.14(prettier@3.6.2))': - dependencies: - memoizerific: 1.11.3 - storybook: 8.6.14(prettier@3.6.2) - - '@storybook/addon-viewport@8.6.14(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - memoizerific: 1.11.3 - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - - '@storybook/addon-viewport@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - memoizerific: 1.11.3 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - - '@storybook/addons@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/channels': 6.5.16 - '@storybook/client-logger': 6.5.16 - '@storybook/core-events': 6.5.16 - '@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) - '@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.43.0 - global: 4.4.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - regenerator-runtime: 0.13.11 - - '@storybook/addons@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@storybook/api': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@storybook/channels': 6.5.16 - '@storybook/client-logger': 6.5.16 - '@storybook/core-events': 6.5.16 - '@storybook/csf': 0.0.2--canary.4566f4d.1 - '@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.43.0 - global: 4.4.0 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - regenerator-runtime: 0.13.11 - - '@storybook/addons@7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/preview-api': 7.4.6 - '@storybook/types': 7.4.6 - react: 18.2.0 - react-dom: 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)': - dependencies: - '@storybook/channels': 6.5.16 - '@storybook/client-logger': 6.5.16 - '@storybook/core-events': 6.5.16 - '@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) - '@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.43.0 - fast-deep-equal: 3.1.3 - global: 4.4.0 - lodash: 4.17.21 - memoizerific: 1.11.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - regenerator-runtime: 0.13.11 - store2: 2.14.4 - telejson: 6.0.8 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - - '@storybook/api@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@storybook/channels': 6.5.16 - '@storybook/client-logger': 6.5.16 - '@storybook/core-events': 6.5.16 - '@storybook/csf': 0.0.2--canary.4566f4d.1 - '@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.43.0 - fast-deep-equal: 3.1.3 - global: 4.4.0 - lodash: 4.17.21 - memoizerific: 1.11.3 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - regenerator-runtime: 0.13.11 - store2: 2.14.4 - telejson: 6.0.8 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - - '@storybook/blocks@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)': - dependencies: - '@storybook/channels': 7.4.6 - '@storybook/client-logger': 7.4.6 - '@storybook/components': 7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-events': 7.4.6 - '@storybook/csf': 0.1.13 - '@storybook/docs-tools': 7.4.6(encoding@0.1.13) - '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@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 - '@types/lodash': 4.17.17 - color-convert: 2.0.1 - dequal: 2.0.3 - lodash: 4.17.21 - markdown-to-jsx: 7.7.8(react@18.2.0) - memoizerific: 1.11.3 - polished: 4.3.1 - react: 18.2.0 - react-colorful: 5.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react-dom: 18.2.0(react@18.2.0) - telejson: 7.2.0 - tocbot: 4.36.4 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - 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.6.2))': - dependencies: - '@storybook/icons': 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - storybook: 8.6.14(prettier@3.6.2) - 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@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@storybook/icons': 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - 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@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@storybook/icons': 1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - ts-dedent: 2.2.0 - optionalDependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@storybook/builder-manager@7.6.20(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 - '@types/ejs': 3.1.5 - '@types/find-cache-dir': 3.2.1 - '@yarnpkg/esbuild-plugin-pnp': 3.0.0-rc.15(esbuild@0.25.6) - browser-assert: 1.2.1 - ejs: 3.1.10 - esbuild: 0.25.6 - esbuild-plugin-alias: 0.2.1 - express: 4.21.2 - find-cache-dir: 3.3.2 - fs-extra: 11.3.0 - process: 0.11.10 - util: 0.12.5 - transitivePeerDependencies: - - encoding - - supports-color - - '@storybook/builder-vite@9.0.17(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))': - dependencies: - '@storybook/csf-plugin': 9.0.17(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2)) - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - ts-dedent: 2.2.0 - vite: 6.3.5(@types/node@24.0.14)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) - - '@storybook/builder-webpack4@6.5.16(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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.4 - '@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(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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) - '@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.4)(webpack@5.100.2) - case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.43.0 - css-loader: 3.6.0(webpack@5.100.2) - file-loader: 6.2.0(webpack@5.100.2) - find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 4.1.6(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)(webpack@5.100.2) - 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.100.2) - 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.100.2) - raw-loader: 4.0.2(webpack@5.100.2) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - stable: 0.1.8 - style-loader: 1.3.0(webpack@5.100.2) - terser-webpack-plugin: 4.2.3(webpack@5.100.2) - ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) - util-deprecate: 1.0.2 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - webpack-dev-middleware: 3.7.3(webpack@5.100.2) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.100.2) - webpack-hot-middleware: 2.26.1 - webpack-virtual-modules: 0.2.2 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@swc/core' - - bluebird - - esbuild - - eslint - - supports-color - - uglify-js - - vue-template-compiler - - webpack-cli - - '@storybook/builder-webpack4@6.5.16(eslint@9.26.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': - dependencies: - '@babel/core': 7.27.4 - '@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(eslint@9.26.0(jiti@2.4.2))(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.4)(webpack@5.100.2) - case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.43.0 - css-loader: 3.6.0(webpack@5.100.2) - file-loader: 6.2.0(webpack@5.100.2) - find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 4.1.6(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3)(webpack@5.100.2) - 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.100.2) - 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.100.2) - raw-loader: 4.0.2(webpack@5.100.2) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - stable: 0.1.8 - style-loader: 1.3.0(webpack@5.100.2) - terser-webpack-plugin: 4.2.3(webpack@5.100.2) - ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) - util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.100.2) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.100.2) - webpack-hot-middleware: 2.26.1 - webpack-virtual-modules: 0.2.2 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@swc/core' - - bluebird - - esbuild - - eslint - - supports-color - - uglify-js - - vue-template-compiler - - webpack-cli - - '@storybook/builder-webpack4@6.5.16(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': - dependencies: - '@babel/core': 7.27.4 - '@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(eslint@9.27.0(jiti@2.4.2))(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.4)(webpack@5.100.2) - case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.43.0 - css-loader: 3.6.0(webpack@5.100.2) - file-loader: 6.2.0(webpack@5.100.2) - find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 4.1.6(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)(webpack@5.100.2) - 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.100.2) - 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.100.2) - raw-loader: 4.0.2(webpack@5.100.2) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - stable: 0.1.8 - style-loader: 1.3.0(webpack@5.100.2) - terser-webpack-plugin: 4.2.3(webpack@5.100.2) - ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) - util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.100.2) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.100.2) - webpack-hot-middleware: 2.26.1 - webpack-virtual-modules: 0.2.2 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@swc/core' - - bluebird - - esbuild - - eslint - - supports-color - - uglify-js - - vue-template-compiler - - webpack-cli - - '@storybook/builder-webpack4@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4 - '@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(eslint@9.27.0(jiti@2.4.2))(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) - '@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.4)(webpack@5.100.2) - case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.43.0 - css-loader: 3.6.0(webpack@5.100.2) - file-loader: 6.2.0(webpack@5.100.2) - find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 4.1.6(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)(webpack@5.100.2) - 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.100.2) - 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.100.2) - raw-loader: 4.0.2(webpack@5.100.2) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - stable: 0.1.8 - style-loader: 1.3.0(webpack@5.100.2) - terser-webpack-plugin: 4.2.3(webpack@5.100.2) - ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) - util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.100.2) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.100.2) - webpack-hot-middleware: 2.26.1 - webpack-virtual-modules: 0.2.2 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@swc/core' - - bluebird - - esbuild - - eslint - - supports-color - - uglify-js - - vue-template-compiler - - webpack-cli - - '@storybook/builder-webpack4@6.5.16(eslint@9.27.0(jiti@2.4.2))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': - dependencies: - '@babel/core': 7.27.4 - '@storybook/addons': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@storybook/api': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@storybook/channel-postmessage': 6.5.16 - '@storybook/channels': 6.5.16 - '@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.4.2))(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) - '@storybook/router': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@storybook/semver': 7.3.2 - '@storybook/store': 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) - '@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 - autoprefixer: 9.8.8 - babel-loader: 8.4.1(@babel/core@7.27.4)(webpack@5.100.2) - case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.43.0 - css-loader: 3.6.0(webpack@5.100.2) - file-loader: 6.2.0(webpack@5.100.2) - find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 4.1.6(eslint@9.27.0(jiti@2.4.2))(typescript@4.9.5)(webpack@5.100.2) - 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.100.2) - 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.100.2) - raw-loader: 4.0.2(webpack@5.100.2) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - stable: 0.1.8 - style-loader: 1.3.0(webpack@5.100.2) - terser-webpack-plugin: 4.2.3(webpack@5.100.2) - ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) - util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.100.2) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.100.2) - webpack-hot-middleware: 2.26.1 - webpack-virtual-modules: 0.2.2 - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - '@swc/core' - - bluebird - - esbuild - - eslint - - supports-color - - uglify-js - - vue-template-compiler - - webpack-cli - - '@storybook/builder-webpack5@6.5.16(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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.4 - '@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(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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) - '@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) - '@types/node': 16.18.126 - babel-loader: 8.4.1(@babel/core@7.27.4)(webpack@5.100.2) - babel-plugin-named-exports-order: 0.0.2 - browser-assert: 1.2.1 - case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.43.0 - css-loader: 5.2.7(webpack@5.100.2) - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)(webpack@5.100.2) - glob: 7.2.3 - glob-promise: 3.4.0(glob@7.2.3) - html-webpack-plugin: 5.6.3(webpack@5.100.2) - 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.100.2) - terser-webpack-plugin: 5.3.14(esbuild@0.25.5)(webpack@5.100.2) - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - webpack-dev-middleware: 4.3.0(webpack@5.100.2) - webpack-hot-middleware: 2.26.1 - webpack-virtual-modules: 0.4.6 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@rspack/core' - - '@swc/core' - - esbuild - - eslint - - supports-color - - uglify-js - - vue-template-compiler - - webpack-cli - - '@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4 - '@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(eslint@9.27.0(jiti@2.4.2))(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) - '@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) - '@types/node': 16.18.126 - babel-loader: 8.4.1(@babel/core@7.27.4)(webpack@5.100.2) - babel-plugin-named-exports-order: 0.0.2 - browser-assert: 1.2.1 - case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.43.0 - css-loader: 5.2.7(webpack@5.100.2) - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)(webpack@5.100.2) - glob: 7.2.3 - glob-promise: 3.4.0(glob@7.2.3) - html-webpack-plugin: 5.6.3(webpack@5.100.2) - 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.100.2) - terser-webpack-plugin: 5.3.14(webpack@5.100.2) - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-dev-middleware: 4.3.0(webpack@5.100.2) - webpack-hot-middleware: 2.26.1 - webpack-virtual-modules: 0.4.6 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@rspack/core' - - '@swc/core' - - esbuild - - eslint - - supports-color - - uglify-js - - 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)(esbuild@0.25.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': - dependencies: - '@babel/core': 7.27.4 - '@storybook/addons': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/channels': 7.4.6 - '@storybook/client-api': 7.4.6 - '@storybook/client-logger': 7.4.6 - '@storybook/components': 7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 7.4.6(encoding@0.1.13) - '@storybook/core-events': 7.4.6 - '@storybook/core-webpack': 7.4.6(encoding@0.1.13) - '@storybook/global': 5.0.0 - '@storybook/manager-api': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/node-logger': 7.4.6 - '@storybook/preview': 7.4.6 - '@storybook/preview-api': 7.4.6 - '@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.12.5(@swc/helpers@0.5.17) - '@types/node': 16.18.126 - '@types/semver': 7.7.0 - babel-loader: 9.2.1(@babel/core@7.27.4)(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)) - 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.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)) - express: 4.21.2 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)) - fs-extra: 11.3.0 - html-webpack-plugin: 5.6.3(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)) - 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.2 - style-loader: 3.3.4(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)) - swc-loader: 0.2.6(@swc/core@1.12.5(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)) - terser-webpack-plugin: 5.3.14(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)) - ts-dedent: 2.2.0 - url: 0.11.4 - util: 0.12.5 - util-deprecate: 1.0.2 - webpack: 5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6) - webpack-dev-middleware: 6.1.3(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)) - webpack-hot-middleware: 2.26.1 - webpack-virtual-modules: 0.5.0 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@rspack/core' - - '@swc/helpers' - - '@types/react' - - '@types/react-dom' - - encoding - - esbuild - - supports-color - - uglify-js - - webpack-cli - - '@storybook/builder-webpack5@8.6.14(storybook@8.6.14(prettier@3.6.2))(typescript@5.8.3)': - dependencies: - '@storybook/core-webpack': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@types/semver': 7.7.0 - 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.100.2) - es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.100.2) - html-webpack-plugin: 5.6.3(webpack@5.100.2) - magic-string: 0.30.17 - path-browserify: 1.0.1 - process: 0.11.10 - semver: 7.7.2 - storybook: 8.6.14(prettier@3.6.2) - style-loader: 3.3.4(webpack@5.100.2) - terser-webpack-plugin: 5.3.14(webpack@5.100.2) - ts-dedent: 2.2.0 - url: 0.11.4 - util: 0.12.5 - util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-dev-middleware: 6.1.3(webpack@5.100.2) - webpack-hot-middleware: 2.26.1 - webpack-virtual-modules: 0.6.2 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@rspack/core' - - '@swc/core' - - esbuild - - uglify-js - - webpack-cli - - '@storybook/builder-webpack5@8.6.14(storybook@8.6.14(prettier@3.6.2))(typescript@5.8.3)(webpack-cli@6.0.1)': - dependencies: - '@storybook/core-webpack': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@types/semver': 7.7.0 - 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.100.2) - es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.100.2) - html-webpack-plugin: 5.6.3(webpack@5.100.2) - magic-string: 0.30.17 - path-browserify: 1.0.1 - process: 0.11.10 - semver: 7.7.2 - storybook: 8.6.14(prettier@3.6.2) - style-loader: 3.3.4(webpack@5.100.2) - terser-webpack-plugin: 5.3.14(webpack@5.100.2) - ts-dedent: 2.2.0 - url: 0.11.4 - util: 0.12.5 - util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@6.0.1) - webpack-dev-middleware: 6.1.3(webpack@5.100.2) - webpack-hot-middleware: 2.26.1 - webpack-virtual-modules: 0.6.2 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@rspack/core' - - '@swc/core' - - esbuild - - uglify-js - - webpack-cli - - '@storybook/builder-webpack5@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3)(webpack-cli@5.1.4)': - dependencies: - '@storybook/core-webpack': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@types/semver': 7.7.0 - 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.100.2) - es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.100.2) - html-webpack-plugin: 5.6.3(webpack@5.100.2) - magic-string: 0.30.17 - path-browserify: 1.0.1 - process: 0.11.10 - semver: 7.7.2 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - style-loader: 3.3.4(webpack@5.100.2) - terser-webpack-plugin: 5.3.14(webpack@5.100.2) - ts-dedent: 2.2.0 - url: 0.11.4 - util: 0.12.5 - util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-dev-middleware: 6.1.3(webpack@5.100.2) - webpack-hot-middleware: 2.26.1 - webpack-virtual-modules: 0.6.2 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@rspack/core' - - '@swc/core' - - esbuild - - uglify-js - - webpack-cli - - '@storybook/channel-postmessage@6.5.16': - dependencies: - '@storybook/channels': 6.5.16 - '@storybook/client-logger': 6.5.16 - '@storybook/core-events': 6.5.16 - core-js: 3.43.0 - global: 4.4.0 - qs: 6.14.0 - 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.43.0 - global: 4.4.0 - telejson: 6.0.8 - - '@storybook/channels@6.5.16': - dependencies: - core-js: 3.43.0 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - - '@storybook/channels@7.4.6': - dependencies: - '@storybook/client-logger': 7.4.6 - '@storybook/core-events': 7.4.6 - '@storybook/global': 5.0.0 - qs: 6.14.0 - telejson: 7.2.0 - tiny-invariant: 1.3.3 - - '@storybook/channels@7.6.20': - dependencies: - '@storybook/client-logger': 7.6.20 - '@storybook/core-events': 7.6.20 - '@storybook/global': 5.0.0 - qs: 6.14.0 - telejson: 7.2.0 - tiny-invariant: 1.3.3 - - '@storybook/cli@7.6.20(encoding@0.1.13)': - dependencies: - '@babel/core': 7.27.4 - '@babel/preset-env': 7.27.2(@babel/core@7.27.4) - '@babel/types': 7.27.6 - '@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 - '@types/semver': 7.7.0 - '@yarnpkg/fslib': 2.10.3 - '@yarnpkg/libzip': 2.3.0 - chalk: 4.1.2 - commander: 6.2.1 - cross-spawn: 7.0.6 - detect-indent: 6.1.0 - envinfo: 7.14.0 - execa: 5.1.1 - express: 4.21.2 - find-up: 5.0.0 - fs-extra: 11.3.0 - get-npm-tarball-url: 2.1.0 - get-port: 5.1.1 - giget: 1.2.5 - globby: 11.1.0 - jscodeshift: 0.15.2(@babel/preset-env@7.27.2(@babel/core@7.27.4)) - leven: 3.1.0 - ora: 5.4.1 - prettier: 2.8.8 - prompts: 2.4.2 - puppeteer-core: 2.1.1 - read-pkg-up: 7.0.1 - semver: 7.7.2 - strip-json-comments: 3.1.1 - tempy: 1.0.1 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - - '@storybook/cli@9.0.17(@babel/preset-env@7.27.2(@babel/core@7.28.0))(@testing-library/dom@10.4.0)(prettier@3.6.2)': - dependencies: - '@storybook/codemod': 9.0.17(@babel/preset-env@7.27.2(@babel/core@7.28.0))(@testing-library/dom@10.4.0) - '@types/semver': 7.7.0 - commander: 12.1.0 - create-storybook: 9.0.17 - giget: 1.2.5 - jscodeshift: 0.15.2(@babel/preset-env@7.27.2(@babel/core@7.28.0)) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@babel/preset-env' - - '@testing-library/dom' - - bufferutil - - prettier - - supports-color - - utf-8-validate - - '@storybook/client-api@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - 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 - '@storybook/channels': 6.5.16 - '@storybook/client-logger': 6.5.16 - '@storybook/core-events': 6.5.16 - '@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) - '@types/qs': 6.14.0 - '@types/webpack-env': 1.18.8 - core-js: 3.43.0 - fast-deep-equal: 3.1.3 - global: 4.4.0 - lodash: 4.17.21 - memoizerific: 1.11.3 - qs: 6.14.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - regenerator-runtime: 0.13.11 - store2: 2.14.4 - synchronous-promise: 2.0.17 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - - '@storybook/client-api@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - 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 - '@storybook/channels': 6.5.16 - '@storybook/client-logger': 6.5.16 - '@storybook/core-events': 6.5.16 - '@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) - '@types/qs': 6.14.0 - '@types/webpack-env': 1.18.8 - core-js: 3.43.0 - fast-deep-equal: 3.1.3 - global: 4.4.0 - lodash: 4.17.21 - memoizerific: 1.11.3 - qs: 6.14.0 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - regenerator-runtime: 0.13.11 - store2: 2.14.4 - synchronous-promise: 2.0.17 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - - '@storybook/client-api@7.4.6': - dependencies: - '@storybook/client-logger': 7.4.6 - '@storybook/preview-api': 7.4.6 - - '@storybook/client-logger@6.5.16': - dependencies: - core-js: 3.43.0 - global: 4.4.0 - - '@storybook/client-logger@7.4.6': - dependencies: - '@storybook/global': 5.0.0 - - '@storybook/client-logger@7.6.20': - dependencies: - '@storybook/global': 5.0.0 - - '@storybook/codemod@7.6.20': - dependencies: - '@babel/core': 7.27.4 - '@babel/preset-env': 7.27.2(@babel/core@7.27.4) - '@babel/types': 7.27.6 - '@storybook/csf': 0.1.13 - '@storybook/csf-tools': 7.6.20 - '@storybook/node-logger': 7.6.20 - '@storybook/types': 7.6.20 - '@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.4)) - lodash: 4.17.21 - prettier: 2.8.8 - recast: 0.23.11 - transitivePeerDependencies: - - supports-color - - '@storybook/codemod@9.0.17(@babel/preset-env@7.27.2(@babel/core@7.28.0))(@testing-library/dom@10.4.0)': - dependencies: - '@types/cross-spawn': 6.0.6 - cross-spawn: 7.0.6 - es-toolkit: 1.39.7 - globby: 14.1.0 - jscodeshift: 0.15.2(@babel/preset-env@7.27.2(@babel/core@7.28.0)) - prettier: 3.6.2 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - tiny-invariant: 1.3.3 - transitivePeerDependencies: - - '@babel/preset-env' - - '@testing-library/dom' - - bufferutil - - supports-color - - utf-8-validate - - '@storybook/components@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@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.43.0 - memoizerific: 1.11.3 - qs: 6.14.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - regenerator-runtime: 0.13.11 - util-deprecate: 1.0.2 - - '@storybook/components@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@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.43.0 - memoizerific: 1.11.3 - qs: 6.14.0 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - regenerator-runtime: 0.13.11 - util-deprecate: 1.0.2 - - '@storybook/components@7.4.6(@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: - '@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) - '@radix-ui/react-toolbar': 1.1.10(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/client-logger': 7.4.6 - '@storybook/csf': 0.1.13 - '@storybook/global': 5.0.0 - '@storybook/theming': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/types': 7.4.6 - memoizerific: 1.11.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - use-resize-observer: 9.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - util-deprecate: 1.0.2 - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - '@storybook/components@8.6.14(storybook@8.6.14(prettier@3.6.2))': - dependencies: - storybook: 8.6.14(prettier@3.6.2) - - '@storybook/components@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - - '@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.100.2)': - 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 - '@storybook/channel-websocket': 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/core-events': 6.5.16 - '@storybook/csf': 0.0.2--canary.4566f4d.1 - '@storybook/preview-web': 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/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.43.0 - global: 4.4.0 - lodash: 4.17.21 - qs: 6.14.0 - 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.100.2(webpack-cli@4.10.0) - 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.100.2)': - 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 - '@storybook/channel-websocket': 6.5.16 - '@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/core-events': 6.5.16 - '@storybook/csf': 0.0.2--canary.4566f4d.1 - '@storybook/preview-web': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@storybook/store': 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) - airbnb-js-shims: 2.2.1 - ansi-to-html: 0.6.15 - core-js: 3.43.0 - global: 4.4.0 - lodash: 4.17.21 - qs: 6.14.0 - 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.100.2(webpack-cli@4.10.0) - optionalDependencies: - typescript: 4.9.5 - - '@storybook/core-client@7.4.6': - dependencies: - '@storybook/client-logger': 7.4.6 - '@storybook/preview-api': 7.4.6 - - '@storybook/core-common@6.5.16(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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.4 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-proposal-decorators': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.4) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.27.4) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.4) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.4) - '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) - '@babel/preset-env': 7.27.2(@babel/core@7.27.4) - '@babel/preset-react': 7.27.1(@babel/core@7.27.4) - '@babel/preset-typescript': 7.27.1(@babel/core@7.27.4) - '@babel/register': 7.27.1(@babel/core@7.27.4) - '@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.4)(webpack@5.100.2) - babel-plugin-macros: 3.1.0 - babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.4) - chalk: 4.1.2 - core-js: 3.43.0 - express: 4.21.2 - 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.4.2))(typescript@5.8.3)(webpack@5.100.2) - 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.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - 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.26.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': - dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-proposal-decorators': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.4) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.27.4) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.4) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.4) - '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) - '@babel/preset-env': 7.27.2(@babel/core@7.27.4) - '@babel/preset-react': 7.27.1(@babel/core@7.27.4) - '@babel/preset-typescript': 7.27.1(@babel/core@7.27.4) - '@babel/register': 7.27.1(@babel/core@7.27.4) - '@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.4)(webpack@5.100.2) - babel-plugin-macros: 3.1.0 - babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.4) - chalk: 4.1.2 - core-js: 3.43.0 - express: 4.21.2 - 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.4.2))(typescript@5.8.3)(webpack@5.100.2) - 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.100.2(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.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': - dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-proposal-decorators': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.4) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.27.4) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.4) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.4) - '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) - '@babel/preset-env': 7.27.2(@babel/core@7.27.4) - '@babel/preset-react': 7.27.1(@babel/core@7.27.4) - '@babel/preset-typescript': 7.27.1(@babel/core@7.27.4) - '@babel/register': 7.27.1(@babel/core@7.27.4) - '@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.4)(webpack@5.100.2) - babel-plugin-macros: 3.1.0 - babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.4) - chalk: 4.1.2 - core-js: 3.43.0 - express: 4.21.2 - 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.4.2))(typescript@5.8.3)(webpack@5.100.2) - 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.100.2(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.4.2))(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.4 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-proposal-decorators': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.4) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.27.4) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.4) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.4) - '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) - '@babel/preset-env': 7.27.2(@babel/core@7.27.4) - '@babel/preset-react': 7.27.1(@babel/core@7.27.4) - '@babel/preset-typescript': 7.27.1(@babel/core@7.27.4) - '@babel/register': 7.27.1(@babel/core@7.27.4) - '@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.4)(webpack@5.100.2) - babel-plugin-macros: 3.1.0 - babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.4) - chalk: 4.1.2 - core-js: 3.43.0 - express: 4.21.2 - 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.4.2))(typescript@5.8.3)(webpack@5.100.2) - 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.100.2(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.4.2))(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.4 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-proposal-decorators': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.4) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.27.4) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.4) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.4) - '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) - '@babel/preset-env': 7.27.2(@babel/core@7.27.4) - '@babel/preset-react': 7.27.1(@babel/core@7.27.4) - '@babel/preset-typescript': 7.27.1(@babel/core@7.27.4) - '@babel/register': 7.27.1(@babel/core@7.27.4) - '@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.4)(webpack@5.100.2) - babel-plugin-macros: 3.1.0 - babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.4) - chalk: 4.1.2 - core-js: 3.43.0 - express: 4.21.2 - 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.4.2))(typescript@5.8.3)(webpack@5.100.2) - 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.100.2(webpack-cli@6.0.1) - 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.4.2))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': - dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-proposal-decorators': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.4) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.27.4) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.27.4) - '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.4) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-block-scoping': 7.27.5(@babel/core@7.27.4) - '@babel/plugin-transform-classes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-destructuring': 7.27.3(@babel/core@7.27.4) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-parameters': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.4) - '@babel/preset-env': 7.27.2(@babel/core@7.27.4) - '@babel/preset-react': 7.27.1(@babel/core@7.27.4) - '@babel/preset-typescript': 7.27.1(@babel/core@7.27.4) - '@babel/register': 7.27.1(@babel/core@7.27.4) - '@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.4)(webpack@5.100.2) - babel-plugin-macros: 3.1.0 - babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.4) - chalk: 4.1.2 - core-js: 3.43.0 - express: 4.21.2 - 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.4.2))(typescript@4.9.5)(webpack@5.100.2) - 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: 19.1.0 - react-dom: 19.1.0(react@19.1.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.100.2(webpack-cli@4.10.0) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - eslint - - supports-color - - uglify-js - - vue-template-compiler - - webpack-cli - - '@storybook/core-common@7.4.6(encoding@0.1.13)': - dependencies: - '@storybook/core-events': 7.4.6 - '@storybook/node-logger': 7.4.6 - '@storybook/types': 7.4.6 - '@types/find-cache-dir': 3.2.1 - '@types/node': 16.18.126 - '@types/node-fetch': 2.6.12 - '@types/pretty-hrtime': 1.0.3 - chalk: 4.1.2 - esbuild: 0.25.6 - esbuild-register: 3.6.0(esbuild@0.25.6) - file-system-cache: 2.3.0 - find-cache-dir: 3.3.2 - find-up: 5.0.0 - fs-extra: 11.3.0 - glob: 10.4.5 - handlebars: 4.7.8 - lazy-universal-dotenv: 4.0.0 - node-fetch: 2.7.0(encoding@0.1.13) - picomatch: 2.3.1 - pkg-dir: 5.0.0 - pretty-hrtime: 1.0.3 - resolve-from: 5.0.0 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - encoding - - supports-color - - '@storybook/core-common@7.6.20(encoding@0.1.13)': - dependencies: - '@storybook/core-events': 7.6.20 - '@storybook/node-logger': 7.6.20 - '@storybook/types': 7.6.20 - '@types/find-cache-dir': 3.2.1 - '@types/node': 18.19.112 - '@types/node-fetch': 2.6.12 - '@types/pretty-hrtime': 1.0.3 - chalk: 4.1.2 - esbuild: 0.25.6 - esbuild-register: 3.6.0(esbuild@0.25.6) - file-system-cache: 2.3.0 - find-cache-dir: 3.3.2 - find-up: 5.0.0 - fs-extra: 11.3.0 - glob: 10.4.5 - handlebars: 4.7.8 - lazy-universal-dotenv: 4.0.0 - node-fetch: 2.7.0(encoding@0.1.13) - picomatch: 2.3.1 - pkg-dir: 5.0.0 - pretty-hrtime: 1.0.3 - resolve-from: 5.0.0 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - encoding - - supports-color - - '@storybook/core-events@6.5.16': - dependencies: - core-js: 3.43.0 - - '@storybook/core-events@7.4.6': - dependencies: - ts-dedent: 2.2.0 - - '@storybook/core-events@7.6.20': - dependencies: - ts-dedent: 2.2.0 - - '@storybook/core-server@6.5.16(@storybook/builder-webpack5@6.5.16(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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.100.2) - '@storybook/core-common': 6.5.16(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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.12 - '@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.0 - core-js: 3.43.0 - cpy: 8.1.2 - detect-port: 1.6.1 - express: 4.21.2 - fs-extra: 9.1.0 - global: 4.4.0 - globby: 11.1.0 - ip: 2.0.1 - lodash: 4.17.21 - node-fetch: 2.7.0(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.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - ws: 8.18.2 - x-default-browser: 0.4.0 - optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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' - - bluebird - - bufferutil - - encoding - - esbuild - - eslint - - supports-color - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - '@storybook/core-server@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4.2))(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.4.2))(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.4.2))(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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4.2))(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.4.2))(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.12 - '@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.0 - core-js: 3.43.0 - cpy: 8.1.2 - detect-port: 1.6.1 - express: 4.21.2 - fs-extra: 9.1.0 - global: 4.4.0 - globby: 11.1.0 - ip: 2.0.1 - lodash: 4.17.21 - node-fetch: 2.7.0(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.100.2(webpack-cli@4.10.0) - ws: 8.18.2 - x-default-browser: 0.4.0 - optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4.2))(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' - - '@swc/core' - - bluebird - - 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.26.0(jiti@2.4.2))(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.4.2))(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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.4.2))(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.4.2))(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.4.2))(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.12 - '@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.0 - core-js: 3.43.0 - cpy: 8.1.2 - detect-port: 1.6.1 - express: 4.21.2 - fs-extra: 9.1.0 - global: 4.4.0 - globby: 11.1.0 - ip: 2.0.1 - lodash: 4.17.21 - node-fetch: 2.7.0(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.100.2(webpack-cli@4.10.0) - ws: 8.18.2 - x-default-browser: 0.4.0 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@storybook/mdx2-csf' - - '@swc/core' - - bluebird - - 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.4.2))(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.27.0(jiti@2.4.2))(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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.4.2))(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.4.2))(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.12 - '@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.0 - core-js: 3.43.0 - cpy: 8.1.2 - detect-port: 1.6.1 - express: 4.21.2 - fs-extra: 9.1.0 - global: 4.4.0 - globby: 11.1.0 - ip: 2.0.1 - lodash: 4.17.21 - node-fetch: 2.7.0(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.100.2(webpack-cli@4.10.0) - ws: 8.18.2 - x-default-browser: 0.4.0 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@storybook/mdx2-csf' - - '@swc/core' - - bluebird - - 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.4.2))(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.4.2))(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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4.2))(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.4.2))(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.12 - '@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.0 - core-js: 3.43.0 - cpy: 8.1.2 - detect-port: 1.6.1 - express: 4.21.2 - fs-extra: 9.1.0 - global: 4.4.0 - globby: 11.1.0 - ip: 2.0.1 - lodash: 4.17.21 - node-fetch: 2.7.0(encoding@0.1.13) - open: 8.4.2 - pretty-hrtime: 1.0.3 - prompts: 2.4.2 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.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.100.2(webpack-cli@4.10.0) - ws: 8.18.2 - x-default-browser: 0.4.0 - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - '@storybook/mdx2-csf' - - '@swc/core' - - bluebird - - bufferutil - - encoding - - esbuild - - eslint - - supports-color - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - '@storybook/core-server@7.6.20(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/csf': 0.1.13 - '@storybook/csf-tools': 7.6.20 - '@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 - '@types/detect-port': 1.3.5 - '@types/node': 18.19.112 - '@types/pretty-hrtime': 1.0.3 - '@types/semver': 7.7.0 - better-opn: 3.0.2 - chalk: 4.1.2 - cli-table3: 0.6.5 - compression: 1.8.0 - detect-port: 1.6.1 - express: 4.21.2 - fs-extra: 11.3.0 - globby: 11.1.0 - lodash: 4.17.21 - open: 8.4.2 - pretty-hrtime: 1.0.3 - prompts: 2.4.2 - read-pkg-up: 7.0.1 - semver: 7.7.2 - telejson: 7.2.0 - tiny-invariant: 1.3.3 - ts-dedent: 2.2.0 - util: 0.12.5 - util-deprecate: 1.0.2 - watchpack: 2.4.4 - ws: 8.18.2 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - - '@storybook/core-webpack@7.4.6(encoding@0.1.13)': - dependencies: - '@storybook/core-common': 7.4.6(encoding@0.1.13) - '@storybook/node-logger': 7.4.6 - '@storybook/types': 7.4.6 - '@types/node': 16.18.126 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - encoding - - supports-color - - '@storybook/core-webpack@8.6.14(storybook@8.6.14(prettier@3.6.2))': - dependencies: - storybook: 8.6.14(prettier@3.6.2) - ts-dedent: 2.2.0 - - '@storybook/core-webpack@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - ts-dedent: 2.2.0 - - '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.100.2)': - 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.100.2) - '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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' - - bluebird - - 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.4.2))(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.4.2))(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.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.100.2)': - 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.100.2) - '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4.2))(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.4.2))(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.100.2(webpack-cli@4.10.0) - optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4.2))(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' - - '@swc/core' - - bluebird - - bufferutil - - encoding - - esbuild - - eslint - - supports-color - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.100.2)': - 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.100.2) - '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.4.2))(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.100.2(webpack-cli@4.10.0) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@storybook/mdx2-csf' - - '@swc/core' - - bluebird - - bufferutil - - encoding - - esbuild - - eslint - - supports-color - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.100.2)': - 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.100.2) - '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.100.2(webpack-cli@4.10.0) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@storybook/mdx2-csf' - - '@swc/core' - - bluebird - - bufferutil - - encoding - - esbuild - - eslint - - supports-color - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.100.2)': - 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.100.2) - '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.100.2(webpack-cli@4.10.0) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - '@storybook/mdx2-csf' - - '@swc/core' - - bluebird - - bufferutil - - encoding - - esbuild - - eslint - - supports-color - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - '@storybook/core@8.6.14(prettier@3.6.2)(storybook@8.6.14(prettier@3.6.2))': - dependencies: - '@storybook/theming': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - better-opn: 3.0.2 - browser-assert: 1.2.1 - esbuild: 0.25.5 - esbuild-register: 3.6.0(esbuild@0.25.5) - jsdoc-type-pratt-parser: 4.1.0 - process: 0.11.10 - recast: 0.23.11 - semver: 7.7.2 - util: 0.12.5 - ws: 8.18.2 - optionalDependencies: - prettier: 3.6.2 - transitivePeerDependencies: - - bufferutil - - storybook - - supports-color - - utf-8-validate - - '@storybook/csf-plugin@7.4.6': - dependencies: - '@storybook/csf-tools': 7.4.6 - unplugin: 1.16.1 - transitivePeerDependencies: - - supports-color - - '@storybook/csf-plugin@8.6.14(storybook@8.6.14(prettier@3.6.2))': - dependencies: - storybook: 8.6.14(prettier@3.6.2) - unplugin: 1.16.1 - - '@storybook/csf-plugin@8.6.14(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - unplugin: 1.16.1 - - '@storybook/csf-plugin@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - unplugin: 1.16.1 - - '@storybook/csf-plugin@9.0.12(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - unplugin: 1.16.1 - - '@storybook/csf-plugin@9.0.17(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - unplugin: 1.16.1 - - '@storybook/csf-tools@6.5.16': - dependencies: - '@babel/core': 7.27.4 - '@babel/generator': 7.27.5 - '@babel/parser': 7.28.0 - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/preset-env': 7.27.2(@babel/core@7.27.4) - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 - '@storybook/csf': 0.0.2--canary.4566f4d.1 - '@storybook/mdx1-csf': 0.0.1(@babel/core@7.27.4) - core-js: 3.43.0 - fs-extra: 9.1.0 - global: 4.4.0 - regenerator-runtime: 0.13.11 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - supports-color - - '@storybook/csf-tools@7.4.6': - dependencies: - '@babel/generator': 7.27.5 - '@babel/parser': 7.28.0 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 - '@storybook/csf': 0.1.13 - '@storybook/types': 7.4.6 - fs-extra: 11.3.0 - recast: 0.23.11 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - supports-color - - '@storybook/csf-tools@7.6.20': - dependencies: - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 - '@storybook/csf': 0.1.13 - '@storybook/types': 7.6.20 - fs-extra: 11.3.0 - recast: 0.23.11 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - supports-color - - '@storybook/csf@0.0.2--canary.4566f4d.1': - dependencies: - lodash: 4.17.21 - - '@storybook/csf@0.1.13': - dependencies: - type-fest: 2.19.0 - - '@storybook/docs-mdx@0.1.0': {} - - '@storybook/docs-tools@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@babel/core': 7.27.4 - '@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.43.0 - doctrine: 3.0.0 - lodash: 4.17.21 - regenerator-runtime: 0.13.11 - transitivePeerDependencies: - - react - - react-dom - - supports-color - - '@storybook/docs-tools@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@babel/core': 7.27.4 - '@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.43.0 - doctrine: 3.0.0 - lodash: 4.17.21 - regenerator-runtime: 0.13.11 - transitivePeerDependencies: - - react - - react-dom - - supports-color - - '@storybook/docs-tools@7.4.6(encoding@0.1.13)': - dependencies: - '@storybook/core-common': 7.4.6(encoding@0.1.13) - '@storybook/preview-api': 7.4.6 - '@storybook/types': 7.4.6 - '@types/doctrine': 0.0.3 - doctrine: 3.0.0 - lodash: 4.17.21 - transitivePeerDependencies: - - encoding - - supports-color - - '@storybook/global@5.0.0': {} - - '@storybook/icons@1.4.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@storybook/instrumenter@8.6.14(storybook@8.6.14(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - '@vitest/utils': 2.1.9 - storybook: 8.6.14(prettier@3.6.2) - - '@storybook/instrumenter@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - '@vitest/utils': 2.1.9 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - optional: true - - '@storybook/manager-api@7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@storybook/channels': 7.4.6 - '@storybook/client-logger': 7.4.6 - '@storybook/core-events': 7.4.6 - '@storybook/csf': 0.1.13 - '@storybook/global': 5.0.0 - '@storybook/router': 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 - dequal: 2.0.3 - lodash: 4.17.21 - memoizerific: 1.11.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - semver: 7.7.2 - store2: 2.14.4 - telejson: 7.2.0 - ts-dedent: 2.2.0 - - '@storybook/manager-api@8.6.14(storybook@8.6.14(prettier@3.6.2))': - dependencies: - storybook: 8.6.14(prettier@3.6.2) - - '@storybook/manager-api@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - - '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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.4 - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) - '@babel/preset-react': 7.27.1(@babel/core@7.27.4) - '@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.100.2) - '@storybook/core-common': 6.5.16(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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.4)(webpack@5.100.2) - case-sensitive-paths-webpack-plugin: 2.4.0 - chalk: 4.1.2 - core-js: 3.43.0 - css-loader: 3.6.0(webpack@5.100.2) - express: 4.21.2 - file-loader: 6.2.0(webpack@5.100.2) - find-up: 5.0.0 - fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.100.2) - node-fetch: 2.7.0(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.100.2) - telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.100.2) - ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) - util-deprecate: 1.0.2 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - webpack-dev-middleware: 3.7.3(webpack@5.100.2) - webpack-virtual-modules: 0.2.2 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@swc/core' - - bluebird - - encoding - - esbuild - - eslint - - supports-color - - uglify-js - - vue-template-compiler - - webpack-cli - - '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': - dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) - '@babel/preset-react': 7.27.1(@babel/core@7.27.4) - '@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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.4.2))(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.4)(webpack@5.100.2) - case-sensitive-paths-webpack-plugin: 2.4.0 - chalk: 4.1.2 - core-js: 3.43.0 - css-loader: 3.6.0(webpack@5.100.2) - express: 4.21.2 - file-loader: 6.2.0(webpack@5.100.2) - find-up: 5.0.0 - fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.100.2) - node-fetch: 2.7.0(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.100.2) - telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.100.2) - ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) - util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.100.2) - webpack-virtual-modules: 0.2.2 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@swc/core' - - bluebird - - 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.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': - dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) - '@babel/preset-react': 7.27.1(@babel/core@7.27.4) - '@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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4)(webpack@5.100.2) - case-sensitive-paths-webpack-plugin: 2.4.0 - chalk: 4.1.2 - core-js: 3.43.0 - css-loader: 3.6.0(webpack@5.100.2) - express: 4.21.2 - file-loader: 6.2.0(webpack@5.100.2) - find-up: 5.0.0 - fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.100.2) - node-fetch: 2.7.0(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.100.2) - telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.100.2) - ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) - util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.100.2) - webpack-virtual-modules: 0.2.2 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@swc/core' - - bluebird - - 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.4.2))(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.4 - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) - '@babel/preset-react': 7.27.1(@babel/core@7.27.4) - '@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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4)(webpack@5.100.2) - case-sensitive-paths-webpack-plugin: 2.4.0 - chalk: 4.1.2 - core-js: 3.43.0 - css-loader: 3.6.0(webpack@5.100.2) - express: 4.21.2 - file-loader: 6.2.0(webpack@5.100.2) - find-up: 5.0.0 - fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.100.2) - node-fetch: 2.7.0(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.100.2) - telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.100.2) - ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) - util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.100.2) - webpack-virtual-modules: 0.2.2 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@swc/core' - - bluebird - - 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.4.2))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': - dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) - '@babel/preset-react': 7.27.1(@babel/core@7.27.4) - '@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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4)(webpack@5.100.2) - case-sensitive-paths-webpack-plugin: 2.4.0 - chalk: 4.1.2 - core-js: 3.43.0 - css-loader: 3.6.0(webpack@5.100.2) - express: 4.21.2 - file-loader: 6.2.0(webpack@5.100.2) - find-up: 5.0.0 - fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.100.2) - node-fetch: 2.7.0(encoding@0.1.13) - pnp-webpack-plugin: 1.6.4(typescript@4.9.5) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - read-pkg-up: 7.0.1 - regenerator-runtime: 0.13.11 - resolve-from: 5.0.0 - style-loader: 1.3.0(webpack@5.100.2) - telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.100.2) - ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.100.2))(webpack@5.100.2) - util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.100.2) - webpack-virtual-modules: 0.2.2 - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - '@swc/core' - - bluebird - - encoding - - esbuild - - eslint - - supports-color - - uglify-js - - vue-template-compiler - - webpack-cli - - '@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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.4 - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) - '@babel/preset-react': 7.27.1(@babel/core@7.27.4) - '@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.100.2) - '@storybook/core-common': 6.5.16(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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.4)(webpack@5.100.2) - case-sensitive-paths-webpack-plugin: 2.4.0 - chalk: 4.1.2 - core-js: 3.43.0 - css-loader: 5.2.7(webpack@5.100.2) - express: 4.21.2 - find-up: 5.0.0 - fs-extra: 9.1.0 - html-webpack-plugin: 5.6.3(webpack@5.100.2) - node-fetch: 2.7.0(encoding@0.1.13) - process: 0.11.10 - 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: 2.0.0(webpack@5.100.2) - telejson: 6.0.8 - terser-webpack-plugin: 5.3.14(esbuild@0.25.5)(webpack@5.100.2) - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - webpack-dev-middleware: 4.3.0(webpack@5.100.2) - webpack-virtual-modules: 0.4.6 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@rspack/core' - - '@swc/core' - - encoding - - esbuild - - eslint - - supports-color - - uglify-js - - vue-template-compiler - - webpack-cli - - '@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.4 - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) - '@babel/preset-react': 7.27.1(@babel/core@7.27.4) - '@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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4)(webpack@5.100.2) - case-sensitive-paths-webpack-plugin: 2.4.0 - chalk: 4.1.2 - core-js: 3.43.0 - css-loader: 5.2.7(webpack@5.100.2) - express: 4.21.2 - find-up: 5.0.0 - fs-extra: 9.1.0 - html-webpack-plugin: 5.6.3(webpack@5.100.2) - node-fetch: 2.7.0(encoding@0.1.13) - process: 0.11.10 - 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: 2.0.0(webpack@5.100.2) - telejson: 6.0.8 - terser-webpack-plugin: 5.3.14(webpack@5.100.2) - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-dev-middleware: 4.3.0(webpack@5.100.2) - webpack-virtual-modules: 0.4.6 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@rspack/core' - - '@swc/core' - - encoding - - esbuild - - eslint - - supports-color - - uglify-js - - vue-template-compiler - - webpack-cli - - '@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.4 - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.4) - '@babel/preset-react': 7.27.1(@babel/core@7.27.4) - '@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.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4)(webpack@5.100.2) - case-sensitive-paths-webpack-plugin: 2.4.0 - chalk: 4.1.2 - core-js: 3.43.0 - css-loader: 5.2.7(webpack@5.100.2) - express: 4.21.2 - find-up: 5.0.0 - fs-extra: 9.1.0 - html-webpack-plugin: 5.6.3(webpack@5.100.2) - node-fetch: 2.7.0(encoding@0.1.13) - process: 0.11.10 - 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: 2.0.0(webpack@5.100.2) - telejson: 6.0.8 - terser-webpack-plugin: 5.3.14(webpack@5.100.2) - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - webpack: 5.100.2(webpack-cli@6.0.1) - webpack-dev-middleware: 4.3.0(webpack@5.100.2) - webpack-virtual-modules: 0.4.6 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@rspack/core' - - '@swc/core' - - encoding - - esbuild - - eslint - - supports-color - - uglify-js - - vue-template-compiler - - webpack-cli - - '@storybook/manager@7.6.20': {} - - '@storybook/mdx1-csf@0.0.1(@babel/core@7.27.4)': - dependencies: - '@babel/generator': 7.27.5 - '@babel/parser': 7.27.5 - '@babel/preset-env': 7.27.2(@babel/core@7.27.4) - '@babel/types': 7.27.6 - '@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 - prettier: 2.3.0 - ts-dedent: 2.2.0 - transitivePeerDependencies: - - '@babel/core' - - supports-color - - '@storybook/mdx2-csf@1.1.0': {} - - '@storybook/node-logger@6.5.16': - dependencies: - '@types/npmlog': 4.1.6 - chalk: 4.1.2 - core-js: 3.43.0 - npmlog: 5.0.1 - pretty-hrtime: 1.0.3 - - '@storybook/node-logger@7.4.6': {} - - '@storybook/node-logger@7.6.20': {} - - '@storybook/postinstall@6.5.16': - dependencies: - core-js: 3.43.0 - - '@storybook/postinstall@7.4.6': {} - - '@storybook/preset-react-webpack@7.4.6(@babel/core@7.27.4)(@swc/core@1.12.5(@swc/helpers@0.5.17))(@types/webpack@5.28.5(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6))(encoding@0.1.13)(esbuild@0.25.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)))(webpack-hot-middleware@2.26.1)': - dependencies: - '@babel/preset-flow': 7.27.1(@babel/core@7.27.4) - '@babel/preset-react': 7.27.1(@babel/core@7.27.4) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.16(@types/webpack@5.28.5(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)))(webpack-hot-middleware@2.26.1)(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)) - '@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.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)) - '@types/node': 16.18.126 - '@types/semver': 7.7.0 - babel-plugin-add-react-displayname: 0.0.5 - babel-plugin-react-docgen: 4.2.1 - fs-extra: 11.3.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-refresh: 0.11.0 - semver: 7.7.2 - webpack: 5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6) - optionalDependencies: - '@babel/core': 7.27.4 - typescript: 5.8.3 - transitivePeerDependencies: - - '@swc/core' - - '@types/webpack' - - encoding - - esbuild - - sockjs-client - - supports-color - - type-fest - - uglify-js - - webpack-cli - - webpack-dev-server - - webpack-hot-middleware - - webpack-plugin-serve - - '@storybook/preset-react-webpack@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.6.2)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.6.2))(typescript@5.8.3)': - dependencies: - '@storybook/core-webpack': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.6.2)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.6.2))(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.100.2) - '@types/semver': 7.7.0 - find-up: 5.0.0 - magic-string: 0.30.17 - react: 18.2.0 - react-docgen: 7.1.1 - react-dom: 18.2.0(react@18.2.0) - resolve: 1.22.10 - semver: 7.7.2 - storybook: 8.6.14(prettier@3.6.2) - tsconfig-paths: 4.2.0 - webpack: 5.100.2(webpack-cli@4.10.0) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@storybook/test' - - '@swc/core' - - esbuild - - supports-color - - uglify-js - - webpack-cli - - '@storybook/preset-react-webpack@8.6.14(@storybook/test@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3)(webpack-cli@5.1.4)': - dependencies: - '@storybook/core-webpack': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.100.2) - '@types/semver': 7.7.0 - find-up: 5.0.0 - magic-string: 0.30.17 - react: 18.2.0 - react-docgen: 7.1.1 - react-dom: 18.2.0(react@18.2.0) - resolve: 1.22.10 - semver: 7.7.2 - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - tsconfig-paths: 4.2.0 - webpack: 5.100.2(webpack-cli@5.1.4) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@storybook/test' - - '@swc/core' - - esbuild - - supports-color - - uglify-js - - webpack-cli - - '@storybook/preview-api@7.4.6': - dependencies: - '@storybook/channels': 7.4.6 - '@storybook/client-logger': 7.4.6 - '@storybook/core-events': 7.4.6 - '@storybook/csf': 0.1.13 - '@storybook/global': 5.0.0 - '@storybook/types': 7.4.6 - '@types/qs': 6.14.0 - dequal: 2.0.3 - lodash: 4.17.21 - memoizerific: 1.11.3 - qs: 6.14.0 - synchronous-promise: 2.0.17 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - - '@storybook/preview-api@7.6.20': - dependencies: - '@storybook/channels': 7.6.20 - '@storybook/client-logger': 7.6.20 - '@storybook/core-events': 7.6.20 - '@storybook/csf': 0.1.13 - '@storybook/global': 5.0.0 - '@storybook/types': 7.6.20 - '@types/qs': 6.14.0 - dequal: 2.0.3 - lodash: 4.17.21 - memoizerific: 1.11.3 - qs: 6.14.0 - 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.6.2))': - dependencies: - storybook: 8.6.14(prettier@3.6.2) - - '@storybook/preview-api@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - - '@storybook/preview-web@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - 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 - '@storybook/client-logger': 6.5.16 - '@storybook/core-events': 6.5.16 - '@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.43.0 - global: 4.4.0 - lodash: 4.17.21 - qs: 6.14.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - regenerator-runtime: 0.13.11 - synchronous-promise: 2.0.17 - ts-dedent: 2.2.0 - unfetch: 4.2.0 - util-deprecate: 1.0.2 - - '@storybook/preview-web@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - 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 - '@storybook/client-logger': 6.5.16 - '@storybook/core-events': 6.5.16 - '@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.43.0 - global: 4.4.0 - lodash: 4.17.21 - qs: 6.14.0 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - regenerator-runtime: 0.13.11 - synchronous-promise: 2.0.17 - ts-dedent: 2.2.0 - unfetch: 4.2.0 - util-deprecate: 1.0.2 - - '@storybook/preview@7.4.6': {} - - '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.5)(webpack@5.100.2)': - dependencies: - debug: 4.4.1(supports-color@8.1.1) - endent: 2.1.0 - find-cache-dir: 3.3.2 - flat-cache: 3.2.0 - micromatch: 4.0.8 - react-docgen-typescript: 2.4.0(typescript@4.9.5) - tslib: 2.8.1 - typescript: 4.9.5 - webpack: 5.100.2(webpack-cli@4.10.0) - transitivePeerDependencies: - - supports-color - - '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.100.2)': - dependencies: - debug: 4.4.1(supports-color@8.1.1) - endent: 2.1.0 - find-cache-dir: 3.3.2 - flat-cache: 3.2.0 - micromatch: 4.0.8 - react-docgen-typescript: 2.4.0(typescript@5.8.3) - tslib: 2.8.1 - typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@4.10.0) - transitivePeerDependencies: - - supports-color - - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6))': - dependencies: - debug: 4.4.1(supports-color@8.1.1) - endent: 2.1.0 - find-cache-dir: 3.3.2 - flat-cache: 3.2.0 - micromatch: 4.0.8 - react-docgen-typescript: 2.4.0(typescript@5.8.3) - tslib: 2.8.1 - typescript: 5.8.3 - webpack: 5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6) - transitivePeerDependencies: - - supports-color - - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.100.2)': - dependencies: - debug: 4.4.1(supports-color@8.1.1) - endent: 2.1.0 - find-cache-dir: 3.3.2 - flat-cache: 3.2.0 - micromatch: 4.0.8 - react-docgen-typescript: 2.4.0(typescript@5.8.3) - tslib: 2.8.1 - typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@4.10.0) - transitivePeerDependencies: - - supports-color - - '@storybook/react-dom-shim@7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.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.6.2))': - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - storybook: 8.6.14(prettier@3.6.2) - - '@storybook/react-dom-shim@8.6.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - - '@storybook/react-dom-shim@8.6.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - - '@storybook/react-dom-shim@9.0.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - - '@storybook/react-dom-shim@9.0.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - - '@storybook/react-dom-shim@9.0.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - - '@storybook/react-vite@9.0.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@4.44.0)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))': - dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.8.3)(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) - '@rollup/pluginutils': 5.2.0(rollup@4.44.0) - '@storybook/builder-vite': 9.0.17(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0)) - '@storybook/react': 9.0.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3) - find-up: 7.0.0 - magic-string: 0.30.17 - react: 18.2.0 - react-docgen: 8.0.0 - react-dom: 18.2.0(react@18.2.0) - resolve: 1.22.10 - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - tsconfig-paths: 4.2.0 - vite: 6.3.5(@types/node@24.0.14)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) - transitivePeerDependencies: - - rollup - - supports-color - - typescript - - '@storybook/react-webpack5@7.4.6(@babel/core@7.27.4)(@swc/core@1.12.5(@swc/helpers@0.5.17))(@swc/helpers@0.5.17)(@types/react-dom@18.2.0)(@types/react@18.2.0)(@types/webpack@5.28.5(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6))(encoding@0.1.13)(esbuild@0.25.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)))(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)(esbuild@0.25.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/preset-react-webpack': 7.4.6(@babel/core@7.27.4)(@swc/core@1.12.5(@swc/helpers@0.5.17))(@types/webpack@5.28.5(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6))(encoding@0.1.13)(esbuild@0.25.6)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)))(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 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@babel/core': 7.27.4 - typescript: 5.8.3 - transitivePeerDependencies: - - '@rspack/core' - - '@swc/core' - - '@swc/helpers' - - '@types/react' - - '@types/react-dom' - - '@types/webpack' - - encoding - - esbuild - - sockjs-client - - supports-color - - type-fest - - uglify-js - - webpack-cli - - webpack-dev-server - - webpack-hot-middleware - - webpack-plugin-serve - - '@storybook/react-webpack5@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.6.2)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.6.2))(typescript@5.8.3)': - dependencies: - '@storybook/builder-webpack5': 8.6.14(storybook@8.6.14(prettier@3.6.2))(typescript@5.8.3) - '@storybook/preset-react-webpack': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.6.2)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.6.2))(typescript@5.8.3) - '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.6.2)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.6.2))(typescript@5.8.3) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - storybook: 8.6.14(prettier@3.6.2) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@rspack/core' - - '@storybook/test' - - '@swc/core' - - esbuild - - supports-color - - uglify-js - - webpack-cli - - '@storybook/react-webpack5@8.6.14(@storybook/test@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3)(webpack-cli@5.1.4)': - dependencies: - '@storybook/builder-webpack5': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3)(webpack-cli@5.1.4) - '@storybook/preset-react-webpack': 8.6.14(@storybook/test@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3)(webpack-cli@5.1.4) - '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@rspack/core' - - '@storybook/test' - - '@swc/core' - - esbuild - - supports-color - - uglify-js - - webpack-cli - - '@storybook/react@6.5.16(@babel/core@7.27.4)(@storybook/builder-webpack5@6.5.16(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@types/webpack@5.28.5(esbuild@0.25.5)(webpack-cli@6.0.1))(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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.4) - '@babel/preset-react': 7.27.1(@babel/core@7.27.4) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.16(@types/webpack@5.28.5(esbuild@0.25.5)(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.100.2) - '@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(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.100.2) - '@storybook/core-common': 6.5.16(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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.100.2) - '@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.43.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.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - optionalDependencies: - '@babel/core': 7.27.4 - '@storybook/builder-webpack5': 6.5.16(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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' - - bluebird - - 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.4)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4.2))(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.4.2))(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)': - dependencies: - '@babel/preset-flow': 7.27.1(@babel/core@7.27.4) - '@babel/preset-react': 7.27.1(@babel/core@7.27.4) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.16(@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.100.2) - '@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.4.2))(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.4.2))(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.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.100.2) - '@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.43.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.100.2(webpack-cli@4.10.0) - optionalDependencies: - '@babel/core': 7.27.4 - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.4.2))(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' - - '@swc/core' - - '@types/webpack' - - bluebird - - 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.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.26.0(jiti@2.4.2))(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.100.2))(webpack-hot-middleware@2.26.1)': - dependencies: - '@babel/preset-flow': 7.27.1(@babel/core@7.28.0) - '@babel/preset-react': 7.27.1(@babel/core@7.28.0) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.16(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.100.2))(webpack-hot-middleware@2.26.1)(webpack@5.100.2) - '@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.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.100.2) - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.4.2))(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.100.2) - '@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.43.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.100.2(webpack-cli@4.10.0) - optionalDependencies: - '@babel/core': 7.28.0 - typescript: 5.8.3 - transitivePeerDependencies: - - '@storybook/mdx2-csf' - - '@swc/core' - - '@types/webpack' - - bluebird - - 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.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.100.2))(webpack-hot-middleware@2.26.1)': - dependencies: - '@babel/preset-flow': 7.27.1(@babel/core@7.28.0) - '@babel/preset-react': 7.27.1(@babel/core@7.28.0) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.16(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.100.2))(webpack-hot-middleware@2.26.1)(webpack@5.100.2) - '@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.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.100.2) - '@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.43.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.100.2(webpack-cli@4.10.0) - optionalDependencies: - '@babel/core': 7.28.0 - typescript: 5.8.3 - transitivePeerDependencies: - - '@storybook/mdx2-csf' - - '@swc/core' - - '@types/webpack' - - bluebird - - 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.28.0)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.100.2))(webpack-hot-middleware@2.26.1)': - dependencies: - '@babel/preset-flow': 7.27.1(@babel/core@7.28.0) - '@babel/preset-react': 7.27.1(@babel/core@7.28.0) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.16(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.100.2))(webpack-hot-middleware@2.26.1)(webpack@5.100.2) - '@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.4.2))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.100.2) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.4.2))(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.100.2) - '@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 - '@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.43.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: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-element-to-jsx-string: 14.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.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.100.2(webpack-cli@4.10.0) - optionalDependencies: - '@babel/core': 7.28.0 - typescript: 4.9.5 - transitivePeerDependencies: - - '@storybook/mdx2-csf' - - '@swc/core' - - '@types/webpack' - - bluebird - - 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@7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': - dependencies: - '@storybook/client-logger': 7.4.6 - '@storybook/core-client': 7.4.6 - '@storybook/docs-tools': 7.4.6(encoding@0.1.13) - '@storybook/global': 5.0.0 - '@storybook/preview-api': 7.4.6 - '@storybook/react-dom-shim': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/types': 7.4.6 - '@types/escodegen': 0.0.6 - '@types/estree': 0.0.51 - '@types/node': 16.18.126 - acorn: 7.4.1 - acorn-jsx: 5.3.2(acorn@7.4.1) - acorn-walk: 7.2.0 - escodegen: 2.1.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: 15.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - ts-dedent: 2.2.0 - type-fest: 2.19.0 - util-deprecate: 1.0.2 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - encoding - - supports-color - - '@storybook/react@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.6.2)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.6.2))(typescript@5.8.3)': - dependencies: - '@storybook/components': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@storybook/global': 5.0.0 - '@storybook/manager-api': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@storybook/preview-api': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@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.6.2)) - '@storybook/theming': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - storybook: 8.6.14(prettier@3.6.2) - optionalDependencies: - '@storybook/test': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - typescript: 5.8.3 - - '@storybook/react@8.6.14(@storybook/test@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3)': - dependencies: - '@storybook/components': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/global': 5.0.0 - '@storybook/manager-api': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/preview-api': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/react-dom-shim': 8.6.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@storybook/theming': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - optionalDependencies: - '@storybook/test': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - typescript: 5.8.3 - - '@storybook/react@9.0.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3)': - dependencies: - '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 9.0.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - optionalDependencies: - typescript: 5.8.3 - - '@storybook/react@9.0.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3)': - dependencies: - '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 9.0.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2)) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - optionalDependencies: - 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.43.0 - memoizerific: 1.11.3 - qs: 6.14.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - regenerator-runtime: 0.13.11 - - '@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.43.0 - memoizerific: 1.11.3 - qs: 6.14.0 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - regenerator-runtime: 0.13.11 - - '@storybook/router@7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@storybook/client-logger': 7.4.6 - memoizerific: 1.11.3 - qs: 6.14.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@storybook/semver@7.3.2': - dependencies: - core-js: 3.43.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)': - dependencies: - '@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.43.0 - estraverse: 5.3.0 - global: 4.4.0 - loader-utils: 2.0.4 - lodash: 4.17.21 - prettier: 2.3.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - regenerator-runtime: 0.13.11 - - '@storybook/store@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@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-events': 6.5.16 - '@storybook/csf': 0.0.2--canary.4566f4d.1 - core-js: 3.43.0 - fast-deep-equal: 3.1.3 - global: 4.4.0 - lodash: 4.17.21 - memoizerific: 1.11.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - regenerator-runtime: 0.13.11 - slash: 3.0.0 - stable: 0.1.8 - synchronous-promise: 2.0.17 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - - '@storybook/store@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@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-events': 6.5.16 - '@storybook/csf': 0.0.2--canary.4566f4d.1 - core-js: 3.43.0 - fast-deep-equal: 3.1.3 - global: 4.4.0 - lodash: 4.17.21 - memoizerific: 1.11.3 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - regenerator-runtime: 0.13.11 - slash: 3.0.0 - stable: 0.1.8 - synchronous-promise: 2.0.17 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - - '@storybook/store@7.4.6': - dependencies: - '@storybook/client-logger': 7.4.6 - '@storybook/preview-api': 7.4.6 - - '@storybook/telemetry@6.5.16(encoding@0.1.13)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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.43.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 - 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@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.4.2))(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.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - chalk: 4.1.2 - core-js: 3.43.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 - 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@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.27.0(jiti@2.4.2))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - chalk: 4.1.2 - core-js: 3.43.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 - 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@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.4.2))(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.43.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 - 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@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.4.2))(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.4.2))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) - chalk: 4.1.2 - core-js: 3.43.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 - 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)': - 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.0 - read-pkg-up: 7.0.1 - transitivePeerDependencies: - - encoding - - supports-color - - '@storybook/test@8.6.14(storybook@8.6.14(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@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.6.2) - - '@storybook/test@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2)) - '@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: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - optional: true - - '@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.43.0 - memoizerific: 1.11.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - regenerator-runtime: 0.13.11 - - '@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.43.0 - memoizerific: 1.11.3 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - regenerator-runtime: 0.13.11 - - '@storybook/theming@7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.2.0) - '@storybook/client-logger': 7.4.6 - '@storybook/global': 5.0.0 - memoizerific: 1.11.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@storybook/theming@8.6.14(storybook@8.6.14(prettier@3.6.2))': - dependencies: - storybook: 8.6.14(prettier@3.6.2) - - '@storybook/theming@8.6.14(storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2))': - dependencies: - storybook: 9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2) - - '@storybook/types@7.4.6': - dependencies: - '@storybook/channels': 7.4.6 - '@types/babel__core': 7.20.5 - '@types/express': 4.17.23 - file-system-cache: 2.3.0 - - '@storybook/types@7.6.20': - dependencies: - '@storybook/channels': 7.6.20 - '@types/babel__core': 7.20.5 - '@types/express': 4.17.23 - file-system-cache: 2.3.0 - - '@storybook/ui@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.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/channels': 6.5.16 - '@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-events': 6.5.16 - '@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.43.0 - memoizerific: 1.11.3 - qs: 6.14.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - regenerator-runtime: 0.13.11 - resolve-from: 5.0.0 - - '@storybook/ui@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@storybook/addons': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@storybook/api': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@storybook/channels': 6.5.16 - '@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-events': 6.5.16 - '@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.43.0 - memoizerific: 1.11.3 - qs: 6.14.0 - 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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-error': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-ast': 1.0.0-beta.43 - '@swagger-api/apidom-error': 1.0.0-beta.43 - '@types/ramda': 0.30.2 - minim: 0.23.8 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - short-unique-id: 5.3.2 - ts-mixer: 6.0.4 - - '@swagger-api/apidom-error@1.0.0-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - - '@swagger-api/apidom-json-pointer@1.0.0-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-error': 1.0.0-beta.43 - '@swaggerexpert/json-pointer': 2.10.2 - - '@swagger-api/apidom-ns-api-design-systems@1.0.0-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-error': 1.0.0-beta.43 - '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-ns-json-schema-2020-12': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-ns-json-schema-draft-7': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-error': 1.0.0-beta.43 - '@swagger-api/apidom-ns-json-schema-draft-7': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-error': 1.0.0-beta.43 - '@swagger-api/apidom-ns-json-schema-2019-09': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-ast': 1.0.0-beta.43 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-error': 1.0.0-beta.43 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-error': 1.0.0-beta.43 - '@swagger-api/apidom-ns-json-schema-draft-6': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-error': 1.0.0-beta.43 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-error': 1.0.0-beta.43 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-ast': 1.0.0-beta.43 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-json-pointer': 1.0.0-beta.43 - '@swagger-api/apidom-ns-json-schema-2020-12': 1.0.0-beta.43 - '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-ns-api-design-systems': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-ns-api-design-systems': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-ns-arazzo-1': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-ns-arazzo-1': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-ns-asyncapi-2': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-ns-asyncapi-2': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-ast': 1.0.0-beta.43 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-error': 1.0.0-beta.43 - '@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) - web-tree-sitter: 0.24.5 - optional: true - - '@swagger-api/apidom-parser-adapter-openapi-json-2@1.0.0-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-ns-openapi-2': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-ns-openapi-2': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-beta.43 - '@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-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-ast': 1.0.0-beta.43 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-error': 1.0.0-beta.43 - '@tree-sitter-grammars/tree-sitter-yaml': 0.7.1(tree-sitter@0.22.4) - '@types/ramda': 0.30.2 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - tree-sitter: 0.22.4 - web-tree-sitter: 0.24.5 - optional: true - - '@swagger-api/apidom-reference@1.0.0-beta.43': - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-error': 1.0.0-beta.43 - '@types/ramda': 0.30.2 - axios: 1.9.0 - minimatch: 7.4.6 - process: 0.11.10 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - optionalDependencies: - '@swagger-api/apidom-json-pointer': 1.0.0-beta.43 - '@swagger-api/apidom-ns-arazzo-1': 1.0.0-beta.43 - '@swagger-api/apidom-ns-asyncapi-2': 1.0.0-beta.43 - '@swagger-api/apidom-ns-openapi-2': 1.0.0-beta.43 - '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-beta.43 - '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-api-design-systems-json': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-api-design-systems-yaml': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-arazzo-json-1': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-arazzo-yaml-1': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-asyncapi-json-2': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-openapi-json-2': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-openapi-json-3-0': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-openapi-json-3-1': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-openapi-yaml-2': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1': 1.0.0-beta.43 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-beta.43 - transitivePeerDependencies: - - debug - - '@swaggerexpert/cookie@2.0.2': - dependencies: - apg-lite: 1.0.5 - - '@swaggerexpert/json-pointer@2.10.2': - dependencies: - apg-lite: 1.0.5 - - '@swc/core-darwin-arm64@1.12.5': - optional: true - - '@swc/core-darwin-x64@1.12.5': - optional: true - - '@swc/core-linux-arm-gnueabihf@1.12.5': - optional: true - - '@swc/core-linux-arm64-gnu@1.12.5': - optional: true - - '@swc/core-linux-arm64-musl@1.12.5': - optional: true - - '@swc/core-linux-x64-gnu@1.12.5': - optional: true - - '@swc/core-linux-x64-musl@1.12.5': - optional: true - - '@swc/core-win32-arm64-msvc@1.12.5': - optional: true - - '@swc/core-win32-ia32-msvc@1.12.5': - optional: true - - '@swc/core-win32-x64-msvc@1.12.5': - optional: true - - '@swc/core@1.12.5(@swc/helpers@0.5.17)': - dependencies: - '@swc/counter': 0.1.3 - '@swc/types': 0.1.23 - optionalDependencies: - '@swc/core-darwin-arm64': 1.12.5 - '@swc/core-darwin-x64': 1.12.5 - '@swc/core-linux-arm-gnueabihf': 1.12.5 - '@swc/core-linux-arm64-gnu': 1.12.5 - '@swc/core-linux-arm64-musl': 1.12.5 - '@swc/core-linux-x64-gnu': 1.12.5 - '@swc/core-linux-x64-musl': 1.12.5 - '@swc/core-win32-arm64-msvc': 1.12.5 - '@swc/core-win32-ia32-msvc': 1.12.5 - '@swc/core-win32-x64-msvc': 1.12.5 - '@swc/helpers': 0.5.17 - - '@swc/counter@0.1.3': {} - - '@swc/helpers@0.5.17': - dependencies: - tslib: 2.8.1 - - '@swc/types@0.1.23': - dependencies: - '@swc/counter': 0.1.3 - - '@szmarczak/http-timer@5.0.1': - dependencies: - defer-to-connect: 2.0.1 - - '@tanstack/query-core@4.27.0': {} - - '@tanstack/query-core@4.40.0': {} - - '@tanstack/query-core@5.76.0': {} - - '@tanstack/query-core@5.76.2': {} - - '@tanstack/query-core@5.77.1': {} - - '@tanstack/query-core@5.81.2': {} - - '@tanstack/query-persist-client-core@4.27.0': - dependencies: - '@tanstack/query-core': 4.27.0 - - '@tanstack/react-query-persist-client@4.28.0(@tanstack/react-query@4.28.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))': - dependencies: - '@tanstack/query-persist-client-core': 4.27.0 - '@tanstack/react-query': 4.28.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - - '@tanstack/react-query@4.0.10(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@tanstack/query-core': 4.40.0 - '@types/use-sync-external-store': 0.0.3 - react: 19.1.0 - use-sync-external-store: 1.5.0(react@19.1.0) - optionalDependencies: - react-dom: 19.1.0(react@19.1.0) - - '@tanstack/react-query@4.28.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@tanstack/query-core': 4.27.0 - react: 18.2.0 - use-sync-external-store: 1.5.0(react@18.2.0) - optionalDependencies: - react-dom: 18.2.0(react@18.2.0) - - '@tanstack/react-query@5.76.1(react@18.2.0)': - dependencies: - '@tanstack/query-core': 5.76.0 - react: 18.2.0 - - '@tanstack/react-query@5.76.2(react@18.2.0)': - dependencies: - '@tanstack/query-core': 5.76.2 - react: 18.2.0 - - '@tanstack/react-query@5.77.1(react@18.2.0)': - dependencies: - '@tanstack/query-core': 5.77.1 - react: 18.2.0 - - '@tanstack/react-virtual@3.13.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@tanstack/virtual-core': 3.13.10 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - '@tanstack/virtual-core@3.13.10': {} - - '@testing-library/dom@10.4.0': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.27.6 - '@types/aria-query': 5.0.4 - aria-query: 5.3.0 - chalk: 4.1.2 - dom-accessibility-api: 0.5.16 - lz-string: 1.5.0 - pretty-format: 27.5.1 - - '@testing-library/jest-dom@6.5.0': - dependencies: - '@adobe/css-tools': 4.4.3 - aria-query: 5.3.2 - chalk: 3.0.0 - css.escape: 1.5.1 - dom-accessibility-api: 0.6.3 - lodash: 4.17.21 - redent: 3.0.0 - - '@testing-library/jest-dom@6.6.3': - dependencies: - '@adobe/css-tools': 4.4.3 - aria-query: 5.3.2 - chalk: 3.0.0 - css.escape: 1.5.1 - dom-accessibility-api: 0.6.3 - lodash: 4.17.21 - redent: 3.0.0 - - '@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@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.27.6 - '@testing-library/dom': 10.4.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - '@types/react-dom': 18.2.0 - - '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)': - dependencies: - '@testing-library/dom': 10.4.0 - - '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)': - dependencies: - '@testing-library/dom': 10.4.0 - - '@textlint/ast-node-types@14.8.4': {} - - '@textlint/linter-formatter@14.8.4': - dependencies: - '@azu/format-text': 1.0.2 - '@azu/style-format': 1.0.1 - '@textlint/module-interop': 14.8.4 - '@textlint/resolver': 14.8.4 - '@textlint/types': 14.8.4 - chalk: 4.1.2 - debug: 4.4.1(supports-color@8.1.1) - js-yaml: 3.14.1 - lodash: 4.17.21 - pluralize: 2.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - table: 6.9.0 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - '@textlint/module-interop@14.8.4': {} - - '@textlint/resolver@14.8.4': {} - - '@textlint/types@14.8.4': - dependencies: - '@textlint/ast-node-types': 14.8.4 - - '@tokenizer/token@0.3.0': {} - - '@tootallnate/once@1.1.2': {} - - '@tootallnate/once@2.0.0': {} - - '@tree-sitter-grammars/tree-sitter-yaml@0.7.1(tree-sitter@0.22.4)': - dependencies: - node-addon-api: 8.4.0 - node-gyp-build: 4.8.4 - optionalDependencies: - tree-sitter: 0.22.4 - optional: true - - '@trysound/sax@0.2.0': {} - - '@ts-morph/common@0.23.0': - dependencies: - fast-glob: 3.3.3 - minimatch: 9.0.5 - mkdirp: 3.0.1 - path-browserify: 1.0.1 - - '@ts-morph/common@0.27.0': - dependencies: - fast-glob: 3.3.3 - minimatch: 10.0.3 - path-browserify: 1.0.1 - - '@types/aria-query@5.0.4': {} - - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - '@types/babel__generator': 7.27.0 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.7 - - '@types/babel__generator@7.27.0': - dependencies: - '@babel/types': 7.27.6 - - '@types/babel__template@7.4.4': - dependencies: - '@babel/parser': 7.27.5 - '@babel/types': 7.27.6 - - '@types/babel__traverse@7.20.7': - dependencies: - '@babel/types': 7.28.1 - - '@types/blueimp-md5@2.18.2': {} - - '@types/body-parser@1.19.6': - dependencies: - '@types/connect': 3.4.38 - '@types/node': 22.15.32 - - '@types/bonjour@3.5.13': - dependencies: - '@types/node': 22.15.32 - - '@types/byline@4.2.36': - dependencies: - '@types/node': 22.15.32 - - '@types/chai@4.3.20': {} - - '@types/chai@5.2.2': - dependencies: - '@types/deep-eql': 4.0.2 - - '@types/classnames@2.3.4': - dependencies: - classnames: 2.5.1 - - '@types/codemirror@0.0.90': - dependencies: - '@types/tern': 0.23.9 - - '@types/codemirror@5.60.16': - dependencies: - '@types/tern': 0.23.9 - - '@types/connect-history-api-fallback@1.5.4': - dependencies: - '@types/express-serve-static-core': 5.0.6 - '@types/node': 22.15.32 - - '@types/connect@3.4.38': - dependencies: - '@types/node': 22.15.32 - - '@types/cross-spawn@6.0.6': - dependencies: - '@types/node': 24.0.14 - - '@types/dagre@0.7.52': {} - - '@types/debug@4.1.12': - dependencies: - '@types/ms': 2.1.0 - - '@types/deep-eql@4.0.2': {} - - '@types/deep-equal@1.0.4': {} - - '@types/detect-port@1.3.5': {} - - '@types/doctrine@0.0.3': {} - - '@types/doctrine@0.0.9': {} - - '@types/ejs@3.1.5': {} - - '@types/emscripten@1.40.1': {} - - '@types/escodegen@0.0.6': {} - - '@types/eslint-scope@3.7.7': - dependencies: - '@types/eslint': 9.6.1 - '@types/estree': 1.0.8 - - '@types/eslint-visitor-keys@1.0.0': {} - - '@types/eslint@9.6.1': - dependencies: - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - - '@types/estree-jsx@1.0.5': - dependencies: - '@types/estree': 1.0.8 - - '@types/estree@0.0.39': {} - - '@types/estree@0.0.51': {} - - '@types/estree@1.0.8': {} - - '@types/express-serve-static-core@4.19.6': - dependencies: - '@types/node': 22.15.32 - '@types/qs': 6.14.0 - '@types/range-parser': 1.2.7 - '@types/send': 0.17.5 - - '@types/express-serve-static-core@5.0.6': - dependencies: - '@types/node': 22.15.32 - '@types/qs': 6.14.0 - '@types/range-parser': 1.2.7 - '@types/send': 0.17.5 - - '@types/express@4.17.23': - dependencies: - '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 4.19.6 - '@types/qs': 6.14.0 - '@types/serve-static': 1.15.8 - - '@types/find-cache-dir@3.2.1': {} - - '@types/fs-extra@11.0.4': - dependencies: - '@types/jsonfile': 6.1.4 - '@types/node': 22.15.32 - - '@types/glob@7.2.0': - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 16.18.126 - - '@types/glob@8.1.0': - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 22.15.32 - - '@types/graceful-fs@4.1.9': - dependencies: - '@types/node': 22.15.32 - - '@types/handlebars@4.1.0': - dependencies: - handlebars: 4.7.8 - - '@types/hast@2.3.10': - dependencies: - '@types/unist': 2.0.11 - - '@types/hast@3.0.4': - dependencies: - '@types/unist': 3.0.3 - - '@types/hoist-non-react-statics@3.3.6': - dependencies: - '@types/react': 18.2.0 - hoist-non-react-statics: 3.3.2 - - '@types/html-minifier-terser@5.1.2': {} - - '@types/html-minifier-terser@6.1.0': {} - - '@types/http-cache-semantics@4.0.4': {} - - '@types/http-errors@2.0.5': {} - - '@types/http-proxy@1.17.16': - dependencies: - '@types/node': 22.15.32 - - '@types/is-function@1.0.3': {} - - '@types/istanbul-lib-coverage@2.0.6': {} - - '@types/istanbul-lib-report@3.0.3': - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - - '@types/istanbul-reports@1.1.2': - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-lib-report': 3.0.3 - - '@types/istanbul-reports@3.0.4': - dependencies: - '@types/istanbul-lib-report': 3.0.3 - - '@types/jest@25.2.3': - dependencies: - jest-diff: 25.5.0 - pretty-format: 25.5.0 - - '@types/jest@29.5.14': - dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 - - '@types/js-yaml@4.0.9': {} - - '@types/jsdom@20.0.1': - dependencies: - '@types/node': 22.15.32 - '@types/tough-cookie': 4.0.5 - parse5: 7.3.0 - - '@types/json-schema@7.0.15': {} - - '@types/json5@0.0.29': {} - - '@types/jsonfile@6.1.4': - dependencies: - '@types/node': 22.15.32 - - '@types/keyv@3.1.4': - dependencies: - '@types/node': 24.0.14 - - '@types/lodash.camelcase@4.3.9': - dependencies: - '@types/lodash': 4.17.17 - - '@types/lodash.clonedeep@4.5.9': - dependencies: - '@types/lodash': 4.17.17 - - '@types/lodash.debounce@4.0.9': - dependencies: - '@types/lodash': 4.17.17 - - '@types/lodash@4.14.202': {} - - '@types/lodash@4.17.16': {} - - '@types/lodash@4.17.17': {} - - '@types/mdast@3.0.15': - dependencies: - '@types/unist': 2.0.11 - - '@types/mdast@4.0.4': - dependencies: - '@types/unist': 3.0.3 - - '@types/mdurl@1.0.5': {} - - '@types/mdx@2.0.13': {} - - '@types/mime-types@2.1.4': {} - - '@types/mime@1.3.5': {} - - '@types/minimatch@5.1.2': {} - - '@types/minimist@1.2.5': {} - - '@types/mocha@10.0.10': {} - - '@types/mousetrap@1.6.15': {} - - '@types/ms@2.1.0': {} - - '@types/mustache@4.2.6': {} - - '@types/node-fetch@2.6.12': - dependencies: - '@types/node': 22.15.32 - form-data: 4.0.4 - - '@types/node-forge@1.3.11': - dependencies: - '@types/node': 22.15.32 - - '@types/node@16.18.126': {} - - '@types/node@18.19.112': - dependencies: - undici-types: 5.26.5 - - '@types/node@22.15.18': - dependencies: - undici-types: 6.21.0 - - '@types/node@22.15.21': - dependencies: - undici-types: 6.21.0 - - '@types/node@22.15.32': - dependencies: - undici-types: 6.21.0 - - '@types/node@24.0.14': - dependencies: - undici-types: 7.8.0 - - '@types/normalize-package-data@2.4.4': {} - - '@types/npmlog@4.1.6': - dependencies: - '@types/node': 22.15.32 - - '@types/parse-json@4.0.2': {} - - '@types/parse5@5.0.3': {} - - '@types/parse5@6.0.3': {} - - '@types/prettier@1.19.1': {} - - '@types/pretty-hrtime@1.0.3': {} - - '@types/prismjs@1.26.5': {} - - '@types/prop-types@15.7.15': {} - - '@types/qs@6.14.0': {} - - '@types/ramda@0.30.2': - dependencies: - types-ramda: 0.30.1 - - '@types/range-parser@1.2.7': {} - - '@types/react-collapse@5.0.4': - dependencies: - '@types/react': 18.2.0 - - '@types/react-dom@17.0.14': - dependencies: - '@types/react': 18.2.0 - - '@types/react-dom@17.0.26(@types/react@18.2.0)': - dependencies: - '@types/react': 18.2.0 - - '@types/react-dom@18.2.0': - dependencies: - '@types/react': 18.2.0 - - '@types/react-lottie@1.2.10': - dependencies: - '@types/react': 18.2.0 - - '@types/react-split-pane@0.1.67(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - react-split-pane: 0.1.92(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - transitivePeerDependencies: - - react - - react-dom - - '@types/react-syntax-highlighter@15.5.13': - dependencies: - '@types/react': 18.2.0 - - '@types/react-test-renderer@19.1.0': - dependencies: - '@types/react': 18.2.0 - - '@types/react@17.0.87': - dependencies: - '@types/prop-types': 15.7.15 - '@types/scheduler': 0.16.8 - csstype: 3.1.3 - - '@types/react@18.2.0': - dependencies: - '@types/prop-types': 15.7.15 - '@types/scheduler': 0.26.0 - csstype: 3.1.3 - - '@types/resolve@1.17.1': - dependencies: - '@types/node': 22.15.32 - - '@types/resolve@1.20.2': {} - - '@types/resolve@1.20.6': {} - - '@types/responselike@1.0.3': - dependencies: - '@types/node': 24.0.14 - - '@types/retry@0.12.2': {} - - '@types/sarif@2.1.7': {} - - '@types/scheduler@0.16.8': {} - - '@types/scheduler@0.26.0': {} - - '@types/selenium-webdriver@4.1.28': - dependencies: - '@types/node': 22.15.32 - '@types/ws': 8.18.1 - - '@types/semver@7.7.0': {} - - '@types/send@0.17.5': - dependencies: - '@types/mime': 1.3.5 - '@types/node': 22.15.32 - - '@types/serve-index@1.9.4': - dependencies: - '@types/express': 4.17.23 - - '@types/serve-static@1.15.8': - dependencies: - '@types/http-errors': 2.0.5 - '@types/node': 22.15.32 - '@types/send': 0.17.5 - - '@types/sockjs@0.3.36': - dependencies: - '@types/node': 22.15.32 - - '@types/source-list-map@0.1.6': {} - - '@types/stack-utils@1.0.1': {} - - '@types/stack-utils@2.0.3': {} - - '@types/swagger-ui-react@5.18.0': - dependencies: - '@types/react': 18.2.0 - - '@types/tapable@1.0.12': {} - - '@types/tcp-port-used@1.0.4': {} - - '@types/tern@0.23.9': - dependencies: - '@types/estree': 1.0.8 - - '@types/tmp@0.2.6': {} - - '@types/tough-cookie@4.0.5': {} - - '@types/triple-beam@1.3.5': {} - - '@types/trusted-types@2.0.7': - optional: true - - '@types/uglify-js@3.17.5': - dependencies: - source-map: 0.6.1 - - '@types/unist@2.0.11': {} - - '@types/unist@3.0.3': {} - - '@types/unzipper@0.10.11': - dependencies: - '@types/node': 22.15.32 - - '@types/use-sync-external-store@0.0.3': {} - - '@types/use-sync-external-store@0.0.6': {} - - '@types/uuid@10.0.0': {} - - '@types/uuid@9.0.8': {} - - '@types/vscode-notebook-renderer@1.72.3': {} - - '@types/vscode-webview@1.57.5': {} - - '@types/vscode@1.101.0': {} - - '@types/webpack-env@1.18.8': {} - - '@types/webpack-sources@3.2.3': - dependencies: - '@types/node': 22.15.32 - '@types/source-list-map': 0.1.6 - source-map: 0.7.4 - - '@types/webpack@4.41.40': - dependencies: - '@types/node': 22.15.32 - '@types/tapable': 1.0.12 - '@types/uglify-js': 3.17.5 - '@types/webpack-sources': 3.2.3 - anymatch: 3.1.3 - source-map: 0.6.1 - - '@types/webpack@5.28.5': - dependencies: - '@types/node': 22.15.32 - tapable: 2.2.2 - webpack: 5.100.2(webpack-cli@4.10.0) - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack-cli - optional: true - - '@types/webpack@5.28.5(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)': - dependencies: - '@types/node': 22.15.32 - tapable: 2.2.2 - webpack: 5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6) - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack-cli - optional: true - - '@types/webpack@5.28.5(esbuild@0.25.5)(webpack-cli@6.0.1)': - dependencies: - '@types/node': 22.15.32 - tapable: 2.2.2 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack-cli - - '@types/webpack@5.28.5(webpack-cli@4.10.0)': - dependencies: - '@types/node': 22.15.32 - tapable: 2.2.2 - webpack: 5.100.2(webpack-cli@4.10.0) - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack-cli - - '@types/webpack@5.28.5(webpack-cli@5.1.4)': - dependencies: - '@types/node': 22.15.32 - tapable: 2.2.2 - webpack: 5.100.2(webpack-cli@5.1.4) - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack-cli - optional: true - - '@types/webpack@5.28.5(webpack-cli@6.0.1)': - dependencies: - '@types/node': 22.15.32 - tapable: 2.2.2 - webpack: 5.100.2(webpack-cli@6.0.1) - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack-cli - - '@types/which@3.0.4': {} - - '@types/ws@8.18.1': - dependencies: - '@types/node': 22.15.32 - - '@types/xml2js@0.4.14': - dependencies: - '@types/node': 22.15.32 - - '@types/yargs-parser@21.0.3': {} - - '@types/yargs@15.0.19': - dependencies: - '@types/yargs-parser': 21.0.3 - - '@types/yargs@17.0.33': - dependencies: - '@types/yargs-parser': 21.0.3 - - '@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@6.8.0)(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 - functional-red-black-tree: 1.0.1 - regexpp: 3.2.0 - tsutils: 3.21.0(typescript@3.9.10) - optionalDependencies: - typescript: 3.9.10 - 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.1 - '@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.1(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.2 - 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.1 - '@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.1(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.2 - 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.1 - '@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@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 2.34.0(eslint@6.8.0)(typescript@3.9.10) - '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/type-utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.32.1 - eslint: 9.27.0(jiti@2.4.2) - 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.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/type-utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.32.1 - eslint: 9.27.0(jiti@2.4.2) - 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.4.2))(typescript@5.8.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.33.1(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/type-utils': 8.32.1(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.32.1 - eslint: 9.26.0(jiti@2.4.2) - 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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/type-utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.32.1 - eslint: 9.27.0(jiti@2.4.2) - 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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.33.1 - '@typescript-eslint/type-utils': 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.33.1 - eslint: 9.27.0(jiti@2.4.2) - 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/experimental-utils@2.34.0(eslint@6.8.0)(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-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)': - 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/typescript-estree': 2.34.0(typescript@3.9.10) - eslint: 6.8.0 - eslint-visitor-keys: 1.3.0 - optionalDependencies: - typescript: 3.9.10 - 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.1(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.1(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.4.2))(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.1(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.4.2) - 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.1(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.4.2))(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.1(supports-color@8.1.1) - eslint: 9.26.0(jiti@2.4.2) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.4.2))(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.1(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.4.2) - 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.1(supports-color@8.1.1) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@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@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.1(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.1(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.4.2))(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.4.2))(typescript@5.8.3) - debug: 4.4.1(supports-color@8.1.1) - eslint: 9.26.0(jiti@2.4.2) - 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.4.2))(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.4.2))(typescript@5.8.3) - debug: 4.4.1(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.4.2) - 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.4.2))(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.4.2))(typescript@5.8.3) - debug: 4.4.1(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.4.2) - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@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.1(supports-color@8.1.1) - eslint-visitor-keys: 1.3.0 - glob: 7.2.3 - is-glob: 4.0.3 - lodash: 4.17.21 - semver: 7.7.2 - tsutils: 3.21.0(typescript@3.9.10) - optionalDependencies: - typescript: 3.9.10 - 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.1(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.7.2 - 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.1(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.2 - 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 - '@typescript-eslint/visitor-keys': 8.32.1 - debug: 4.4.1(supports-color@8.1.1) - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.2 - 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.1(supports-color@8.1.1) - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.2 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) - '@types/json-schema': 7.0.15 - '@types/semver': 7.7.0 - '@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.2 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.7.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.4.2))(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@2.4.2)) - '@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.4.2) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.4.2)) - '@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.4.2) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.33.1(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.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: 8.57.1 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.4.2)) - '@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.4.2) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@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.2.3': - dependencies: - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - '@uiw/codemirror-extensions-basic-setup@4.23.13(@codemirror/autocomplete@6.18.6)(@codemirror/commands@6.8.1)(@codemirror/language@6.11.1)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/view@6.37.2)': - dependencies: - '@codemirror/autocomplete': 6.18.6 - '@codemirror/commands': 6.8.1 - '@codemirror/language': 6.11.1 - '@codemirror/lint': 6.8.5 - '@codemirror/search': 6.5.11 - '@codemirror/state': 6.5.2 - '@codemirror/view': 6.37.2 - - '@uiw/react-codemirror@4.23.13(@babel/runtime@7.27.6)(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.11.1)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.37.2)(codemirror@5.65.19)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': - dependencies: - '@babel/runtime': 7.27.6 - '@codemirror/commands': 6.8.1 - '@codemirror/state': 6.5.2 - '@codemirror/theme-one-dark': 6.1.3 - '@codemirror/view': 6.37.2 - '@uiw/codemirror-extensions-basic-setup': 4.23.13(@codemirror/autocomplete@6.18.6)(@codemirror/commands@6.8.1)(@codemirror/language@6.11.1)(@codemirror/lint@6.8.5)(@codemirror/search@6.5.11)(@codemirror/state@6.5.2)(@codemirror/view@6.37.2) - codemirror: 5.65.19 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@codemirror/autocomplete' - - '@codemirror/language' - - '@codemirror/lint' - - '@codemirror/search' - - '@ungap/structured-clone@1.3.0': {} - - '@vitejs/plugin-react@4.5.2(vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0))': - dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.4) - '@rolldown/pluginutils': 1.0.0-beta.11 - '@types/babel__core': 7.20.5 - react-refresh: 0.17.0 - vite: 6.3.5(@types/node@24.0.14)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0) - transitivePeerDependencies: - - supports-color - - '@vitest/expect@2.0.5': - dependencies: - '@vitest/spy': 2.0.5 - '@vitest/utils': 2.0.5 - chai: 5.2.0 - tinyrainbow: 1.2.0 - - '@vitest/expect@3.0.9': - dependencies: - '@vitest/spy': 3.0.9 - '@vitest/utils': 3.0.9 - chai: 5.2.0 - tinyrainbow: 2.0.0 - - '@vitest/expect@3.2.4': - dependencies: - '@types/chai': 5.2.2 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.1 - tinyrainbow: 2.0.0 - - '@vitest/pretty-format@2.0.5': - dependencies: - tinyrainbow: 1.2.0 - - '@vitest/pretty-format@2.1.9': - dependencies: - tinyrainbow: 1.2.0 - - '@vitest/pretty-format@3.0.9': - dependencies: - tinyrainbow: 2.0.0 - - '@vitest/pretty-format@3.2.4': - dependencies: - tinyrainbow: 2.0.0 - - '@vitest/spy@2.0.5': - dependencies: - tinyspy: 3.0.2 - - '@vitest/spy@3.0.9': - dependencies: - tinyspy: 3.0.2 - - '@vitest/spy@3.2.4': - dependencies: - tinyspy: 4.0.3 - - '@vitest/utils@2.0.5': - dependencies: - '@vitest/pretty-format': 2.0.5 - estree-walker: 3.0.3 - loupe: 3.1.4 - tinyrainbow: 1.2.0 - - '@vitest/utils@2.1.9': - dependencies: - '@vitest/pretty-format': 2.1.9 - loupe: 3.1.4 - tinyrainbow: 1.2.0 - - '@vitest/utils@3.0.9': - dependencies: - '@vitest/pretty-format': 3.0.9 - loupe: 3.1.4 - tinyrainbow: 2.0.0 - - '@vitest/utils@3.2.4': - dependencies: - '@vitest/pretty-format': 3.2.4 - loupe: 3.1.4 - tinyrainbow: 2.0.0 - - '@vscode-logging/logger@2.0.0': - dependencies: - '@vscode-logging/types': 2.0.0 - fast-safe-stringify: 2.1.1 - fs-extra: 11.2.0 - lodash: 4.17.21 - stacktrace-js: 2.0.2 - streamroller: 3.1.5 - triple-beam: 1.4.1 - winston: 3.11.0 - winston-transport: 4.6.0 - transitivePeerDependencies: - - supports-color - - '@vscode-logging/types@2.0.0': {} - - '@vscode-logging/wrapper@2.0.0': - dependencies: - '@vscode-logging/logger': 2.0.0 - '@vscode-logging/types': 2.0.0 - transitivePeerDependencies: - - supports-color - - '@vscode/codicons@0.0.33': {} - - '@vscode/codicons@0.0.36': {} - - '@vscode/extension-telemetry@1.0.0(tslib@2.8.1)': - dependencies: - '@microsoft/1ds-core-js': 4.3.8(tslib@2.8.1) - '@microsoft/1ds-post-js': 4.3.8(tslib@2.8.1) - '@microsoft/applicationinsights-web-basic': 3.3.8(tslib@2.8.1) - transitivePeerDependencies: - - tslib - - '@vscode/iconv-lite-umd@0.7.0': {} - - '@vscode/test-electron@2.5.2': - dependencies: - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - jszip: 3.10.1 - ora: 8.2.0 - semver: 7.7.2 - transitivePeerDependencies: - - supports-color - - '@vscode/vsce-sign-alpine-arm64@2.0.5': - optional: true - - '@vscode/vsce-sign-alpine-x64@2.0.5': - optional: true - - '@vscode/vsce-sign-darwin-arm64@2.0.5': - optional: true - - '@vscode/vsce-sign-darwin-x64@2.0.5': - optional: true - - '@vscode/vsce-sign-linux-arm64@2.0.5': - optional: true - - '@vscode/vsce-sign-linux-arm@2.0.5': - optional: true - - '@vscode/vsce-sign-linux-x64@2.0.5': - optional: true - - '@vscode/vsce-sign-win32-arm64@2.0.5': - optional: true - - '@vscode/vsce-sign-win32-x64@2.0.5': - optional: true - - '@vscode/vsce-sign@2.0.6': - optionalDependencies: - '@vscode/vsce-sign-alpine-arm64': 2.0.5 - '@vscode/vsce-sign-alpine-x64': 2.0.5 - '@vscode/vsce-sign-darwin-arm64': 2.0.5 - '@vscode/vsce-sign-darwin-x64': 2.0.5 - '@vscode/vsce-sign-linux-arm': 2.0.5 - '@vscode/vsce-sign-linux-arm64': 2.0.5 - '@vscode/vsce-sign-linux-x64': 2.0.5 - '@vscode/vsce-sign-win32-arm64': 2.0.5 - '@vscode/vsce-sign-win32-x64': 2.0.5 - - '@vscode/vsce@2.32.0': - dependencies: - '@azure/identity': 4.10.1 - '@vscode/vsce-sign': 2.0.6 - azure-devops-node-api: 12.5.0 - chalk: 2.4.2 - cheerio: 1.1.0 - cockatiel: 3.2.1 - commander: 6.2.1 - form-data: 4.0.4 - glob: 7.2.3 - hosted-git-info: 4.1.0 - jsonc-parser: 3.3.1 - leven: 3.1.0 - markdown-it: 12.3.2 - mime: 1.6.0 - minimatch: 3.1.2 - parse-semver: 1.1.1 - read: 1.0.7 - semver: 7.7.2 - tmp: 0.2.3 - typed-rest-client: 1.8.11 - url-join: 4.0.1 - xml2js: 0.5.0 - yauzl: 2.10.0 - yazl: 2.5.1 - optionalDependencies: - keytar: 7.9.0 - transitivePeerDependencies: - - supports-color - - '@vscode/vsce@3.4.2': - dependencies: - '@azure/identity': 4.10.1 - '@secretlint/node': 9.3.4 - '@secretlint/secretlint-formatter-sarif': 9.3.4 - '@secretlint/secretlint-rule-no-dotenv': 9.3.4 - '@secretlint/secretlint-rule-preset-recommend': 9.3.4 - '@vscode/vsce-sign': 2.0.6 - azure-devops-node-api: 12.5.0 - chalk: 2.4.2 - cheerio: 1.1.0 - cockatiel: 3.2.1 - commander: 12.1.0 - form-data: 4.0.4 - glob: 11.0.3 - hosted-git-info: 4.1.0 - jsonc-parser: 3.3.1 - leven: 3.1.0 - markdown-it: 14.1.0 - mime: 1.6.0 - minimatch: 3.1.2 - parse-semver: 1.1.1 - read: 1.0.7 - secretlint: 9.3.4 - semver: 7.7.2 - tmp: 0.2.3 - typed-rest-client: 1.8.11 - url-join: 4.0.1 - xml2js: 0.5.0 - yauzl: 2.10.0 - yazl: 2.5.1 - optionalDependencies: - keytar: 7.9.0 - transitivePeerDependencies: - - supports-color - - '@vscode/webview-ui-toolkit@1.4.0(react@18.2.0)': - dependencies: - '@microsoft/fast-element': 1.14.0 - '@microsoft/fast-foundation': 2.50.0 - '@microsoft/fast-react-wrapper': 0.3.25(react@18.2.0) - react: 18.2.0 - tslib: 2.8.1 - - '@vscode/webview-ui-toolkit@1.4.0(react@19.1.0)': - dependencies: - '@microsoft/fast-element': 1.14.0 - '@microsoft/fast-foundation': 2.50.0 - '@microsoft/fast-react-wrapper': 0.3.25(react@19.1.0) - react: 19.1.0 - tslib: 2.8.1 - - '@webassemblyjs/ast@1.14.1': - dependencies: - '@webassemblyjs/helper-numbers': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - - '@webassemblyjs/floating-point-hex-parser@1.13.2': {} - - '@webassemblyjs/helper-api-error@1.13.2': {} - - '@webassemblyjs/helper-buffer@1.14.1': {} - - '@webassemblyjs/helper-numbers@1.13.2': - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.13.2 - '@webassemblyjs/helper-api-error': 1.13.2 - '@xtuc/long': 4.2.2 - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} - - '@webassemblyjs/helper-wasm-section@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/wasm-gen': 1.14.1 - - '@webassemblyjs/ieee754@1.13.2': - dependencies: - '@xtuc/ieee754': 1.2.0 - - '@webassemblyjs/leb128@1.13.2': - dependencies: - '@xtuc/long': 4.2.2 - - '@webassemblyjs/utf8@1.13.2': {} - - '@webassemblyjs/wasm-edit@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/helper-wasm-section': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-opt': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wast-printer': 1.14.1 - - '@webassemblyjs/wasm-gen@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wasm-opt@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - - '@webassemblyjs/wasm-parser@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-api-error': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wast-printer@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@xtuc/long': 4.2.2 - - '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.100.2)': - dependencies: - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.100.2) - - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.100.2)': - dependencies: - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.100.2) - - '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.100.2)': - dependencies: - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2) - - '@webpack-cli/info@1.5.0(webpack-cli@4.10.0)': - dependencies: - envinfo: 7.14.0 - webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.100.2) - - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.100.2)': - dependencies: - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.100.2) - - '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.100.2)': - dependencies: - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2) - - '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)': - dependencies: - webpack-cli: 4.10.0(webpack@5.100.2) - - '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)(webpack-dev-server@5.2.2)': - dependencies: - webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.100.2) - optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@4.10.0)(webpack@5.100.2) - - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack@5.100.2)': - dependencies: - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.100.2) - optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.100.2) - - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.100.2)': - dependencies: - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.100.2) - - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.100.2)': - dependencies: - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2) - optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) - - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack@5.100.2)': - dependencies: - webpack: 5.100.2(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.100.2) - - '@xmldom/xmldom@0.7.13': {} - - '@xmldom/xmldom@0.8.10': {} - - '@xtuc/ieee754@1.2.0': {} - - '@xtuc/long@4.2.2': {} - - '@yarnpkg/esbuild-plugin-pnp@3.0.0-rc.15(esbuild@0.25.6)': - dependencies: - esbuild: 0.25.6 - tslib: 2.8.1 - - '@yarnpkg/fslib@2.10.3': - dependencies: - '@yarnpkg/libzip': 2.3.0 - tslib: 1.14.1 - - '@yarnpkg/libzip@2.3.0': - dependencies: - '@types/emscripten': 1.40.1 - tslib: 1.14.1 - - abab@1.0.4: {} - - abab@2.0.6: {} - - abbrev@1.0.9: {} - - abbrev@1.1.1: {} - - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - - accepts@2.0.0: - dependencies: - mime-types: 3.0.1 - negotiator: 1.0.0 - - acorn-globals@3.1.0: - dependencies: - acorn: 4.0.13 - - acorn-globals@4.3.4: - dependencies: - acorn: 6.4.2 - acorn-walk: 6.2.0 - - acorn-globals@7.0.1: - dependencies: - acorn: 8.15.0 - acorn-walk: 8.3.4 - - acorn-import-phases@1.0.4(acorn@8.15.0): - dependencies: - acorn: 8.15.0 - - acorn-jsx@5.3.2(acorn@7.4.1): - dependencies: - acorn: 7.4.1 - - acorn-jsx@5.3.2(acorn@8.15.0): - dependencies: - acorn: 8.15.0 - - acorn-walk@6.2.0: {} - - acorn-walk@7.2.0: {} - - acorn-walk@8.3.4: - dependencies: - acorn: 8.15.0 - - acorn@4.0.13: {} - - acorn@5.7.4: {} - - acorn@6.4.2: {} - - acorn@7.4.1: {} - - acorn@8.15.0: {} - - address@1.0.3: {} - - address@1.2.2: {} - - adm-zip@0.5.16: {} - - agent-base@5.1.1: {} - - agent-base@6.0.2: - dependencies: - debug: 4.4.1(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - agent-base@7.1.3: {} - - agentkeepalive@4.6.0: - dependencies: - humanize-ms: 1.2.1 - - aggregate-error@3.1.0: - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - - aggregate-error@4.0.1: - dependencies: - clean-stack: 4.2.0 - indent-string: 5.0.0 - - airbnb-js-shims@2.2.1: - dependencies: - array-includes: 3.1.9 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - es5-shim: 4.6.7 - es6-shim: 0.35.8 - function.prototype.name: 1.1.8 - globalthis: 1.0.4 - object.entries: 1.1.9 - object.fromentries: 2.0.8 - object.getownpropertydescriptors: 2.1.8 - object.values: 1.2.1 - promise.allsettled: 1.0.7 - promise.prototype.finally: 3.1.8 - string.prototype.matchall: 4.0.12 - string.prototype.padend: 3.1.6 - string.prototype.padstart: 3.1.7 - symbol.prototype.description: 1.0.7 - - ajv-formats@2.1.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 - - ajv-formats@3.0.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 - - ajv-keywords@3.5.2(ajv@6.12.6): - dependencies: - ajv: 6.12.6 - - ajv-keywords@5.1.0(ajv@8.17.1): - dependencies: - ajv: 8.17.1 - fast-deep-equal: 3.1.3 - - ajv@5.5.2: - dependencies: - co: 4.6.0 - fast-deep-equal: 1.1.0 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.3.1 - - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - ajv@8.17.1: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.0.6 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - alphanum-sort@1.0.2: {} - - amdefine@0.1.1: {} - - amdefine@1.0.1: - optional: true - - anser@2.3.2: {} - - ansi-align@2.0.0: - dependencies: - string-width: 2.1.1 - - ansi-align@3.0.1: - dependencies: - string-width: 4.2.3 - - ansi-colors@1.1.0: - dependencies: - ansi-wrap: 0.1.0 - - ansi-colors@3.2.4: {} - - ansi-colors@4.1.3: {} - - ansi-escapes@1.4.0: {} - - ansi-escapes@3.2.0: {} - - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - - ansi-escapes@7.0.0: - dependencies: - environment: 1.1.0 - - ansi-html-community@0.0.8: {} - - ansi-html@0.0.9: {} - - ansi-regex@2.1.1: {} - - ansi-regex@3.0.1: {} - - ansi-regex@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-regex@6.1.0: {} - - ansi-styles@2.2.1: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@5.2.0: {} - - ansi-styles@6.2.1: {} - - ansi-to-html@0.6.15: - dependencies: - entities: 2.2.0 - - ansi-wrap@0.1.0: {} - - any-promise@1.3.0: {} - - anymatch@1.3.2: - dependencies: - micromatch: 4.0.8 - normalize-path: 2.1.1 - - anymatch@2.0.0: - dependencies: - micromatch: 4.0.8 - normalize-path: 2.1.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - apg-lite@1.0.5: {} - - app-root-dir@1.0.2: {} - - append-transform@0.4.0: - dependencies: - default-require-extensions: 1.0.0 - - applicationinsights@1.7.4: - dependencies: - cls-hooked: 4.2.2 - continuation-local-storage: 3.2.1 - diagnostic-channel: 0.2.0 - diagnostic-channel-publishers: 0.3.5(diagnostic-channel@0.2.0) - - aproba@1.2.0: {} - - aproba@2.0.0: {} - - are-we-there-yet@1.1.7: - dependencies: - delegates: 1.0.0 - readable-stream: 2.3.8 - - are-we-there-yet@2.0.0: - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - - are-we-there-yet@3.0.1: - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - - arg@5.0.2: {} - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - argparse@2.0.1: {} - - aria-hidden@1.2.6: - dependencies: - tslib: 2.8.1 - - aria-query@5.3.0: - dependencies: - dequal: 2.0.3 - - aria-query@5.3.2: {} - - arr-diff@4.0.0: {} - - arr-union@3.1.0: {} - - array-buffer-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - is-array-buffer: 3.0.5 - - array-equal@1.0.2: {} - - array-filter@0.0.1: {} - - array-find-index@1.0.2: {} - - array-flatten@1.1.1: {} - - array-includes@3.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - math-intrinsics: 1.1.0 - - array-map@0.0.1: {} - - array-reduce@0.0.0: {} - - array-union@1.0.2: - dependencies: - array-uniq: 1.0.3 - - array-union@2.1.0: {} - - array-uniq@1.0.3: {} - - array.prototype.findlast@1.2.5: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 - - array.prototype.findlastindex@1.2.6: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 - - array.prototype.flat@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - 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-shim-unscopables: 1.1.0 - - array.prototype.map@1.0.8: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-array-method-boxes-properly: 1.0.0 - es-object-atoms: 1.1.1 - is-string: 1.1.1 - - array.prototype.reduce@1.0.8: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-array-method-boxes-properly: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - is-string: 1.1.1 - - array.prototype.tosorted@1.1.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-shim-unscopables: 1.1.0 - - arraybuffer.prototype.slice@1.0.4: - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.5 - - arrify@1.0.1: {} - - arrify@2.0.1: {} - - asap@2.0.6: {} - - asn1@0.2.6: - dependencies: - safer-buffer: 2.1.2 - - assert-plus@1.0.0: {} - - assertion-error@1.1.0: {} - - assertion-error@2.0.1: {} - - assign-symbols@1.0.0: {} - - ast-types-flow@0.0.8: {} - - ast-types@0.14.2: - dependencies: - tslib: 2.8.1 - - ast-types@0.16.1: - dependencies: - tslib: 2.8.1 - - astral-regex@1.0.0: {} - - astral-regex@2.0.0: {} - - async-each@1.0.6: {} - - async-foreach@0.1.3: {} - - async-function@1.0.0: {} - - async-hook-jl@1.7.6: - dependencies: - stack-chain: 1.3.7 - - async-limiter@1.0.1: {} - - async-listener@0.6.10: - dependencies: - semver: 5.7.2 - shimmer: 1.2.1 - - async@1.5.2: {} - - async@2.6.4: - dependencies: - lodash: 4.17.21 - - async@3.2.6: {} - - asynckit@0.4.0: {} - - asyncro@3.0.0: {} - - at-least-node@1.0.0: {} - - atob@2.1.2: {} - - autolinker@3.16.2: - dependencies: - tslib: 2.8.1 - - autoprefixer@10.4.21(postcss@8.5.6): - dependencies: - browserslist: 4.25.0 - caniuse-lite: 1.0.30001724 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.1.1 - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - - autoprefixer@6.7.7: - dependencies: - browserslist: 1.7.7 - caniuse-db: 1.0.30001724 - normalize-range: 0.1.2 - num2fraction: 1.2.2 - postcss: 5.2.18 - postcss-value-parser: 3.3.1 - - autoprefixer@7.1.6: - dependencies: - browserslist: 2.11.3 - caniuse-lite: 1.0.30001724 - normalize-range: 0.1.2 - num2fraction: 1.2.2 - postcss: 6.0.23 - postcss-value-parser: 3.3.1 - - autoprefixer@9.8.8: - dependencies: - browserslist: 4.25.1 - caniuse-lite: 1.0.30001727 - normalize-range: 0.1.2 - num2fraction: 1.2.2 - picocolors: 0.2.1 - postcss: 7.0.39 - postcss-value-parser: 4.2.0 - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.1.0 - - await-notify@1.0.1: {} - - aws-sign2@0.7.0: {} - - aws4@1.13.2: {} - - axe-core@4.10.3: {} - - axios@1.9.0: - dependencies: - follow-redirects: 1.15.9 - form-data: 4.0.4 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - axobject-query@4.1.0: {} - - azure-devops-node-api@12.5.0: - dependencies: - tunnel: 0.0.6 - typed-rest-client: 1.8.11 - - babel-code-frame@6.26.0: - dependencies: - chalk: 1.1.3 - esutils: 2.0.3 - js-tokens: 3.0.2 - - babel-core@6.26.3: - dependencies: - babel-code-frame: 6.26.0 - babel-generator: 6.26.1 - babel-helpers: 6.24.1 - babel-messages: 6.23.0 - babel-register: 6.26.0 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - babylon: 6.18.0 - convert-source-map: 1.9.0 - debug: 2.6.9 - json5: 0.5.1 - lodash: 4.17.21 - minimatch: 3.1.2 - path-is-absolute: 1.0.1 - private: 0.1.8 - slash: 1.0.0 - source-map: 0.5.7 - transitivePeerDependencies: - - supports-color - - babel-core@7.0.0-bridge.0(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 - - babel-core@7.0.0-bridge.0(@babel/core@7.28.0): - dependencies: - '@babel/core': 7.28.0 - - babel-eslint@10.1.0(eslint@6.8.0): - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.27.5 - '@babel/traverse': 7.27.4 - '@babel/types': 7.27.6 - eslint: 6.8.0 - eslint-visitor-keys: 1.3.0 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - - babel-generator@6.26.1: - dependencies: - babel-messages: 6.23.0 - babel-runtime: 6.26.0 - babel-types: 6.26.0 - detect-indent: 4.0.0 - jsesc: 1.3.0 - lodash: 4.17.21 - source-map: 0.5.7 - trim-right: 1.0.1 - - babel-helper-builder-binary-assignment-operator-visitor@6.24.1: - dependencies: - babel-helper-explode-assignable-expression: 6.24.1 - babel-runtime: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-helper-builder-react-jsx@6.26.0: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - esutils: 2.0.3 - - babel-helper-call-delegate@6.24.1: - dependencies: - babel-helper-hoist-variables: 6.24.1 - babel-runtime: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-helper-define-map@6.26.0: - dependencies: - babel-helper-function-name: 6.24.1 - babel-runtime: 6.26.0 - babel-types: 6.26.0 - lodash: 4.17.21 - transitivePeerDependencies: - - supports-color - - babel-helper-explode-assignable-expression@6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-helper-function-name@6.24.1: - dependencies: - babel-helper-get-function-arity: 6.24.1 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-helper-get-function-arity@6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - - babel-helper-hoist-variables@6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - - babel-helper-optimise-call-expression@6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - - babel-helper-regex@6.26.0: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - lodash: 4.17.21 - - babel-helper-remap-async-to-generator@6.24.1: - dependencies: - babel-helper-function-name: 6.24.1 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-helper-replace-supers@6.24.1: - dependencies: - babel-helper-optimise-call-expression: 6.24.1 - babel-messages: 6.23.0 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-helpers@6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-template: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-jest@20.0.3: - dependencies: - babel-core: 6.26.3 - babel-plugin-istanbul: 4.1.6 - babel-preset-jest: 20.0.3 - transitivePeerDependencies: - - supports-color - - babel-jest@25.5.1(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 - '@jest/transform': 25.5.1 - '@jest/types': 25.5.0 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 25.5.0(@babel/core@7.27.4) - chalk: 3.0.0 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - - babel-jest@29.7.0(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.27.4) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - - babel-loader@10.0.0(@babel/core@7.27.4)(webpack@5.100.2): - dependencies: - '@babel/core': 7.27.4 - find-up: 5.0.0 - webpack: 5.100.2(webpack-cli@4.10.0) - - babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.4))(webpack@5.100.2): - dependencies: - babel-core: 7.0.0-bridge.0(@babel/core@7.27.4) - find-cache-dir: 1.0.0 - loader-utils: 1.4.2 - mkdirp: 0.5.6 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - - babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.28.0))(webpack@5.100.2): - dependencies: - babel-core: 7.0.0-bridge.0(@babel/core@7.28.0) - find-cache-dir: 1.0.0 - loader-utils: 1.4.2 - mkdirp: 0.5.6 - webpack: 5.100.2(webpack-cli@4.10.0) - - babel-loader@8.4.1(@babel/core@7.27.4)(webpack@5.100.2): - dependencies: - '@babel/core': 7.27.4 - find-cache-dir: 3.3.2 - loader-utils: 2.0.4 - make-dir: 3.1.0 - schema-utils: 2.7.1 - webpack: 5.100.2(webpack-cli@4.10.0) - - babel-loader@9.2.1(@babel/core@7.27.4)(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)): - dependencies: - '@babel/core': 7.27.4 - find-cache-dir: 4.0.0 - schema-utils: 4.3.2 - webpack: 5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6) - - babel-messages@6.23.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-add-react-displayname@0.0.5: {} - - babel-plugin-annotate-pure-calls@0.4.0(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 - - babel-plugin-apply-mdx-type-prop@1.6.22(@babel/core@7.12.9): - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.10.4 - '@mdx-js/util': 1.6.22 - - babel-plugin-check-es2015-constants@6.22.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-dev-expression@0.2.3(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 - - babel-plugin-dynamic-import-node@1.1.0: - dependencies: - babel-plugin-syntax-dynamic-import: 6.18.0 - babel-template: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-extract-import-names@1.6.22: - dependencies: - '@babel/helper-plugin-utils': 7.10.4 - - babel-plugin-istanbul@4.1.6: - dependencies: - babel-plugin-syntax-object-rest-spread: 6.13.0 - find-up: 2.1.0 - istanbul-lib-instrument: 1.10.2 - test-exclude: 4.2.3 - transitivePeerDependencies: - - supports-color - - babel-plugin-istanbul@6.1.1: - dependencies: - '@babel/helper-plugin-utils': 7.27.1 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-jest-hoist@20.0.3: {} - - babel-plugin-jest-hoist@22.4.4: {} - - babel-plugin-jest-hoist@25.5.0: - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.1 - '@types/babel__traverse': 7.20.7 - - babel-plugin-jest-hoist@29.6.3: - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.1 - '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.7 - - babel-plugin-macros@2.8.0: - dependencies: - '@babel/runtime': 7.27.6 - cosmiconfig: 6.0.0 - resolve: 1.22.10 - - babel-plugin-macros@3.1.0: - dependencies: - '@babel/runtime': 7.27.6 - cosmiconfig: 7.1.0 - resolve: 1.22.10 - - babel-plugin-named-exports-order@0.0.2: {} - - babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.27.4): - dependencies: - '@babel/compat-data': 7.27.5 - '@babel/core': 7.27.4 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-corejs2@0.4.13(@babel/core@7.28.0): - dependencies: - '@babel/compat-data': 7.27.5 - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.28.0) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - optional: true - - babel-plugin-polyfill-corejs3@0.1.7(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-define-polyfill-provider': 0.1.5(@babel/core@7.27.4) - core-js-compat: 3.43.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) - core-js-compat: 3.43.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.28.0): - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.28.0) - core-js-compat: 3.43.0 - transitivePeerDependencies: - - supports-color - optional: true - - babel-plugin-polyfill-regenerator@0.0.4(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-define-polyfill-provider': 0.0.3(@babel/core@7.27.4) - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.27.4) - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-regenerator@0.6.4(@babel/core@7.28.0): - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.4(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - optional: true - - babel-plugin-react-docgen@4.2.1: - dependencies: - ast-types: 0.14.2 - lodash: 4.17.21 - react-docgen: 5.4.3 - transitivePeerDependencies: - - supports-color - - babel-plugin-syntax-async-functions@6.13.0: {} - - babel-plugin-syntax-class-properties@6.13.0: {} - - babel-plugin-syntax-dynamic-import@6.18.0: {} - - babel-plugin-syntax-exponentiation-operator@6.13.0: {} - - babel-plugin-syntax-flow@6.18.0: {} - - babel-plugin-syntax-jsx@6.18.0: {} - - babel-plugin-syntax-object-rest-spread@6.13.0: {} - - babel-plugin-syntax-trailing-function-commas@6.22.0: {} - - babel-plugin-transform-async-to-generator@6.24.1: - dependencies: - babel-helper-remap-async-to-generator: 6.24.1 - babel-plugin-syntax-async-functions: 6.13.0 - babel-runtime: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-class-properties@6.24.1: - dependencies: - babel-helper-function-name: 6.24.1 - babel-plugin-syntax-class-properties: 6.13.0 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-arrow-functions@6.22.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-transform-es2015-block-scoped-functions@6.22.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-transform-es2015-block-scoping@6.26.0: - dependencies: - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - lodash: 4.17.21 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-classes@6.24.1: - dependencies: - babel-helper-define-map: 6.26.0 - babel-helper-function-name: 6.24.1 - babel-helper-optimise-call-expression: 6.24.1 - babel-helper-replace-supers: 6.24.1 - babel-messages: 6.23.0 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-computed-properties@6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-template: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-destructuring@6.23.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-transform-es2015-duplicate-keys@6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - - babel-plugin-transform-es2015-for-of@6.23.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-transform-es2015-function-name@6.24.1: - dependencies: - babel-helper-function-name: 6.24.1 - babel-runtime: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-literals@6.22.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-transform-es2015-modules-amd@6.24.1: - dependencies: - babel-plugin-transform-es2015-modules-commonjs: 6.26.2 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-modules-commonjs@6.26.2: - dependencies: - babel-plugin-transform-strict-mode: 6.24.1 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-modules-systemjs@6.24.1: - dependencies: - babel-helper-hoist-variables: 6.24.1 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-modules-umd@6.24.1: - dependencies: - babel-plugin-transform-es2015-modules-amd: 6.24.1 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-object-super@6.24.1: - dependencies: - babel-helper-replace-supers: 6.24.1 - babel-runtime: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-parameters@6.24.1: - dependencies: - babel-helper-call-delegate: 6.24.1 - babel-helper-get-function-arity: 6.24.1 - babel-runtime: 6.26.0 - babel-template: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-es2015-shorthand-properties@6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - - babel-plugin-transform-es2015-spread@6.22.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-transform-es2015-sticky-regex@6.24.1: - dependencies: - babel-helper-regex: 6.26.0 - babel-runtime: 6.26.0 - babel-types: 6.26.0 - - babel-plugin-transform-es2015-template-literals@6.22.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-transform-es2015-typeof-symbol@6.23.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-transform-es2015-unicode-regex@6.24.1: - dependencies: - babel-helper-regex: 6.26.0 - babel-runtime: 6.26.0 - regexpu-core: 2.0.0 - - babel-plugin-transform-exponentiation-operator@6.24.1: - dependencies: - babel-helper-builder-binary-assignment-operator-visitor: 6.24.1 - babel-plugin-syntax-exponentiation-operator: 6.13.0 - babel-runtime: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-transform-flow-strip-types@6.22.0: - dependencies: - babel-plugin-syntax-flow: 6.18.0 - babel-runtime: 6.26.0 - - babel-plugin-transform-object-rest-spread@6.26.0: - dependencies: - babel-plugin-syntax-object-rest-spread: 6.13.0 - babel-runtime: 6.26.0 - - babel-plugin-transform-react-constant-elements@6.23.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-transform-react-display-name@6.25.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-transform-react-jsx-self@6.22.0: - dependencies: - babel-plugin-syntax-jsx: 6.18.0 - babel-runtime: 6.26.0 - - babel-plugin-transform-react-jsx-source@6.22.0: - dependencies: - babel-plugin-syntax-jsx: 6.18.0 - babel-runtime: 6.26.0 - - babel-plugin-transform-react-jsx@6.24.1: - dependencies: - babel-helper-builder-react-jsx: 6.26.0 - babel-plugin-syntax-jsx: 6.18.0 - babel-runtime: 6.26.0 - - babel-plugin-transform-regenerator@6.26.0: - dependencies: - regenerator-transform: 0.10.1 - - babel-plugin-transform-rename-import@2.3.0: {} - - babel-plugin-transform-runtime@6.23.0: - dependencies: - babel-runtime: 6.26.0 - - babel-plugin-transform-strict-mode@6.24.1: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - - babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.27.4)(@babel/traverse@7.28.0): - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-plugin-utils': 7.27.1 - optionalDependencies: - '@babel/traverse': 7.28.0 - - babel-preset-current-node-syntax@0.1.4(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.4) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.4) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) - - babel-preset-current-node-syntax@1.1.0(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.27.4) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.4) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.4) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.27.4) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.4) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.4) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.27.4) - - babel-preset-env@1.6.1: - dependencies: - babel-plugin-check-es2015-constants: 6.22.0 - babel-plugin-syntax-trailing-function-commas: 6.22.0 - babel-plugin-transform-async-to-generator: 6.24.1 - babel-plugin-transform-es2015-arrow-functions: 6.22.0 - babel-plugin-transform-es2015-block-scoped-functions: 6.22.0 - babel-plugin-transform-es2015-block-scoping: 6.26.0 - babel-plugin-transform-es2015-classes: 6.24.1 - babel-plugin-transform-es2015-computed-properties: 6.24.1 - babel-plugin-transform-es2015-destructuring: 6.23.0 - babel-plugin-transform-es2015-duplicate-keys: 6.24.1 - babel-plugin-transform-es2015-for-of: 6.23.0 - babel-plugin-transform-es2015-function-name: 6.24.1 - babel-plugin-transform-es2015-literals: 6.22.0 - babel-plugin-transform-es2015-modules-amd: 6.24.1 - babel-plugin-transform-es2015-modules-commonjs: 6.26.2 - babel-plugin-transform-es2015-modules-systemjs: 6.24.1 - babel-plugin-transform-es2015-modules-umd: 6.24.1 - babel-plugin-transform-es2015-object-super: 6.24.1 - babel-plugin-transform-es2015-parameters: 6.24.1 - babel-plugin-transform-es2015-shorthand-properties: 6.24.1 - babel-plugin-transform-es2015-spread: 6.22.0 - babel-plugin-transform-es2015-sticky-regex: 6.24.1 - babel-plugin-transform-es2015-template-literals: 6.22.0 - babel-plugin-transform-es2015-typeof-symbol: 6.23.0 - babel-plugin-transform-es2015-unicode-regex: 6.24.1 - babel-plugin-transform-exponentiation-operator: 6.24.1 - babel-plugin-transform-regenerator: 6.26.0 - browserslist: 2.11.3 - invariant: 2.2.4 - semver: 5.7.2 - transitivePeerDependencies: - - supports-color - - babel-preset-flow@6.23.0: - dependencies: - babel-plugin-transform-flow-strip-types: 6.22.0 - - babel-preset-jest@20.0.3: - dependencies: - babel-plugin-jest-hoist: 20.0.3 - - babel-preset-jest@22.4.4: - dependencies: - babel-plugin-jest-hoist: 22.4.4 - babel-plugin-syntax-object-rest-spread: 6.13.0 - - babel-preset-jest@25.5.0(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 - babel-plugin-jest-hoist: 25.5.0 - babel-preset-current-node-syntax: 0.1.4(@babel/core@7.27.4) - - babel-preset-jest@29.6.3(@babel/core@7.27.4): - dependencies: - '@babel/core': 7.27.4 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) - - babel-preset-react-app@3.1.2(babel-runtime@6.26.0): - dependencies: - babel-plugin-dynamic-import-node: 1.1.0 - babel-plugin-syntax-dynamic-import: 6.18.0 - babel-plugin-transform-class-properties: 6.24.1 - babel-plugin-transform-es2015-destructuring: 6.23.0 - babel-plugin-transform-object-rest-spread: 6.26.0 - babel-plugin-transform-react-constant-elements: 6.23.0 - babel-plugin-transform-react-jsx: 6.24.1 - babel-plugin-transform-react-jsx-self: 6.22.0 - babel-plugin-transform-react-jsx-source: 6.22.0 - babel-plugin-transform-regenerator: 6.26.0 - babel-plugin-transform-runtime: 6.23.0 - babel-preset-env: 1.6.1 - babel-preset-react: 6.24.1 - babel-runtime: 6.26.0 - transitivePeerDependencies: - - supports-color - - babel-preset-react@6.24.1: - dependencies: - babel-plugin-syntax-jsx: 6.18.0 - babel-plugin-transform-react-display-name: 6.25.0 - babel-plugin-transform-react-jsx: 6.24.1 - babel-plugin-transform-react-jsx-self: 6.22.0 - babel-plugin-transform-react-jsx-source: 6.22.0 - babel-preset-flow: 6.23.0 - - babel-register@6.26.0: - dependencies: - babel-core: 6.26.3 - babel-runtime: 6.26.0 - core-js: 2.6.12 - home-or-tmp: 2.0.0 - lodash: 4.17.21 - mkdirp: 0.5.6 - source-map-support: 0.4.18 - transitivePeerDependencies: - - supports-color - - babel-runtime@6.26.0: - dependencies: - core-js: 2.6.12 - regenerator-runtime: 0.11.1 - - babel-template@6.26.0: - dependencies: - babel-runtime: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - babylon: 6.18.0 - lodash: 4.17.21 - transitivePeerDependencies: - - supports-color - - babel-traverse@6.26.0: - dependencies: - babel-code-frame: 6.26.0 - babel-messages: 6.23.0 - babel-runtime: 6.26.0 - babel-types: 6.26.0 - babylon: 6.18.0 - debug: 2.6.9 - globals: 9.18.0 - invariant: 2.2.4 - lodash: 4.17.21 - transitivePeerDependencies: - - supports-color - - babel-types@6.26.0: - dependencies: - babel-runtime: 6.26.0 - esutils: 2.0.3 - lodash: 4.17.21 - to-fast-properties: 1.0.3 - - babylon@6.18.0: {} - - bail@1.0.5: {} - - bail@2.0.2: {} - - balanced-match@0.4.2: {} - - balanced-match@1.0.2: {} - - balanced-match@2.0.0: {} - - base16@1.0.0: {} - - base64-js@1.5.1: {} - - basic-auth@2.0.1: - dependencies: - safe-buffer: 5.1.2 - - batch@0.6.1: {} - - bcrypt-pbkdf@1.0.2: - dependencies: - tweetnacl: 0.14.5 - - better-opn@2.1.1: - dependencies: - open: 7.4.2 - - better-opn@3.0.2: - dependencies: - open: 8.4.2 - - big-integer@1.6.52: {} - - big.js@3.2.0: {} - - big.js@5.2.2: {} - - binary-extensions@1.13.1: {} - - binary-extensions@2.3.0: {} - - binary@0.3.0: - dependencies: - buffers: 0.1.1 - chainsaw: 0.1.0 - - binaryextensions@6.11.0: - dependencies: - editions: 6.21.0 - - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - - bl@1.2.3: - dependencies: - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - block-stream@0.0.9: - dependencies: - inherits: 2.0.4 - - bluebird@3.4.7: {} - - bluebird@3.7.2: {} - - blueimp-md5@2.19.0: {} - - body-parser@1.20.3: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.13.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - body-parser@2.2.0: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 4.4.1(supports-color@8.1.1) - http-errors: 2.0.0 - iconv-lite: 0.6.3 - on-finished: 2.4.1 - qs: 6.14.0 - raw-body: 3.0.0 - type-is: 2.0.1 - transitivePeerDependencies: - - supports-color - - bonjour-service@1.3.0: - dependencies: - fast-deep-equal: 3.1.3 - multicast-dns: 7.2.5 - - boolbase@1.0.0: {} - - boundary@2.0.0: {} - - bowser@2.11.0: {} - - boxen@1.3.0: - dependencies: - ansi-align: 2.0.0 - camelcase: 4.1.0 - chalk: 2.4.2 - cli-boxes: 1.0.0 - string-width: 2.1.1 - term-size: 1.2.0 - widest-line: 2.0.1 - - boxen@5.1.2: - dependencies: - ansi-align: 3.0.1 - camelcase: 6.3.0 - chalk: 4.1.2 - cli-boxes: 2.2.1 - string-width: 4.2.3 - type-fest: 0.20.2 - widest-line: 3.1.0 - wrap-ansi: 7.0.0 - - bplist-parser@0.1.1: - dependencies: - big-integer: 1.6.52 - optional: true - - bplist-parser@0.2.0: - dependencies: - big-integer: 1.6.52 - - brace-expansion@2.0.2: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browser-assert@1.2.1: {} - - browser-process-hrtime@1.0.0: {} - - browser-resolve@1.11.3: - dependencies: - resolve: 1.1.7 - - browser-stdout@1.3.1: {} - - browserify-zlib@0.1.4: - dependencies: - pako: 0.2.9 - - browserslist@1.7.7: - dependencies: - caniuse-db: 1.0.30001724 - electron-to-chromium: 1.5.185 - - browserslist@2.11.3: - dependencies: - caniuse-lite: 1.0.30001724 - electron-to-chromium: 1.5.171 - - browserslist@4.25.0: - dependencies: - caniuse-lite: 1.0.30001724 - electron-to-chromium: 1.5.171 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.0) - - browserslist@4.25.1: - dependencies: - caniuse-lite: 1.0.30001727 - electron-to-chromium: 1.5.185 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.1) - - bs-logger@0.2.6: - dependencies: - fast-json-stable-stringify: 2.1.0 - - bser@1.0.2: - dependencies: - node-int64: 0.4.0 - - bser@2.1.1: - dependencies: - node-int64: 0.4.0 - - buffer-alloc-unsafe@1.1.0: {} - - buffer-alloc@1.2.0: - dependencies: - buffer-alloc-unsafe: 1.1.0 - buffer-fill: 1.0.0 - - buffer-crc32@0.2.13: {} - - buffer-equal-constant-time@1.0.1: {} - - buffer-fill@1.0.0: {} - - buffer-from@1.1.2: {} - - buffer-indexof-polyfill@1.0.2: {} - - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - buffers@0.1.1: {} - - bufferstreams@1.1.3: - dependencies: - readable-stream: 2.3.8 - - bufferstreams@3.0.0: - dependencies: - readable-stream: 3.6.2 - - builtin-modules@1.1.1: {} - - builtin-modules@3.3.0: {} - - bundle-name@4.1.0: - dependencies: - run-applescript: 7.0.0 - - byline@5.0.0: {} - - bytes-iec@3.1.1: {} - - bytes@3.1.2: {} - - c8@10.1.3: - dependencies: - '@bcoe/v8-coverage': 1.0.2 - '@istanbuljs/schema': 0.1.3 - find-up: 5.0.0 - foreground-child: 3.3.1 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.1.7 - test-exclude: 7.0.1 - v8-to-istanbul: 9.3.0 - yargs: 17.7.2 - yargs-parser: 21.1.1 - - c8@7.14.0: - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@istanbuljs/schema': 0.1.3 - find-up: 5.0.0 - foreground-child: 2.0.0 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-report: 3.0.1 - istanbul-reports: 3.1.7 - rimraf: 3.0.2 - test-exclude: 6.0.0 - v8-to-istanbul: 9.3.0 - yargs: 16.2.0 - yargs-parser: 20.2.9 - - cacache@10.0.4: - dependencies: - bluebird: 3.7.2 - chownr: 1.1.4 - glob: 7.2.3 - graceful-fs: 4.2.11 - lru-cache: 4.1.5 - mississippi: 2.0.0 - mkdirp: 0.5.6 - move-concurrently: 1.0.1 - promise-inflight: 1.0.1(bluebird@3.7.2) - rimraf: 2.7.1 - ssri: 5.3.0 - unique-filename: 1.1.1 - y18n: 4.0.3 - - cacache@15.3.0: - dependencies: - '@npmcli/fs': 1.1.1 - '@npmcli/move-file': 1.1.2 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 7.2.3 - infer-owner: 1.0.4 - lru-cache: 6.0.0 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1(bluebird@3.7.2) - rimraf: 3.0.2 - ssri: 8.0.1 - tar: 6.2.1 - unique-filename: 1.1.1 - transitivePeerDependencies: - - bluebird - - cacache@16.1.3: - dependencies: - '@npmcli/fs': 2.1.2 - '@npmcli/move-file': 2.0.1 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 8.1.0 - infer-owner: 1.0.4 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1(bluebird@3.7.2) - rimraf: 3.0.2 - ssri: 9.0.1 - tar: 6.2.1 - unique-filename: 2.0.1 - transitivePeerDependencies: - - bluebird - - cacheable-lookup@7.0.0: {} - - cacheable-request@10.2.14: - dependencies: - '@types/http-cache-semantics': 4.0.4 - get-stream: 6.0.1 - http-cache-semantics: 4.2.0 - keyv: 4.5.4 - mimic-response: 4.0.0 - normalize-url: 8.0.2 - responselike: 3.0.0 - - cacheable-request@12.0.1: - dependencies: - '@types/http-cache-semantics': 4.0.4 - get-stream: 9.0.1 - http-cache-semantics: 4.2.0 - keyv: 4.5.4 - mimic-response: 4.0.0 - normalize-url: 8.0.2 - responselike: 3.0.0 - - cacheable@1.10.0: - dependencies: - hookified: 1.9.1 - keyv: 5.3.4 - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - call-me-maybe@1.0.2: {} - - callsite@1.0.0: {} - - callsites@2.0.0: {} - - callsites@3.1.0: {} - - camel-case@3.0.0: - dependencies: - no-case: 2.3.2 - upper-case: 1.1.3 - - camel-case@4.1.2: - dependencies: - pascal-case: 3.1.2 - tslib: 2.8.1 - - camelcase-css@2.0.1: {} - - camelcase-keys@2.1.0: - dependencies: - camelcase: 2.1.1 - map-obj: 1.0.1 - - camelcase-keys@6.2.2: - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - - camelcase-keys@7.0.2: - dependencies: - camelcase: 6.3.0 - map-obj: 4.3.0 - quick-lru: 5.1.1 - type-fest: 1.4.0 - - camelcase@2.1.1: {} - - camelcase@3.0.0: {} - - camelcase@4.1.0: {} - - camelcase@5.3.1: {} - - camelcase@6.3.0: {} - - caniuse-api@1.6.1: - dependencies: - browserslist: 1.7.7 - caniuse-db: 1.0.30001724 - lodash.memoize: 4.1.2 - lodash.uniq: 4.5.0 - - caniuse-api@3.0.0: - dependencies: - browserslist: 4.25.1 - caniuse-lite: 1.0.30001727 - lodash.memoize: 4.1.2 - lodash.uniq: 4.5.0 - - caniuse-db@1.0.30001724: {} - - caniuse-lite@1.0.30001724: {} - - caniuse-lite@1.0.30001727: {} - - capture-exit@2.0.0: - dependencies: - rsvp: 4.8.5 - - capture-stack-trace@1.0.2: {} - - case-sensitive-paths-webpack-plugin@2.1.1: {} - - case-sensitive-paths-webpack-plugin@2.4.0: {} - - case@1.6.3: {} - - caseless@0.12.0: {} - - ccount@1.1.0: {} - - ccount@2.0.1: {} - - chai@4.5.0: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - - chai@5.2.0: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.1.4 - pathval: 2.0.0 - - chai@5.2.1: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.1.4 - pathval: 2.0.1 - - chainsaw@0.1.0: - dependencies: - traverse: 0.3.9 - - chalk@1.1.3: - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@3.0.0: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.4.1: {} - - char-regex@1.0.2: {} - - character-entities-html4@2.1.0: {} - - character-entities-legacy@1.1.4: {} - - character-entities-legacy@3.0.0: {} - - character-entities@1.2.4: {} - - character-entities@2.0.2: {} - - character-reference-invalid@1.1.4: {} - - character-reference-invalid@2.0.1: {} - - 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: {} - - cheerio-select@2.1.0: - dependencies: - boolbase: 1.0.0 - css-select: 5.1.0 - css-what: 6.1.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - - cheerio@1.1.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 - parse5: 7.3.0 - parse5-htmlparser2-tree-adapter: 7.1.0 - parse5-parser-stream: 7.1.2 - undici: 7.10.0 - whatwg-mimetype: 4.0.0 - - chokidar@1.7.0: - dependencies: - anymatch: 1.3.2 - async-each: 1.0.6 - glob-parent: 2.0.0 - inherits: 2.0.4 - is-binary-path: 1.0.1 - is-glob: 2.0.1 - path-is-absolute: 1.0.1 - readdirp: 2.2.1 - optionalDependencies: - fsevents: 1.2.13 - - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - chokidar@4.0.3: - dependencies: - readdirp: 4.1.2 - - chownr@1.1.4: {} - - chownr@2.0.0: {} - - chrome-trace-event@1.0.4: {} - - ci-info@1.6.0: {} - - ci-info@2.0.0: {} - - ci-info@3.9.0: {} - - citty@0.1.6: - dependencies: - consola: 3.4.2 - - cjs-module-lexer@1.4.3: {} - - clap@1.2.3: - dependencies: - chalk: 1.1.3 - - classnames@2.5.1: {} - - clean-css@4.2.4: - dependencies: - source-map: 0.6.1 - - clean-css@5.3.3: - dependencies: - source-map: 0.6.1 - - clean-stack@2.2.0: {} - - clean-stack@4.2.0: - dependencies: - escape-string-regexp: 5.0.0 - - cli-boxes@1.0.0: {} - - 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 - - cli-cursor@3.1.0: - dependencies: - restore-cursor: 3.1.0 - - cli-cursor@5.0.0: - dependencies: - restore-cursor: 5.1.0 - - cli-spinners@1.3.1: {} - - cli-spinners@2.9.2: {} - - cli-table3@0.6.5: - dependencies: - string-width: 4.2.3 - optionalDependencies: - '@colors/colors': 1.5.0 - - cli-truncate@4.0.0: - dependencies: - slice-ansi: 5.0.0 - string-width: 7.2.0 - - cli-width@2.2.1: {} - - cli-width@3.0.0: {} - - client-only@0.0.1: {} - - clipboard-copy@4.0.1: {} - - clipboardy@4.0.0: - dependencies: - execa: 8.0.1 - is-wsl: 3.1.0 - is64bit: 2.0.0 - - cliui@3.2.0: - dependencies: - string-width: 1.0.2 - strip-ansi: 3.0.1 - wrap-ansi: 2.1.0 - - cliui@4.1.0: - dependencies: - string-width: 2.1.1 - strip-ansi: 4.0.0 - wrap-ansi: 2.1.0 - - cliui@6.0.0: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - clone-deep@4.0.1: - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - - clone@1.0.4: {} - - closest@0.0.1: - dependencies: - matches-selector: 0.0.1 - - cls-hooked@4.2.2: - dependencies: - async-hook-jl: 1.7.6 - emitter-listener: 1.1.2 - semver: 5.7.2 - - clsx@1.2.1: {} - - clsx@2.1.1: {} - - co@4.6.0: {} - - coa@1.0.4: - dependencies: - q: 1.5.1 - - cockatiel@3.2.1: {} - - code-block-writer@13.0.3: {} - - code-point-at@1.1.0: {} - - codemirror-graphql@2.2.3(@codemirror/language@6.11.1)(codemirror@5.65.19)(graphql@16.11.0): - dependencies: - '@codemirror/language': 6.11.1 - '@types/codemirror': 0.0.90 - codemirror: 5.65.19 - graphql: 16.11.0 - graphql-language-service: 5.4.0(graphql@16.11.0) - - codemirror@5.65.19: {} - - collapse-white-space@1.0.6: {} - - collect-v8-coverage@1.0.2: {} - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.3: {} - - color-name@1.1.4: {} - - color-string@0.3.0: - dependencies: - color-name: 1.1.4 - - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - - color-support@1.1.3: {} - - color@0.11.4: - dependencies: - clone: 1.0.4 - color-convert: 1.9.3 - color-string: 0.3.0 - - color@3.2.1: - dependencies: - color-convert: 1.9.3 - color-string: 1.9.1 - - colord@2.9.3: {} - - colorette@1.4.0: {} - - colorette@2.0.20: {} - - colormin@1.1.2: - dependencies: - color: 0.11.4 - css-color-names: 0.0.4 - has: 1.0.4 - - colors@1.1.2: {} - - colors@1.4.0: {} - - colorspace@1.1.4: - dependencies: - color: 3.2.1 - text-hex: 1.0.0 - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - comma-separated-tokens@1.0.8: {} - - comma-separated-tokens@2.0.3: {} - - commander@10.0.1: {} - - commander@11.1.0: {} - - commander@12.1.0: {} - - commander@13.1.0: {} - - commander@14.0.0: {} - - commander@2.13.0: {} - - commander@2.17.1: {} - - commander@2.19.0: {} - - commander@2.20.3: {} - - commander@4.1.1: {} - - commander@6.2.1: {} - - commander@7.2.0: {} - - commander@8.3.0: {} - - commander@9.5.0: {} - - common-path-prefix@3.0.0: {} - - commondir@1.0.1: {} - - compare-versions@6.1.1: {} - - compressible@2.0.18: - dependencies: - mime-db: 1.54.0 - - compression@1.8.0: - dependencies: - bytes: 3.1.2 - compressible: 2.0.18 - debug: 2.6.9 - negotiator: 0.6.4 - on-headers: 1.1.0 - safe-buffer: 5.2.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - concat-stream@1.6.2: - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - typedarray: 0.0.6 - - concat-with-sourcemaps@1.1.0: - dependencies: - source-map: 0.6.1 - - confbox@0.1.8: {} - - configstore@3.1.5: - dependencies: - dot-prop: 4.2.1 - graceful-fs: 4.2.11 - make-dir: 1.3.0 - unique-string: 1.0.0 - write-file-atomic: 2.4.3 - xdg-basedir: 3.0.0 - - confusing-browser-globals@1.0.11: {} - - connect-history-api-fallback@2.0.0: {} - - consola@3.4.2: {} - - console-control-strings@1.1.0: {} - - constants-browserify@1.0.0: {} - - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - - content-disposition@1.0.0: - dependencies: - safe-buffer: 5.2.1 - - content-type-parser@1.0.2: {} - - content-type@1.0.5: {} - - continuation-local-storage@3.2.1: - dependencies: - async-listener: 0.6.10 - emitter-listener: 1.1.2 - - convert-source-map@1.9.0: {} - - convert-source-map@2.0.0: {} - - cookie-signature@1.0.6: {} - - cookie-signature@1.2.2: {} - - cookie@0.7.1: {} - - cookie@0.7.2: {} - - copy-concurrently@1.0.5: - dependencies: - aproba: 1.2.0 - fs-write-stream-atomic: 1.0.10 - iferr: 0.1.5 - mkdirp: 0.5.6 - rimraf: 2.7.1 - run-queue: 1.0.3 - - copy-to-clipboard@3.3.3: - dependencies: - toggle-selection: 1.0.6 - - copy-webpack-plugin@13.0.0(webpack@5.100.2): - dependencies: - glob-parent: 6.0.2 - normalize-path: 3.0.0 - schema-utils: 4.3.2 - serialize-javascript: 6.0.2 - tinyglobby: 0.2.14 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - - copyfiles@2.4.1: - dependencies: - glob: 7.2.3 - minimatch: 3.1.2 - mkdirp: 1.0.4 - noms: 0.0.0 - through2: 2.0.5 - untildify: 4.0.0 - yargs: 16.2.0 - - core-js-compat@3.43.0: - dependencies: - browserslist: 4.25.0 - - core-js-pure@3.43.0: {} - - core-js@2.6.12: {} - - core-js@3.43.0: {} - - core-util-is@1.0.2: {} - - core-util-is@1.0.3: {} - - cors-anywhere@0.4.4: - dependencies: - http-proxy: 1.18.1 - proxy-from-env: 0.0.1 - transitivePeerDependencies: - - debug - - cors@2.8.5: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - - corser@2.0.1: {} - - cosmiconfig@2.2.2: - dependencies: - is-directory: 0.3.1 - js-yaml: 3.14.1 - minimist: 1.2.8 - object-assign: 4.1.1 - os-homedir: 1.0.2 - parse-json: 2.2.0 - require-from-string: 1.2.1 - - cosmiconfig@6.0.0: - dependencies: - '@types/parse-json': 4.0.2 - import-fresh: 3.3.1 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - - cosmiconfig@7.1.0: - dependencies: - '@types/parse-json': 4.0.2 - import-fresh: 3.3.1 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - - cosmiconfig@8.3.6(typescript@5.8.3): - dependencies: - import-fresh: 3.3.1 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - optionalDependencies: - typescript: 5.8.3 - - cosmiconfig@9.0.0(typescript@5.8.3): - dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - parse-json: 5.2.0 - optionalDependencies: - typescript: 5.8.3 - - cp-file@7.0.0: - dependencies: - graceful-fs: 4.2.11 - make-dir: 3.1.0 - nested-error-stacks: 2.1.1 - p-event: 4.2.0 - - cpx@1.5.0: - dependencies: - babel-runtime: 6.26.0 - chokidar: 1.7.0 - duplexer: 0.1.2 - glob: 7.2.3 - glob2base: 0.0.12 - minimatch: 3.1.2 - mkdirp: 0.5.6 - resolve: 1.6.0 - safe-buffer: 5.2.1 - shell-quote: 1.8.3 - subarg: 1.0.0 - - cpy@8.1.2: - dependencies: - arrify: 2.0.1 - cp-file: 7.0.0 - globby: 9.2.0 - has-glob: 1.0.0 - junk: 3.1.0 - nested-error-stacks: 2.1.1 - p-all: 2.1.0 - p-filter: 2.1.0 - p-map: 3.0.0 - - create-error-class@3.0.2: - dependencies: - capture-stack-trace: 1.0.2 - - create-jest@29.7.0(@types/node@22.15.32)(babel-plugin-macros@3.1.0): - 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.32)(babel-plugin-macros@3.1.0) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - create-storybook@9.0.17: - dependencies: - semver: 7.7.2 - - crelt@1.0.6: {} - - cron-expression-validator@1.0.20: {} - - cron-parser@4.9.0: - dependencies: - luxon: 3.6.1 - - cron-validator@1.3.1: {} - - cross-env@7.0.3: - dependencies: - cross-spawn: 7.0.6 - - cross-fetch@3.2.0(encoding@0.1.13): - dependencies: - node-fetch: 2.7.0(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - cross-spawn@5.1.0: - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - - cross-spawn@6.0.6: - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.2 - shebang-command: 1.2.0 - which: 1.3.1 - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - crypto-js@4.2.0: {} - - crypto-random-string@1.0.0: {} - - crypto-random-string@2.0.0: {} - - css-color-names@0.0.4: {} - - css-declaration-sorter@6.4.1(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - - css-functions-list@3.2.3: {} - - css-loader@0.28.7: - dependencies: - babel-code-frame: 6.26.0 - css-selector-tokenizer: 0.7.3 - cssnano: 3.10.0 - icss-utils: 2.1.0 - loader-utils: 1.4.2 - lodash.camelcase: 4.3.0 - object-assign: 4.1.1 - postcss: 5.2.18 - postcss-modules-extract-imports: 1.2.1 - postcss-modules-local-by-default: 1.2.0 - postcss-modules-scope: 1.1.0 - postcss-modules-values: 1.3.0 - postcss-value-parser: 3.3.1 - source-list-map: 2.0.1 - - css-loader@3.6.0(webpack@5.100.2): - dependencies: - camelcase: 5.3.1 - cssesc: 3.0.0 - icss-utils: 4.1.1 - loader-utils: 1.4.2 - normalize-path: 3.0.0 - postcss: 7.0.39 - postcss-modules-extract-imports: 2.0.0 - postcss-modules-local-by-default: 3.0.3 - postcss-modules-scope: 2.2.0 - postcss-modules-values: 3.0.0 - postcss-value-parser: 4.2.0 - schema-utils: 2.7.1 - semver: 6.3.1 - webpack: 5.100.2(webpack-cli@4.10.0) - - css-loader@5.2.7(webpack@5.100.2): - dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - loader-utils: 2.0.4 - postcss: 8.5.6 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) - postcss-modules-scope: 3.2.1(postcss@8.5.6) - postcss-modules-values: 4.0.0(postcss@8.5.6) - postcss-value-parser: 4.2.0 - schema-utils: 3.3.0 - semver: 7.7.2 - webpack: 5.100.2(webpack-cli@4.10.0) - - css-loader@6.11.0(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)): - dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) - postcss-modules-scope: 3.2.1(postcss@8.5.6) - postcss-modules-values: 4.0.0(postcss@8.5.6) - postcss-value-parser: 4.2.0 - semver: 7.7.2 - optionalDependencies: - webpack: 5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6) - - css-loader@6.11.0(webpack@5.100.2): - dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) - postcss-modules-scope: 3.2.1(postcss@8.5.6) - postcss-modules-values: 4.0.0(postcss@8.5.6) - postcss-value-parser: 4.2.0 - semver: 7.7.2 - optionalDependencies: - webpack: 5.100.2(webpack-cli@6.0.1) - - css-loader@7.1.2(webpack@5.100.2): - dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) - postcss-modules-scope: 3.2.1(postcss@8.5.6) - postcss-modules-values: 4.0.0(postcss@8.5.6) - postcss-value-parser: 4.2.0 - semver: 7.7.2 - optionalDependencies: - webpack: 5.100.2(webpack-cli@4.10.0) - - css-select@4.3.0: - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 4.3.1 - domutils: 2.8.0 - nth-check: 2.1.1 - - css-select@5.1.0: - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 5.0.3 - domutils: 3.2.2 - nth-check: 2.1.1 - - css-selector-tokenizer@0.7.3: - dependencies: - cssesc: 3.0.0 - fastparse: 1.1.2 - - css-tree@1.1.3: - dependencies: - mdn-data: 2.0.14 - source-map: 0.6.1 - - css-tree@3.1.0: - dependencies: - mdn-data: 2.12.2 - source-map-js: 1.2.1 - - css-what@6.1.0: {} - - css.escape@1.5.1: {} - - cssesc@3.0.0: {} - - cssnano-preset-default@5.2.14(postcss@8.5.6): - dependencies: - css-declaration-sorter: 6.4.1(postcss@8.5.6) - cssnano-utils: 3.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-calc: 8.2.4(postcss@8.5.6) - postcss-colormin: 5.3.1(postcss@8.5.6) - postcss-convert-values: 5.1.3(postcss@8.5.6) - postcss-discard-comments: 5.1.2(postcss@8.5.6) - postcss-discard-duplicates: 5.1.0(postcss@8.5.6) - postcss-discard-empty: 5.1.1(postcss@8.5.6) - postcss-discard-overridden: 5.1.0(postcss@8.5.6) - postcss-merge-longhand: 5.1.7(postcss@8.5.6) - postcss-merge-rules: 5.1.4(postcss@8.5.6) - postcss-minify-font-values: 5.1.0(postcss@8.5.6) - postcss-minify-gradients: 5.1.1(postcss@8.5.6) - postcss-minify-params: 5.1.4(postcss@8.5.6) - postcss-minify-selectors: 5.2.1(postcss@8.5.6) - postcss-normalize-charset: 5.1.0(postcss@8.5.6) - postcss-normalize-display-values: 5.1.0(postcss@8.5.6) - postcss-normalize-positions: 5.1.1(postcss@8.5.6) - postcss-normalize-repeat-style: 5.1.1(postcss@8.5.6) - postcss-normalize-string: 5.1.0(postcss@8.5.6) - postcss-normalize-timing-functions: 5.1.0(postcss@8.5.6) - postcss-normalize-unicode: 5.1.1(postcss@8.5.6) - postcss-normalize-url: 5.1.0(postcss@8.5.6) - postcss-normalize-whitespace: 5.1.1(postcss@8.5.6) - postcss-ordered-values: 5.1.3(postcss@8.5.6) - postcss-reduce-initial: 5.1.2(postcss@8.5.6) - postcss-reduce-transforms: 5.1.0(postcss@8.5.6) - postcss-svgo: 5.1.0(postcss@8.5.6) - postcss-unique-selectors: 5.1.1(postcss@8.5.6) - - cssnano-utils@3.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - - cssnano@3.10.0: - dependencies: - autoprefixer: 6.7.7 - decamelize: 1.2.0 - defined: 1.0.1 - has: 1.0.4 - object-assign: 4.1.1 - postcss: 5.2.18 - postcss-calc: 5.3.1 - postcss-colormin: 2.2.2 - postcss-convert-values: 2.6.1 - postcss-discard-comments: 2.0.4 - postcss-discard-duplicates: 2.1.0 - postcss-discard-empty: 2.1.0 - postcss-discard-overridden: 0.1.1 - postcss-discard-unused: 2.2.3 - postcss-filter-plugins: 2.0.3 - postcss-merge-idents: 2.1.7 - postcss-merge-longhand: 2.0.2 - postcss-merge-rules: 2.1.2 - postcss-minify-font-values: 1.0.5 - postcss-minify-gradients: 1.0.5 - postcss-minify-params: 1.2.2 - postcss-minify-selectors: 2.1.1 - postcss-normalize-charset: 1.1.1 - postcss-normalize-url: 3.0.8 - postcss-ordered-values: 2.2.3 - postcss-reduce-idents: 2.4.0 - postcss-reduce-initial: 1.0.1 - postcss-reduce-transforms: 1.0.4 - postcss-svgo: 2.1.6 - postcss-unique-selectors: 2.0.2 - postcss-value-parser: 3.3.1 - postcss-zindex: 2.2.0 - - cssnano@5.1.15(postcss@8.5.6): - dependencies: - cssnano-preset-default: 5.2.14(postcss@8.5.6) - lilconfig: 2.1.0 - postcss: 8.5.6 - yaml: 1.10.2 - - csso@2.3.2: - dependencies: - clap: 1.2.3 - source-map: 0.5.7 - - csso@4.2.0: - dependencies: - css-tree: 1.1.3 - - cssom@0.3.8: {} - - cssom@0.4.4: {} - - cssom@0.5.0: {} - - cssstyle@0.2.37: - dependencies: - cssom: 0.3.8 - - cssstyle@1.4.0: - dependencies: - cssom: 0.3.8 - - cssstyle@2.3.0: - dependencies: - cssom: 0.3.8 - - csstype@3.1.3: {} - - cubic2quad@1.2.1: {} - - currently-unhandled@0.4.1: - dependencies: - array-find-index: 1.0.2 - - cyclist@1.0.2: {} - - d@1.0.2: - dependencies: - es5-ext: 0.10.64 - type: 2.7.3 - - dagre@0.8.5: - dependencies: - graphlib: 2.1.8 - lodash: 4.17.21 - - damerau-levenshtein@1.0.8: {} - - dashdash@1.14.1: - dependencies: - assert-plus: 1.0.0 - - data-uri-to-buffer@4.0.1: {} - - data-urls@1.1.0: - dependencies: - abab: 2.0.6 - whatwg-mimetype: 2.3.0 - whatwg-url: 7.1.0 - - data-urls@3.0.2: - dependencies: - abab: 2.0.6 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 - - data-view-buffer@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-offset@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - date-fns-tz@3.2.0(date-fns@4.1.0): - dependencies: - date-fns: 4.1.0 - - date-fns@4.1.0: {} - - date-format@4.0.14: {} - - debounce-promise@3.1.2: {} - - debug@2.6.9: - dependencies: - ms: 2.0.0 - - debug@3.2.7: - dependencies: - ms: 2.1.3 - - debug@4.3.1: - dependencies: - ms: 2.1.2 - - debug@4.4.1(supports-color@8.1.1): - dependencies: - ms: 2.1.3 - optionalDependencies: - supports-color: 8.1.1 - - decache@4.6.2: - dependencies: - callsite: 1.0.0 - - decamelize-keys@1.1.1: - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - - decamelize@1.2.0: {} - - decamelize@4.0.0: {} - - decamelize@5.0.1: {} - - decimal.js@10.5.0: {} - - decode-named-character-reference@1.2.0: - dependencies: - character-entities: 2.0.2 - - decode-uri-component@0.2.2: {} - - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - - dedent@0.7.0: {} - - dedent@1.6.0(babel-plugin-macros@3.1.0): - optionalDependencies: - babel-plugin-macros: 3.1.0 - - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - deep-eql@5.0.2: {} - - deep-equal@2.2.3: - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - es-get-iterator: 1.1.3 - get-intrinsic: 1.3.0 - is-arguments: 1.2.0 - is-array-buffer: 3.0.5 - is-date-object: 1.1.0 - is-regex: 1.2.1 - is-shared-array-buffer: 1.0.4 - isarray: 2.0.5 - object-is: 1.1.6 - object-keys: 1.1.1 - object.assign: 4.1.7 - regexp.prototype.flags: 1.5.4 - side-channel: 1.1.0 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.19 - - deep-extend@0.6.0: {} - - deep-is@0.1.4: {} - - deepmerge@4.3.1: {} - - default-browser-id@1.0.4: - dependencies: - bplist-parser: 0.1.1 - meow: 3.7.0 - untildify: 2.1.0 - optional: true - - default-browser-id@3.0.0: - dependencies: - bplist-parser: 0.2.0 - untildify: 4.0.0 - - default-browser-id@5.0.0: {} - - default-browser@5.2.1: - dependencies: - bundle-name: 4.1.0 - default-browser-id: 5.0.0 - - default-require-extensions@1.0.0: - dependencies: - strip-bom: 2.0.0 - - defaults@1.0.4: - dependencies: - clone: 1.0.4 - - defer-to-connect@2.0.1: {} - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - - define-lazy-prop@2.0.0: {} - - define-lazy-prop@3.0.0: {} - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - defined@1.0.1: {} - - defu@6.1.4: {} - - del-cli@5.1.0: - dependencies: - del: 7.1.0 - meow: 10.1.5 - - del-cli@6.0.0: - dependencies: - del: 8.0.0 - meow: 13.2.0 - - del@2.2.2: - dependencies: - globby: 5.0.0 - is-path-cwd: 1.0.0 - is-path-in-cwd: 1.0.1 - object-assign: 4.1.1 - pify: 2.3.0 - pinkie-promise: 2.0.1 - rimraf: 2.7.1 - - del@6.1.1: - dependencies: - globby: 11.1.0 - graceful-fs: 4.2.11 - is-glob: 4.0.3 - is-path-cwd: 2.2.0 - is-path-inside: 3.0.3 - p-map: 4.0.0 - rimraf: 3.0.2 - slash: 3.0.0 - - del@7.1.0: - dependencies: - globby: 13.2.2 - graceful-fs: 4.2.11 - is-glob: 4.0.3 - is-path-cwd: 3.0.0 - is-path-inside: 4.0.0 - p-map: 5.5.0 - rimraf: 3.0.2 - slash: 4.0.0 - - del@8.0.0: - dependencies: - globby: 14.1.0 - is-glob: 4.0.3 - is-path-cwd: 3.0.0 - is-path-inside: 4.0.0 - p-map: 7.0.3 - slash: 5.1.0 - - delayed-stream@1.0.0: {} - - delegates@1.0.0: {} - - depd@1.1.2: {} - - depd@2.0.0: {} - - dequal@2.0.3: {} - - destroy@1.2.0: {} - - detab@2.0.4: - dependencies: - repeat-string: 1.6.1 - - detect-indent@4.0.0: - dependencies: - repeating: 2.0.1 - - detect-indent@6.1.0: {} - - detect-libc@1.0.3: - optional: true - - detect-libc@2.0.4: {} - - detect-newline@3.1.0: {} - - detect-node-es@1.1.0: {} - - detect-node@2.1.0: {} - - detect-package-manager@2.0.1: - dependencies: - execa: 5.1.1 - - detect-port-alt@1.1.6: - dependencies: - address: 1.2.2 - debug: 2.6.9 - transitivePeerDependencies: - - supports-color - - detect-port@1.6.1: - dependencies: - address: 1.2.2 - debug: 4.4.1(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - devlop@1.1.0: - dependencies: - dequal: 2.0.3 - - dexie@4.0.11: {} - - diagnostic-channel-publishers@0.3.5(diagnostic-channel@0.2.0): - dependencies: - diagnostic-channel: 0.2.0 - - diagnostic-channel@0.2.0: - dependencies: - semver: 5.7.2 - - didyoumean@1.2.2: {} - - diff-sequences@25.2.6: {} - - diff-sequences@29.6.3: {} - - diff@3.5.0: {} - - diff@4.0.2: {} - - diff@5.2.0: {} - - diff@7.0.0: {} - - dir-glob@2.2.2: - dependencies: - path-type: 3.0.0 - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - dlv@1.1.3: {} - - dnd-core@16.0.1: - dependencies: - '@react-dnd/asap': 5.0.2 - '@react-dnd/invariant': 4.0.2 - redux: 4.2.1 - - dns-packet@5.6.1: - dependencies: - '@leichtgewicht/ip-codec': 2.0.5 - - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - - dom-accessibility-api@0.5.16: {} - - dom-accessibility-api@0.6.3: {} - - dom-converter@0.2.0: - dependencies: - utila: 0.4.0 - - dom-serializer@1.4.1: - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - - dom-serializer@2.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - - dom-urls@1.1.0: - dependencies: - urijs: 1.19.11 - - dom-walk@0.1.2: {} - - domelementtype@2.3.0: {} - - domexception@1.0.1: - dependencies: - webidl-conversions: 4.0.2 - - domexception@4.0.0: - dependencies: - webidl-conversions: 7.0.0 - - domhandler@4.3.1: - dependencies: - domelementtype: 2.3.0 - - domhandler@5.0.3: - dependencies: - domelementtype: 2.3.0 - - dompurify@3.2.4: - optionalDependencies: - '@types/trusted-types': 2.0.7 - - domutils@2.8.0: - dependencies: - dom-serializer: 1.4.1 - domelementtype: 2.3.0 - domhandler: 4.3.1 - - domutils@3.2.2: - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - - dot-case@3.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.8.1 - - dot-prop@4.2.1: - dependencies: - is-obj: 1.0.1 - - dotenv-expand@10.0.0: {} - - dotenv-expand@4.2.0: {} - - dotenv-expand@5.1.0: {} - - dotenv@16.3.2: {} - - dotenv@16.5.0: {} - - dotenv@16.6.1: {} - - dotenv@4.0.0: {} - - dotenv@8.6.0: {} - - drange@1.1.1: {} - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - duplexer2@0.1.4: - dependencies: - readable-stream: 2.3.8 - - duplexer3@0.1.5: {} - - duplexer@0.1.2: {} - - duplexify@3.7.1: - dependencies: - end-of-stream: 1.4.5 - inherits: 2.0.4 - readable-stream: 2.3.8 - stream-shift: 1.0.3 - - eastasianwidth@0.2.0: {} - - ecc-jsbn@0.1.2: - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - - ecdsa-sig-formatter@1.0.11: - dependencies: - safe-buffer: 5.2.1 - - editions@6.21.0: - dependencies: - version-range: 4.14.0 - - ee-first@1.1.1: {} - - ejs@3.1.10: - dependencies: - jake: 10.9.2 - - electron-to-chromium@1.5.171: {} - - electron-to-chromium@1.5.185: {} - - email-addresses@5.0.0: {} - - emitter-listener@1.1.2: - dependencies: - shimmer: 1.2.1 - - emittery@0.13.1: {} - - emoji-regex@10.4.0: {} - - emoji-regex@7.0.3: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - emojis-list@2.1.0: {} - - emojis-list@3.0.0: {} - - enabled@2.0.0: {} - - encodeurl@1.0.2: {} - - encodeurl@2.0.0: {} - - encoding-sniffer@0.2.1: - dependencies: - iconv-lite: 0.6.3 - whatwg-encoding: 3.1.1 - - encoding@0.1.13: - dependencies: - iconv-lite: 0.6.3 - optional: true - - end-of-stream@1.4.5: - dependencies: - once: 1.4.0 - - endent@2.1.0: - dependencies: - dedent: 0.7.0 - fast-json-parse: 1.0.3 - objectorarray: 1.0.5 - - enhanced-resolve@3.4.1: - dependencies: - graceful-fs: 4.2.11 - memory-fs: 0.4.1 - object-assign: 4.1.1 - tapable: 0.2.9 - - enhanced-resolve@5.18.1: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.2 - - enhanced-resolve@5.18.2: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.2 - - enquirer@2.4.1: - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 - - entities@2.1.0: {} - - entities@2.2.0: {} - - entities@4.5.0: {} - - entities@6.0.1: {} - - env-paths@2.2.1: {} - - envinfo@7.14.0: {} - - environment@1.1.0: {} - - err-code@1.1.2: {} - - err-code@2.0.3: {} - - errno@0.1.8: - dependencies: - prr: 1.0.1 - - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - - error-stack-parser@2.1.4: - dependencies: - stackframe: 1.3.4 - - es-abstract@1.24.0: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-negative-zero: 2.0.3 - is-regex: 1.2.1 - is-set: 2.0.3 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 - - es-array-method-boxes-properly@1.0.0: {} - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-get-iterator@1.1.3: - dependencies: - call-bind: 1.0.8 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - is-arguments: 1.2.0 - is-map: 2.0.3 - is-set: 2.0.3 - is-string: 1.1.1 - isarray: 2.0.5 - stop-iteration-iterator: 1.1.0 - - es-iterator-helpers@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-set-tostringtag: 2.1.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - iterator.prototype: 1.1.5 - safe-array-concat: 1.1.3 - - es-module-lexer@1.7.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 - - es-shim-unscopables@1.1.0: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - - es-toolkit@1.39.7: {} - - es5-ext@0.10.64: - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - esniff: 2.0.1 - next-tick: 1.1.0 - - es5-shim@4.6.7: {} - - es6-iterator@2.0.3: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-symbol: 3.1.4 - - es6-promise@4.2.8: {} - - es6-promisify@6.1.1: {} - - es6-shim@0.35.8: {} - - es6-symbol@3.1.4: - dependencies: - 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.5): - dependencies: - debug: 4.4.1(supports-color@8.1.1) - esbuild: 0.25.5 - transitivePeerDependencies: - - supports-color - - esbuild-register@3.6.0(esbuild@0.25.6): - dependencies: - debug: 4.4.1(supports-color@8.1.1) - esbuild: 0.25.6 - transitivePeerDependencies: - - supports-color - - esbuild@0.25.5: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.5 - '@esbuild/android-arm': 0.25.5 - '@esbuild/android-arm64': 0.25.5 - '@esbuild/android-x64': 0.25.5 - '@esbuild/darwin-arm64': 0.25.5 - '@esbuild/darwin-x64': 0.25.5 - '@esbuild/freebsd-arm64': 0.25.5 - '@esbuild/freebsd-x64': 0.25.5 - '@esbuild/linux-arm': 0.25.5 - '@esbuild/linux-arm64': 0.25.5 - '@esbuild/linux-ia32': 0.25.5 - '@esbuild/linux-loong64': 0.25.5 - '@esbuild/linux-mips64el': 0.25.5 - '@esbuild/linux-ppc64': 0.25.5 - '@esbuild/linux-riscv64': 0.25.5 - '@esbuild/linux-s390x': 0.25.5 - '@esbuild/linux-x64': 0.25.5 - '@esbuild/netbsd-arm64': 0.25.5 - '@esbuild/netbsd-x64': 0.25.5 - '@esbuild/openbsd-arm64': 0.25.5 - '@esbuild/openbsd-x64': 0.25.5 - '@esbuild/sunos-x64': 0.25.5 - '@esbuild/win32-arm64': 0.25.5 - '@esbuild/win32-ia32': 0.25.5 - '@esbuild/win32-x64': 0.25.5 - - esbuild@0.25.6: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.6 - '@esbuild/android-arm': 0.25.6 - '@esbuild/android-arm64': 0.25.6 - '@esbuild/android-x64': 0.25.6 - '@esbuild/darwin-arm64': 0.25.6 - '@esbuild/darwin-x64': 0.25.6 - '@esbuild/freebsd-arm64': 0.25.6 - '@esbuild/freebsd-x64': 0.25.6 - '@esbuild/linux-arm': 0.25.6 - '@esbuild/linux-arm64': 0.25.6 - '@esbuild/linux-ia32': 0.25.6 - '@esbuild/linux-loong64': 0.25.6 - '@esbuild/linux-mips64el': 0.25.6 - '@esbuild/linux-ppc64': 0.25.6 - '@esbuild/linux-riscv64': 0.25.6 - '@esbuild/linux-s390x': 0.25.6 - '@esbuild/linux-x64': 0.25.6 - '@esbuild/netbsd-arm64': 0.25.6 - '@esbuild/netbsd-x64': 0.25.6 - '@esbuild/openbsd-arm64': 0.25.6 - '@esbuild/openbsd-x64': 0.25.6 - '@esbuild/openharmony-arm64': 0.25.6 - '@esbuild/sunos-x64': 0.25.6 - '@esbuild/win32-arm64': 0.25.6 - '@esbuild/win32-ia32': 0.25.6 - '@esbuild/win32-x64': 0.25.6 - - escalade@3.2.0: {} - - escape-html@1.0.3: {} - - escape-string-regexp@1.0.5: {} - - escape-string-regexp@2.0.0: {} - - escape-string-regexp@4.0.0: {} - - escape-string-regexp@5.0.0: {} - - escodegen@1.14.3: - dependencies: - esprima: 4.0.1 - estraverse: 4.3.0 - esutils: 2.0.3 - optionator: 0.8.3 - optionalDependencies: - source-map: 0.6.1 - - escodegen@1.8.1: - dependencies: - esprima: 2.7.3 - estraverse: 1.9.3 - esutils: 2.0.3 - optionator: 0.8.3 - optionalDependencies: - source-map: 0.2.0 - - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - - eslint-config-prettier@6.15.0(eslint@6.8.0): - dependencies: - eslint: 6.8.0 - 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@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@6.8.0)(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(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(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(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)(typescript@3.9.10): - dependencies: - '@typescript-eslint/eslint-plugin': 2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(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) - 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(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(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) - optionalDependencies: - typescript: 3.9.10 - - eslint-import-resolver-node@0.3.9: - dependencies: - debug: 3.2.7 - is-core-module: 2.16.1 - resolve: 1.22.10 - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.1(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@6.8.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 2.34.0(eslint@6.8.0)(typescript@3.9.10) - eslint: 6.8.0 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - - eslint-plugin-flowtype@3.13.0(eslint@6.8.0): - dependencies: - eslint: 6.8.0 - lodash: 4.17.21 - - eslint-plugin-import@2.32.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@6.8.0): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.9 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 6.8.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint@6.8.0) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 2.34.0(eslint@6.8.0)(typescript@3.9.10) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-jsx-a11y@6.10.2(eslint@6.8.0): - 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.10.3 - axobject-query: 4.1.0 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 6.8.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - 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): - dependencies: - eslint: 6.8.0 - prettier: 1.19.1 - prettier-linter-helpers: 1.0.0 - 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.4.2)): - dependencies: - eslint: 9.26.0(jiti@2.4.2) - - eslint-plugin-react-hooks@5.2.0(eslint@9.27.0(jiti@2.4.2)): - dependencies: - eslint: 9.27.0(jiti@2.4.2) - - eslint-plugin-react-refresh@0.4.20(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-plugin-react-refresh@0.4.20(eslint@9.27.0(jiti@2.4.2)): - dependencies: - eslint: 9.27.0(jiti@2.4.2) - - eslint-plugin-react@7.37.5(eslint@6.8.0): - 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-plugin-react@7.37.5(eslint@8.57.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 - 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-plugin-storybook@9.0.12(eslint@8.57.1)(storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2))(typescript@5.8.3): - dependencies: - '@typescript-eslint/utils': 8.33.1(eslint@8.57.1)(typescript@5.8.3) - eslint: 8.57.1 - storybook: 9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2) - transitivePeerDependencies: - - supports-color - - typescript - - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2)): - dependencies: - eslint: 9.27.0(jiti@2.4.2) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(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.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.26.0(jiti@2.4.2)): - dependencies: - eslint: 9.26.0(jiti@2.4.2) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.26.0(jiti@2.4.2))(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.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2)): - dependencies: - eslint: 9.27.0(jiti@2.4.2) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(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-visitor-keys@1.3.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.1(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: 3.14.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.7.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.1 - '@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.1(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.0 - 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.4.2): - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@2.4.2)) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.20.1 - '@eslint/config-helpers': 0.2.3 - '@eslint/core': 0.13.0 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.26.0 - '@eslint/plugin-kit': 0.3.4 - '@humanfs/node': 0.16.6 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@modelcontextprotocol/sdk': 1.13.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 - debug: 4.4.1(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 - 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.67 - optionalDependencies: - jiti: 2.4.2 - transitivePeerDependencies: - - supports-color - - eslint@9.27.0(jiti@2.4.2): - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@2.4.2)) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.20.1 - '@eslint/config-helpers': 0.2.3 - '@eslint/core': 0.14.0 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.27.0 - '@eslint/plugin-kit': 0.3.4 - '@humanfs/node': 0.16.6 - '@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.1(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 - 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 - optionalDependencies: - jiti: 2.4.2 - transitivePeerDependencies: - - supports-color - - esniff@2.0.1: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - event-emitter: 0.3.5 - type: 2.7.3 - - espree@10.4.0: - dependencies: - acorn: 8.15.0 - 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: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@1.9.3: {} - - estraverse@4.3.0: {} - - estraverse@5.3.0: {} - - estree-to-babel@3.2.1: - dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 - c8: 7.14.0 - transitivePeerDependencies: - - supports-color - - estree-util-is-identifier-name@3.0.0: {} - - estree-walker@0.2.1: {} - - estree-walker@0.6.1: {} - - estree-walker@1.0.1: {} - - estree-walker@2.0.2: {} - - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.8 - - esutils@2.0.3: {} - - etag@1.8.1: {} - - event-emitter@0.3.5: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - - event-target-shim@5.0.1: {} - - eventemitter3@4.0.7: {} - - eventemitter3@5.0.1: {} - - events@3.3.0: {} - - eventsource-parser@3.0.2: {} - - eventsource@0.1.6: - dependencies: - original: 1.0.2 - - eventsource@3.0.7: - dependencies: - eventsource-parser: 3.0.2 - - exec-sh@0.2.2: - dependencies: - merge: 1.2.1 - - exec-sh@0.3.6: {} - - execa@0.7.0: - dependencies: - cross-spawn: 5.1.0 - get-stream: 3.0.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - - execa@1.0.0: - dependencies: - cross-spawn: 6.0.6 - get-stream: 4.1.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - - execa@3.4.0: - dependencies: - cross-spawn: 7.0.6 - get-stream: 5.2.0 - human-signals: 1.1.1 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - p-finally: 2.0.1 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - execa@4.1.0: - dependencies: - cross-spawn: 7.0.6 - get-stream: 5.2.0 - human-signals: 1.1.1 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - execa@5.1.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - execa@8.0.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - - exenv-es6@1.1.1: {} - - exit@0.1.2: {} - - expand-template@2.0.3: {} - - expand-tilde@2.0.2: - dependencies: - homedir-polyfill: 1.0.3 - - expect@22.4.3: - dependencies: - ansi-styles: 3.2.1 - jest-diff: 22.4.3 - jest-get-type: 22.4.3 - jest-matcher-utils: 22.4.3 - jest-message-util: 22.4.3 - jest-regex-util: 22.4.3 - - expect@25.5.0: - dependencies: - '@jest/types': 25.5.0 - ansi-styles: 4.3.0 - jest-get-type: 25.2.6 - jest-matcher-utils: 25.5.0 - jest-message-util: 25.5.0 - jest-regex-util: 25.2.6 - - expect@29.7.0: - dependencies: - '@jest/expect-utils': 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - - exponential-backoff@3.1.2: {} - - express-rate-limit@7.5.1(express@5.1.0): - dependencies: - express: 5.1.0 - - express@4.21.2: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.3 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.1 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.1 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.12 - proxy-addr: 2.0.7 - qs: 6.13.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.0 - serve-static: 1.16.2 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - express@5.1.0: - dependencies: - accepts: 2.0.0 - body-parser: 2.2.0 - content-disposition: 1.0.0 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.2.2 - debug: 4.4.1(supports-color@8.1.1) - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 2.1.0 - fresh: 2.0.0 - http-errors: 2.0.0 - merge-descriptors: 2.0.0 - mime-types: 3.0.1 - on-finished: 2.4.1 - once: 1.4.0 - parseurl: 1.3.3 - proxy-addr: 2.0.7 - qs: 6.14.0 - range-parser: 1.2.1 - router: 2.2.0 - send: 1.2.0 - serve-static: 2.2.0 - statuses: 2.0.2 - type-is: 2.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - ext@1.7.0: - dependencies: - type: 2.7.3 - - extend-shallow@3.0.2: - dependencies: - assign-symbols: 1.0.0 - is-extendable: 1.0.1 - - extend@3.0.2: {} - - external-editor@2.2.0: - dependencies: - chardet: 0.4.2 - 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.100.2): - dependencies: - async: 2.6.4 - loader-utils: 1.4.2 - schema-utils: 0.3.0 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - webpack-sources: 1.4.3 - - extract-zip@1.7.0: - dependencies: - concat-stream: 1.6.2 - debug: 2.6.9 - mkdirp: 0.5.6 - yauzl: 2.10.0 - transitivePeerDependencies: - - supports-color - - extsprintf@1.3.0: {} - - fantasticon@3.0.0: - dependencies: - case: 1.6.3 - cli-color: 2.0.4 - commander: 12.1.0 - glob: 10.4.5 - 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: - - bluebird - - supports-color - - fast-deep-equal@1.1.0: {} - - fast-deep-equal@3.1.3: {} - - fast-diff@1.3.0: {} - - fast-glob@2.2.7: - dependencies: - '@mrmlnc/readdir-enhanced': 2.2.1 - '@nodelib/fs.stat': 1.1.3 - glob-parent: 3.1.0 - is-glob: 4.0.3 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-json-parse@1.0.3: {} - - fast-json-patch@3.1.1: {} - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fast-safe-stringify@2.1.1: {} - - fast-uri@3.0.6: {} - - fast-xml-parser@4.4.1: - dependencies: - strnum: 1.1.2 - - fast-xml-parser@5.2.5: - dependencies: - strnum: 2.1.1 - - fastest-levenshtein@1.0.16: {} - - fastparse@1.1.2: {} - - fastq@1.19.1: - dependencies: - reusify: 1.1.0 - - fault@1.0.4: - dependencies: - format: 0.2.2 - - faye-websocket@0.11.4: - dependencies: - websocket-driver: 0.7.4 - - fb-watchman@1.9.2: - dependencies: - bser: 1.0.2 - - fb-watchman@2.0.2: - dependencies: - bser: 2.1.1 - - fbemitter@3.0.0(encoding@0.1.13): - dependencies: - fbjs: 3.0.5(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - fbjs-css-vars@1.0.2: {} - - fbjs@3.0.5(encoding@0.1.13): - dependencies: - cross-fetch: 3.2.0(encoding@0.1.13) - fbjs-css-vars: 1.0.2 - loose-envify: 1.4.0 - object-assign: 4.1.1 - promise: 7.3.1 - setimmediate: 1.0.5 - ua-parser-js: 1.0.40 - transitivePeerDependencies: - - encoding - - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 - - fdir@6.4.6(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - - fecha@4.2.3: {} - - fetch-blob@3.2.0: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - - fetch-retry@5.0.6: {} - - figures@2.0.0: - dependencies: - escape-string-regexp: 1.0.5 - - figures@3.2.0: - dependencies: - escape-string-regexp: 1.0.5 - - file-entry-cache@10.1.1: - dependencies: - flat-cache: 6.1.10 - - file-entry-cache@5.0.1: - dependencies: - flat-cache: 2.0.1 - - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - - file-entry-cache@8.0.0: - dependencies: - flat-cache: 4.0.1 - - file-js@0.3.0: - dependencies: - bluebird: 3.7.2 - minimatch: 3.1.2 - proper-lockfile: 1.2.0 - - file-loader@1.1.5(webpack@5.100.2): - dependencies: - loader-utils: 1.4.2 - schema-utils: 0.3.0 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - - file-loader@6.2.0(webpack@5.100.2): - dependencies: - loader-utils: 2.0.4 - schema-utils: 3.3.0 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - - file-system-cache@1.1.0: - dependencies: - fs-extra: 10.1.0 - ramda: 0.28.0 - - file-system-cache@2.3.0: - dependencies: - fs-extra: 11.1.1 - ramda: 0.29.0 - - file-type@18.7.0: - dependencies: - readable-web-to-node-stream: 3.0.4 - strtok3: 7.1.1 - token-types: 5.0.1 - - file-uri-to-path@1.0.0: {} - - file-uri-to-path@2.0.0: {} - - filehound@1.17.6: - dependencies: - bluebird: 3.7.2 - file-js: 0.3.0 - lodash: 4.17.21 - minimatch: 5.1.6 - moment: 2.30.1 - unit-compare: 1.0.1 - - filelist@1.0.4: - dependencies: - minimatch: 5.1.6 - - filename-reserved-regex@2.0.0: {} - - filenamify@4.3.0: - dependencies: - filename-reserved-regex: 2.0.0 - strip-outer: 1.0.1 - trim-repeated: 1.0.0 - - fileset@2.0.3: - dependencies: - glob: 7.2.3 - minimatch: 3.1.2 - - filesize@3.5.11: {} - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - finalhandler@1.3.1: - dependencies: - debug: 2.6.9 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - finalhandler@2.1.0: - dependencies: - debug: 4.4.1(supports-color@8.1.1) - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - - find-cache-dir@1.0.0: - dependencies: - commondir: 1.0.1 - make-dir: 1.3.0 - pkg-dir: 2.0.0 - - find-cache-dir@2.1.0: - dependencies: - commondir: 1.0.1 - make-dir: 2.1.0 - pkg-dir: 3.0.0 - - find-cache-dir@3.3.2: - dependencies: - commondir: 1.0.1 - make-dir: 3.1.0 - pkg-dir: 4.2.0 - - find-cache-dir@4.0.0: - dependencies: - common-path-prefix: 3.0.0 - pkg-dir: 7.0.0 - - find-index@0.1.1: {} - - find-process@1.4.10: - dependencies: - chalk: 4.1.2 - commander: 12.1.0 - loglevel: 1.9.2 - - find-root@1.1.0: {} - - find-up@1.1.2: - dependencies: - path-exists: 2.1.0 - pinkie-promise: 2.0.1 - - find-up@2.1.0: - dependencies: - locate-path: 2.0.0 - - find-up@3.0.0: - dependencies: - locate-path: 3.0.0 - - find-up@4.1.0: - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - find-up@6.3.0: - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - - find-up@7.0.0: - dependencies: - locate-path: 7.2.0 - 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 - keyv: 4.5.4 - rimraf: 3.0.2 - - flat-cache@4.0.1: - dependencies: - flatted: 3.3.3 - keyv: 4.5.4 - - flat-cache@6.1.10: - dependencies: - cacheable: 1.10.0 - flatted: 3.3.3 - hookified: 1.9.1 - - flat@5.0.2: {} - - flatted@2.0.2: {} - - flatted@3.3.3: {} - - flatten@1.0.3: {} - - flow-parser@0.275.0: {} - - flush-write-stream@1.1.1: - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - - flux@4.0.4(encoding@0.1.13)(react@18.2.0): - dependencies: - fbemitter: 3.0.0(encoding@0.1.13) - fbjs: 3.0.5(encoding@0.1.13) - react: 18.2.0 - transitivePeerDependencies: - - encoding - - fn.name@1.1.0: {} - - follow-redirects@1.15.9: {} - - for-each@0.3.5: - dependencies: - is-callable: 1.2.7 - - foreground-child@2.0.0: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 3.0.7 - - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - - forever-agent@0.6.1: {} - - fork-ts-checker-webpack-plugin@0.2.10(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3)(webpack@5.100.2): - dependencies: - babel-code-frame: 6.26.0 - chalk: 1.1.3 - chokidar: 1.7.0 - lodash.endswith: 4.2.1 - lodash.isfunction: 3.0.9 - lodash.isstring: 4.0.1 - lodash.startswith: 4.2.1 - minimatch: 3.1.2 - typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@4.10.0) - optionalDependencies: - eslint: 9.26.0(jiti@2.4.2) - - fork-ts-checker-webpack-plugin@0.2.10(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)(webpack@5.100.2): - dependencies: - babel-code-frame: 6.26.0 - chalk: 1.1.3 - chokidar: 1.7.0 - lodash.endswith: 4.2.1 - lodash.isfunction: 3.0.9 - lodash.isstring: 4.0.1 - lodash.startswith: 4.2.1 - minimatch: 3.1.2 - typescript: 5.8.3 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - optionalDependencies: - eslint: 9.27.0(jiti@2.4.2) - - fork-ts-checker-webpack-plugin@4.1.6(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3)(webpack@5.100.2): - dependencies: - '@babel/code-frame': 7.27.1 - chalk: 2.4.2 - micromatch: 4.0.8 - minimatch: 3.1.2 - semver: 5.7.2 - tapable: 1.1.3 - typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@4.10.0) - worker-rpc: 0.1.1 - optionalDependencies: - eslint: 9.26.0(jiti@2.4.2) - - fork-ts-checker-webpack-plugin@4.1.6(eslint@9.27.0(jiti@2.4.2))(typescript@4.9.5)(webpack@5.100.2): - dependencies: - '@babel/code-frame': 7.27.1 - chalk: 2.4.2 - micromatch: 4.0.8 - minimatch: 3.1.2 - semver: 5.7.2 - tapable: 1.1.3 - typescript: 4.9.5 - webpack: 5.100.2(webpack-cli@4.10.0) - worker-rpc: 0.1.1 - optionalDependencies: - eslint: 9.27.0(jiti@2.4.2) - - fork-ts-checker-webpack-plugin@4.1.6(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)(webpack@5.100.2): - dependencies: - '@babel/code-frame': 7.27.1 - chalk: 2.4.2 - micromatch: 4.0.8 - minimatch: 3.1.2 - semver: 5.7.2 - tapable: 1.1.3 - typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@4.10.0) - worker-rpc: 0.1.1 - optionalDependencies: - eslint: 9.27.0(jiti@2.4.2) - - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3)(webpack@5.100.2): - 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.2 - tapable: 1.1.3 - typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@4.10.0) - optionalDependencies: - eslint: 9.26.0(jiti@2.4.2) - - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.4.2))(typescript@4.9.5)(webpack@5.100.2): - 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.2 - tapable: 1.1.3 - typescript: 4.9.5 - webpack: 5.100.2(webpack-cli@4.10.0) - optionalDependencies: - eslint: 9.27.0(jiti@2.4.2) - - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)(webpack@5.100.2): - 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.2 - tapable: 1.1.3 - typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@4.10.0) - optionalDependencies: - eslint: 9.27.0(jiti@2.4.2) - - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)): - dependencies: - '@babel/code-frame': 7.27.1 - chalk: 4.1.2 - chokidar: 3.6.0 - cosmiconfig: 7.1.0 - deepmerge: 4.3.1 - fs-extra: 10.1.0 - memfs: 3.5.3 - minimatch: 3.1.2 - node-abort-controller: 3.1.1 - schema-utils: 3.3.0 - semver: 7.7.2 - tapable: 2.2.2 - typescript: 5.8.3 - webpack: 5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6) - - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.100.2): - dependencies: - '@babel/code-frame': 7.27.1 - chalk: 4.1.2 - chokidar: 3.6.0 - cosmiconfig: 7.1.0 - deepmerge: 4.3.1 - fs-extra: 10.1.0 - memfs: 3.5.3 - minimatch: 3.1.2 - node-abort-controller: 3.1.1 - schema-utils: 3.3.0 - semver: 7.7.2 - tapable: 2.2.2 - typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@6.0.1) - - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.8.3)(webpack@5.100.2): - dependencies: - '@babel/code-frame': 7.27.1 - chalk: 4.1.2 - chokidar: 4.0.3 - cosmiconfig: 8.3.6(typescript@5.8.3) - deepmerge: 4.3.1 - fs-extra: 10.1.0 - memfs: 3.5.3 - minimatch: 3.1.2 - node-abort-controller: 3.1.1 - schema-utils: 3.3.0 - semver: 7.7.2 - tapable: 2.2.2 - typescript: 5.8.3 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - - form-data-encoder@2.1.4: {} - - form-data-encoder@4.1.0: {} - - form-data@4.0.4: - 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 - - format@0.2.2: {} - - formdata-polyfill@4.0.10: - dependencies: - fetch-blob: 3.2.0 - - forwarded@0.2.0: {} - - fraction.js@4.3.7: {} - - framer-motion@6.5.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - '@motionone/dom': 10.12.0 - framesync: 6.0.1 - hey-listen: 1.0.8 - popmotion: 11.0.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - style-value-types: 5.0.0 - tslib: 2.8.1 - optionalDependencies: - '@emotion/is-prop-valid': 0.8.8 - - framesync@6.0.1: - dependencies: - tslib: 2.8.1 - - fresh@0.5.2: {} - - fresh@2.0.0: {} - - from2@2.3.0: - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - - fs-constants@1.0.0: {} - - fs-extra@0.30.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 2.4.0 - klaw: 1.3.1 - path-is-absolute: 1.0.1 - rimraf: 2.7.1 - - fs-extra@10.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-extra@11.1.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-extra@11.2.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-extra@11.3.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-extra@3.0.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 3.0.1 - universalify: 0.1.2 - - fs-extra@4.0.3: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fs-extra@8.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fs-extra@9.1.0: - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - - fs-monkey@1.0.6: {} - - fs-write-stream-atomic@1.0.10: - dependencies: - graceful-fs: 4.2.11 - iferr: 0.1.5 - imurmurhash: 0.1.4 - readable-stream: 2.3.8 - - fs.realpath@1.0.0: {} - - fsevents@1.2.13: - dependencies: - bindings: 1.5.0 - nan: 2.22.2 - optional: true - - fsevents@2.3.2: - optional: true - - fsevents@2.3.3: - optional: true - - fstream@1.0.12: - dependencies: - graceful-fs: 4.2.11 - inherits: 2.0.4 - mkdirp: 0.5.6 - rimraf: 2.7.1 - - function-bind@1.1.2: {} - - function.prototype.name@1.1.8: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 - - functional-red-black-tree@1.0.1: {} - - functions-have-names@1.2.3: {} - - gauge@2.7.4: - dependencies: - aproba: 1.2.0 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 1.0.2 - strip-ansi: 3.0.1 - wide-align: 1.1.5 - - gauge@3.0.2: - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - - gauge@4.0.4: - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - - gaze@1.1.3: - dependencies: - globule: 1.3.4 - - generic-names@4.0.0: - dependencies: - loader-utils: 3.3.1 - - gensync@1.0.0-beta.2: {} - - get-caller-file@1.0.3: {} - - get-caller-file@2.0.5: {} - - get-east-asian-width@1.3.0: {} - - get-func-name@2.0.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-nonce@1.0.1: {} - - get-npm-tarball-url@2.1.0: {} - - get-package-type@0.1.0: {} - - get-port@5.1.1: {} - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - get-stdin@4.0.1: {} - - get-stdin@6.0.0: {} - - get-stream@3.0.0: {} - - get-stream@4.1.0: - dependencies: - pump: 3.0.3 - - get-stream@5.2.0: - dependencies: - pump: 3.0.3 - - get-stream@6.0.1: {} - - get-stream@8.0.1: {} - - get-stream@9.0.1: - dependencies: - '@sec-ant/readable-stream': 0.4.1 - is-stream: 4.0.1 - - get-symbol-description@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - - get-them-args@1.3.2: {} - - get-value@3.0.1: - dependencies: - isobject: 3.0.1 - - getpass@0.1.7: - dependencies: - assert-plus: 1.0.0 - - gh-pages@6.3.0: - dependencies: - async: 3.2.6 - commander: 13.1.0 - email-addresses: 5.0.0 - filenamify: 4.3.0 - find-cache-dir: 3.3.2 - fs-extra: 11.3.0 - globby: 11.1.0 - - giget@1.2.5: - dependencies: - citty: 0.1.6 - consola: 3.4.2 - defu: 6.1.4 - node-fetch-native: 1.6.6 - nypm: 0.5.4 - pathe: 2.0.3 - tar: 6.2.1 - - github-from-package@0.0.0: {} - - github-slugger@1.5.0: {} - - glob-parent@2.0.0: - dependencies: - is-glob: 2.0.1 - - glob-parent@3.1.0: - dependencies: - is-glob: 3.1.0 - path-dirname: 1.0.2 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob-promise@3.4.0(glob@7.2.3): - dependencies: - '@types/glob': 8.1.0 - glob: 7.2.3 - - glob-to-regexp@0.3.0: {} - - glob-to-regexp@0.4.1: {} - - glob2base@0.0.12: - dependencies: - find-index: 0.1.1 - - glob@10.4.5: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - glob@11.0.3: - dependencies: - foreground-child: 3.3.1 - jackspeak: 4.1.1 - minimatch: 10.0.3 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 2.0.0 - - glob@5.0.15: - dependencies: - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@7.1.7: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.0.8 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - - global-dirs@0.1.1: - dependencies: - ini: 1.3.8 - - global-modules@1.0.0: - dependencies: - global-prefix: 1.0.2 - is-windows: 1.0.2 - resolve-dir: 1.0.1 - - global-modules@2.0.0: - dependencies: - global-prefix: 3.0.0 - - global-prefix@1.0.2: - dependencies: - expand-tilde: 2.0.2 - homedir-polyfill: 1.0.3 - ini: 1.3.8 - is-windows: 1.0.2 - which: 1.3.1 - - global-prefix@3.0.0: - dependencies: - ini: 1.3.8 - kind-of: 6.0.3 - which: 1.3.1 - - global@4.4.0: - dependencies: - min-document: 2.19.0 - process: 0.11.10 - - globals@11.12.0: {} - - 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: {} - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 - - globalyzer@0.1.0: {} - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - - globby@13.2.2: - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 4.0.0 - - globby@14.1.0: - dependencies: - '@sindresorhus/merge-streams': 2.3.0 - fast-glob: 3.3.3 - ignore: 7.0.5 - path-type: 6.0.0 - slash: 5.1.0 - unicorn-magic: 0.3.0 - - globby@5.0.0: - dependencies: - array-union: 1.0.2 - arrify: 1.0.1 - glob: 7.2.3 - object-assign: 4.1.1 - pify: 2.3.0 - pinkie-promise: 2.0.1 - - globby@9.2.0: - dependencies: - '@types/glob': 7.2.0 - array-union: 1.0.2 - dir-glob: 2.2.2 - fast-glob: 2.2.7 - glob: 7.2.3 - ignore: 4.0.6 - pify: 4.0.1 - slash: 2.0.0 - - globjoin@0.1.4: {} - - globrex@0.1.2: {} - - globule@1.3.4: - dependencies: - glob: 7.1.7 - lodash: 4.17.21 - minimatch: 3.0.8 - - gopd@1.2.0: {} - - got@13.0.0: - dependencies: - '@sindresorhus/is': 5.6.0 - '@szmarczak/http-timer': 5.0.1 - cacheable-lookup: 7.0.0 - cacheable-request: 10.2.14 - decompress-response: 6.0.0 - form-data-encoder: 2.1.4 - get-stream: 6.0.1 - http2-wrapper: 2.2.1 - lowercase-keys: 3.0.0 - p-cancelable: 3.0.0 - responselike: 3.0.0 - - got@14.4.7: - dependencies: - '@sindresorhus/is': 7.0.2 - '@szmarczak/http-timer': 5.0.1 - cacheable-lookup: 7.0.0 - cacheable-request: 12.0.1 - decompress-response: 6.0.0 - form-data-encoder: 4.1.0 - http2-wrapper: 2.2.1 - lowercase-keys: 3.0.0 - p-cancelable: 4.0.1 - responselike: 3.0.0 - type-fest: 4.41.0 - - got@6.7.1: - dependencies: - '@types/keyv': 3.1.4 - '@types/responselike': 1.0.3 - create-error-class: 3.0.2 - duplexer3: 0.1.5 - get-stream: 3.0.0 - is-redirect: 1.0.0 - is-retry-allowed: 1.2.0 - is-stream: 1.1.0 - lowercase-keys: 1.0.1 - safe-buffer: 5.2.1 - timed-out: 4.0.1 - unzip-response: 2.0.1 - url-parse-lax: 1.0.0 - - graceful-fs@4.2.11: {} - - graphemer@1.4.0: {} - - graphiql-explorer@0.9.0(graphql@16.11.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - graphql: 16.11.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - graphiql@3.7.0(@codemirror/language@6.11.1)(@types/node@24.0.14)(@types/react-dom@18.2.0)(@types/react@18.2.0)(graphql@16.11.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - '@graphiql/react': 0.26.2(@codemirror/language@6.11.1)(@types/node@24.0.14)(@types/react-dom@18.2.0)(@types/react@18.2.0)(graphql@16.11.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - graphql: 16.11.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - transitivePeerDependencies: - - '@codemirror/language' - - '@types/node' - - '@types/react' - - '@types/react-dom' - - graphql-ws - - graphlib@2.1.8: - dependencies: - lodash: 4.17.21 - - graphql-language-service@5.4.0(graphql@16.11.0): - dependencies: - debounce-promise: 3.1.2 - graphql: 16.11.0 - nullthrows: 1.1.1 - vscode-languageserver-types: 3.17.5 - - graphql@16.11.0: {} - - growly@1.3.0: {} - - gunzip-maybe@1.4.2: - dependencies: - browserify-zlib: 0.1.4 - is-deflate: 1.0.0 - is-gzip: 1.0.0 - peek-stream: 1.1.3 - pumpify: 1.5.1 - through2: 2.0.5 - - gzip-size@3.0.0: - dependencies: - duplexer: 0.1.2 - - handle-thing@2.0.1: {} - - handlebars@4.7.8: - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.19.3 - - har-schema@2.0.0: {} - - har-validator@5.1.5: - dependencies: - ajv: 6.12.6 - har-schema: 2.0.0 - - hard-rejection@2.1.0: {} - - harmony-reflect@1.6.2: {} - - has-ansi@2.0.0: - dependencies: - ansi-regex: 2.1.1 - - has-bigints@1.1.0: {} - - has-flag@1.0.0: {} - - has-flag@3.0.0: {} - - has-flag@4.0.0: {} - - has-glob@1.0.0: - dependencies: - is-glob: 3.1.0 - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - - has-proto@1.2.0: - dependencies: - dunder-proto: 1.0.1 - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - has-unicode@2.0.1: {} - - has@1.0.4: {} - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - hast-to-hyperscript@9.0.1: - dependencies: - '@types/unist': 2.0.11 - comma-separated-tokens: 1.0.8 - property-information: 5.6.0 - space-separated-tokens: 1.1.5 - style-to-object: 0.3.0 - unist-util-is: 4.1.0 - web-namespaces: 1.1.4 - - hast-util-from-parse5@6.0.1: - dependencies: - '@types/parse5': 5.0.3 - hastscript: 6.0.0 - property-information: 5.6.0 - vfile: 4.2.1 - vfile-location: 3.2.0 - web-namespaces: 1.1.4 - - hast-util-from-parse5@7.1.2: - dependencies: - '@types/hast': 2.3.10 - '@types/unist': 2.0.11 - hastscript: 7.2.0 - property-information: 6.5.0 - vfile: 5.3.7 - vfile-location: 4.1.0 - web-namespaces: 2.0.1 - - hast-util-from-parse5@8.0.3: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - devlop: 1.1.0 - hastscript: 9.0.1 - property-information: 7.1.0 - vfile: 6.0.3 - vfile-location: 5.0.3 - web-namespaces: 2.0.1 - - hast-util-parse-selector@2.2.5: {} - - hast-util-parse-selector@3.1.1: - dependencies: - '@types/hast': 2.3.10 - - hast-util-parse-selector@4.0.0: - dependencies: - '@types/hast': 3.0.4 - - hast-util-raw@6.0.1: - dependencies: - '@types/hast': 2.3.10 - hast-util-from-parse5: 6.0.1 - hast-util-to-parse5: 6.0.0 - html-void-elements: 1.0.5 - parse5: 6.0.1 - unist-util-position: 3.1.0 - vfile: 4.2.1 - web-namespaces: 1.1.4 - xtend: 4.0.2 - zwitch: 1.0.5 - - hast-util-raw@7.2.3: - dependencies: - '@types/hast': 2.3.10 - '@types/parse5': 6.0.3 - hast-util-from-parse5: 7.1.2 - hast-util-to-parse5: 7.1.0 - html-void-elements: 2.0.1 - parse5: 6.0.1 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 - vfile: 5.3.7 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - - hast-util-raw@9.1.0: - dependencies: - '@types/hast': 3.0.4 - '@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 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 - parse5: 7.3.0 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - - hast-util-to-jsx-runtime@2.3.6: - dependencies: - '@types/estree': 1.0.8 - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.2.0 - mdast-util-mdxjs-esm: 2.0.1 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 - style-to-js: 1.1.17 - unist-util-position: 5.0.0 - vfile-message: 4.0.2 - transitivePeerDependencies: - - supports-color - - hast-util-to-parse5@6.0.0: - dependencies: - hast-to-hyperscript: 9.0.1 - property-information: 5.6.0 - web-namespaces: 1.1.4 - xtend: 4.0.2 - zwitch: 1.0.5 - - hast-util-to-parse5@7.1.0: - dependencies: - '@types/hast': 2.3.10 - comma-separated-tokens: 2.0.3 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - - hast-util-to-parse5@8.0.0: - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - - hast-util-whitespace@2.0.1: {} - - hast-util-whitespace@3.0.0: - dependencies: - '@types/hast': 3.0.4 - - hastscript@6.0.0: - dependencies: - '@types/hast': 2.3.10 - comma-separated-tokens: 1.0.8 - hast-util-parse-selector: 2.2.5 - property-information: 5.6.0 - space-separated-tokens: 1.1.5 - - hastscript@7.2.0: - dependencies: - '@types/hast': 2.3.10 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 3.1.1 - property-information: 6.5.0 - space-separated-tokens: 2.0.2 - - hastscript@9.0.1: - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 4.0.0 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 - - he@1.2.0: {} - - heap@0.2.5: {} - - hey-listen@1.0.8: {} - - highlight.js@10.7.3: {} - - highlight.js@11.11.1: {} - - highlightjs-vue@1.0.0: {} - - hoist-non-react-statics@3.3.2: - dependencies: - react-is: 16.13.1 - - home-or-tmp@2.0.0: - dependencies: - os-homedir: 1.0.2 - os-tmpdir: 1.0.2 - - homedir-polyfill@1.0.3: - dependencies: - parse-passwd: 1.0.0 - - hookified@1.9.1: {} - - hosted-git-info@2.8.9: {} - - hosted-git-info@4.1.0: - dependencies: - lru-cache: 6.0.0 - - hosted-git-info@7.0.2: - dependencies: - lru-cache: 10.4.3 - - hpack.js@2.1.6: - dependencies: - inherits: 2.0.4 - obuf: 1.1.2 - readable-stream: 2.3.8 - wbuf: 1.7.3 - - hpagent@1.2.0: {} - - html-comment-regex@1.1.2: {} - - html-encoding-sniffer@1.0.2: - dependencies: - whatwg-encoding: 1.0.5 - - html-encoding-sniffer@3.0.0: - dependencies: - whatwg-encoding: 2.0.0 - - html-entities@2.6.0: {} - - html-escaper@2.0.2: {} - - html-minifier-terser@5.1.1: - dependencies: - camel-case: 4.1.2 - clean-css: 4.2.4 - commander: 4.1.1 - he: 1.2.0 - param-case: 3.0.4 - relateurl: 0.2.7 - terser: 4.8.1 - - html-minifier-terser@6.1.0: - dependencies: - camel-case: 4.1.2 - clean-css: 5.3.3 - commander: 8.3.0 - he: 1.2.0 - param-case: 3.0.4 - relateurl: 0.2.7 - terser: 5.43.1 - - html-minifier@3.5.21: - dependencies: - camel-case: 3.0.0 - clean-css: 4.2.4 - commander: 2.17.1 - he: 1.2.0 - param-case: 2.1.1 - relateurl: 0.2.7 - uglify-js: 3.4.10 - - html-tags@3.3.1: {} - - html-to-image@1.11.11: {} - - html-to-image@1.11.13: {} - - html-url-attributes@3.0.1: {} - - html-void-elements@1.0.5: {} - - html-void-elements@2.0.1: {} - - html-void-elements@3.0.0: {} - - html-webpack-plugin@2.29.0(webpack@5.100.2): - dependencies: - bluebird: 3.7.2 - html-minifier: 3.5.21 - loader-utils: 0.2.17 - lodash: 4.17.21 - pretty-error: 2.1.2 - toposort: 1.0.7 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - - html-webpack-plugin@4.5.2(webpack@5.100.2): - 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 - pretty-error: 2.1.2 - tapable: 1.1.3 - util.promisify: 1.0.0 - webpack: 5.100.2(webpack-cli@4.10.0) - - html-webpack-plugin@5.6.3(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)): - dependencies: - '@types/html-minifier-terser': 6.1.0 - html-minifier-terser: 6.1.0 - lodash: 4.17.21 - pretty-error: 4.0.0 - tapable: 2.2.2 - optionalDependencies: - webpack: 5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6) - - html-webpack-plugin@5.6.3(webpack@5.100.2): - dependencies: - '@types/html-minifier-terser': 6.1.0 - html-minifier-terser: 6.1.0 - lodash: 4.17.21 - pretty-error: 4.0.0 - tapable: 2.2.2 - optionalDependencies: - webpack: 5.100.2(webpack-cli@4.10.0) - - htmlparser2@10.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - entities: 6.0.1 - - htmlparser2@6.1.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - domutils: 2.8.0 - entities: 2.2.0 - - http-cache-semantics@4.2.0: {} - - http-deceiver@1.2.7: {} - - http-errors@1.6.3: - 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 - toidentifier: 1.0.1 - - http-parser-js@0.5.10: {} - - http-proxy-agent@4.0.1: - dependencies: - '@tootallnate/once': 1.1.2 - agent-base: 6.0.2 - debug: 4.4.1(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - http-proxy-agent@5.0.0: - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.4.1(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.3 - debug: 4.4.1(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - http-proxy-middleware@2.0.9(@types/express@4.17.23): - dependencies: - '@types/http-proxy': 1.17.16 - http-proxy: 1.18.1 - is-glob: 4.0.3 - is-plain-obj: 3.0.0 - micromatch: 4.0.8 - optionalDependencies: - '@types/express': 4.17.23 - transitivePeerDependencies: - - debug - - http-proxy@1.18.1: - dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.15.9 - requires-port: 1.0.0 - transitivePeerDependencies: - - debug - - http-server@14.1.1: - dependencies: - basic-auth: 2.0.1 - chalk: 4.1.2 - corser: 2.0.1 - he: 1.2.0 - html-encoding-sniffer: 3.0.0 - http-proxy: 1.18.1 - mime: 1.6.0 - minimist: 1.2.8 - opener: 1.5.2 - portfinder: 1.0.37 - secure-compare: 3.0.1 - union: 0.5.0 - url-join: 4.0.1 - transitivePeerDependencies: - - debug - - supports-color - - http-signature@1.2.0: - dependencies: - assert-plus: 1.0.0 - jsprim: 1.4.2 - sshpk: 1.18.0 - - http2-wrapper@2.2.1: - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - - https-proxy-agent@4.0.0: - dependencies: - agent-base: 5.1.1 - debug: 4.4.1(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.4.1(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - https-proxy-agent@7.0.6: - dependencies: - agent-base: 7.1.3 - debug: 4.4.1(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - human-signals@1.1.1: {} - - human-signals@2.1.0: {} - - human-signals@5.0.0: {} - - humanize-duration@3.33.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - husky@9.1.7: {} - - hyperdyperid@1.2.0: {} - - icon-font-generator@2.1.11: - dependencies: - colors: 1.4.0 - glob: 7.2.3 - minimist: 1.2.8 - webfonts-generator: 0.4.0 - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - - icss-replace-symbols@1.1.0: {} - - icss-utils@2.1.0: - dependencies: - postcss: 6.0.23 - - icss-utils@4.1.1: - dependencies: - postcss: 7.0.39 - - icss-utils@5.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - - identity-obj-proxy@3.0.0: - dependencies: - harmony-reflect: 1.6.2 - - ieee754@1.2.1: {} - - iferr@0.1.5: {} - - ignore@4.0.6: {} - - ignore@5.3.2: {} - - ignore@7.0.5: {} - - immediate@3.0.6: {} - - immer@9.0.21: - optional: true - - immutable@3.8.2: {} - - immutable@5.1.3: {} - - import-cwd@3.0.0: - dependencies: - import-from: 3.0.0 - - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - import-from@3.0.0: - dependencies: - resolve-from: 5.0.0 - - import-lazy@2.1.0: {} - - import-local@3.2.0: - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - - imurmurhash@0.1.4: {} - - indent-string@2.1.0: - dependencies: - repeating: 2.0.1 - - indent-string@4.0.0: {} - - indent-string@5.0.0: {} - - indexes-of@1.0.1: {} - - infer-owner@1.0.4: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.3: {} - - inherits@2.0.4: {} - - ini@1.3.8: {} - - inline-style-parser@0.1.1: {} - - inline-style-parser@0.2.4: {} - - inquirer@3.3.0: - dependencies: - ansi-escapes: 3.2.0 - chalk: 2.4.2 - cli-cursor: 2.1.0 - cli-width: 2.2.1 - external-editor: 2.2.0 - figures: 2.0.0 - lodash: 4.17.21 - mute-stream: 0.0.7 - run-async: 2.4.1 - rx-lite: 4.0.8 - rx-lite-aggregates: 4.0.8 - string-width: 2.1.1 - 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 - hasown: 2.0.2 - side-channel: 1.1.0 - - interpret@1.4.0: {} - - interpret@2.2.0: {} - - interpret@3.1.1: {} - - intl-messageformat@10.7.16: - dependencies: - '@formatjs/ecma402-abstract': 2.3.4 - '@formatjs/fast-memoize': 2.2.7 - '@formatjs/icu-messageformat-parser': 2.11.2 - tslib: 2.8.1 - - invariant@2.2.4: - dependencies: - loose-envify: 1.4.0 - - invert-kv@1.0.0: {} - - ip-address@9.0.5: - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 - - ip-regex@2.1.0: {} - - ip-regex@4.3.0: {} - - ip@2.0.1: {} - - ipaddr.js@1.9.1: {} - - ipaddr.js@2.2.0: {} - - is-absolute-url@2.1.0: {} - - is-absolute-url@3.0.3: {} - - is-alphabetical@1.0.4: {} - - is-alphabetical@2.0.1: {} - - is-alphanumerical@1.0.4: - dependencies: - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 - - is-alphanumerical@2.0.1: - dependencies: - is-alphabetical: 2.0.1 - is-decimal: 2.0.1 - - is-arguments@1.2.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-array-buffer@3.0.5: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - - is-arrayish@0.2.1: {} - - is-arrayish@0.3.2: {} - - is-async-function@2.1.1: - dependencies: - async-function: 1.0.0 - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-bigint@1.1.0: - dependencies: - has-bigints: 1.1.0 - - is-binary-path@1.0.1: - dependencies: - binary-extensions: 1.13.1 - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-boolean-object@1.2.2: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-buffer@2.0.5: {} - - is-builtin-module@1.0.0: - dependencies: - builtin-modules: 1.1.1 - - is-callable@1.2.7: {} - - is-ci@1.2.1: - dependencies: - ci-info: 1.6.0 - - is-ci@2.0.0: - dependencies: - ci-info: 2.0.0 - - is-core-module@2.16.1: - dependencies: - hasown: 2.0.2 - - is-data-view@1.0.2: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-typed-array: 1.1.15 - - is-date-object@1.1.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-decimal@1.0.4: {} - - is-decimal@2.0.1: {} - - is-deflate@1.0.0: {} - - is-directory@0.3.1: {} - - is-docker@2.2.1: {} - - is-docker@3.0.0: {} - - is-dom@1.1.0: - dependencies: - is-object: 1.0.2 - is-window: 1.0.2 - - is-extendable@1.0.1: - dependencies: - is-plain-object: 2.0.4 - - is-extglob@1.0.0: {} - - is-extglob@2.1.1: {} - - is-finalizationregistry@1.1.1: - dependencies: - call-bound: 1.0.4 - - is-finite@1.1.0: {} - - is-fullwidth-code-point@1.0.0: - dependencies: - number-is-nan: 1.0.1 - - is-fullwidth-code-point@2.0.0: {} - - is-fullwidth-code-point@3.0.0: {} - - is-fullwidth-code-point@4.0.0: {} - - is-fullwidth-code-point@5.0.0: - dependencies: - get-east-asian-width: 1.3.0 - - is-function@1.0.2: {} - - is-generator-fn@1.0.0: {} - - is-generator-fn@2.1.0: {} - - is-generator-function@1.1.0: - dependencies: - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-glob@2.0.1: - dependencies: - is-extglob: 1.0.0 - - is-glob@3.1.0: - dependencies: - is-extglob: 2.1.1 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-gzip@1.0.0: {} - - is-hexadecimal@1.0.4: {} - - is-hexadecimal@2.0.1: {} - - is-inside-container@1.0.0: - dependencies: - is-docker: 3.0.0 - - is-installed-globally@0.1.0: - dependencies: - global-dirs: 0.1.1 - is-path-inside: 1.0.1 - - is-interactive@1.0.0: {} - - is-interactive@2.0.0: {} - - is-lambda@1.0.1: {} - - is-map@2.0.3: {} - - is-module@1.0.0: {} - - is-negative-zero@2.0.3: {} - - is-network-error@1.1.0: {} - - is-npm@1.0.0: {} - - is-number-object@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-number@7.0.0: {} - - is-obj@1.0.1: {} - - is-object@1.0.2: {} - - is-path-cwd@1.0.0: {} - - is-path-cwd@2.2.0: {} - - is-path-cwd@3.0.0: {} - - is-path-in-cwd@1.0.1: - dependencies: - is-path-inside: 1.0.1 - - is-path-inside@1.0.1: - dependencies: - path-is-inside: 1.0.2 - - is-path-inside@3.0.3: {} - - is-path-inside@4.0.0: {} - - is-plain-obj@1.1.0: {} - - is-plain-obj@2.1.0: {} - - is-plain-obj@3.0.0: {} - - is-plain-obj@4.1.0: {} - - is-plain-object@2.0.4: - dependencies: - isobject: 3.0.1 - - is-plain-object@5.0.0: {} - - is-potential-custom-element-name@1.0.1: {} - - is-primitive@3.0.1: {} - - is-promise@2.2.2: {} - - is-promise@4.0.0: {} - - is-redirect@1.0.0: {} - - is-reference@1.2.1: - dependencies: - '@types/estree': 1.0.8 - - is-regex@1.2.1: - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - is-retry-allowed@1.2.0: {} - - is-root@1.0.0: {} - - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.4: - dependencies: - call-bound: 1.0.4 - - is-stream@1.1.0: {} - - is-stream@2.0.1: {} - - is-stream@3.0.0: {} - - is-stream@4.0.1: {} - - is-string@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-svg@2.1.0: - dependencies: - html-comment-regex: 1.1.2 - - is-symbol@1.1.1: - dependencies: - call-bound: 1.0.4 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 - - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.19 - - is-typedarray@1.0.0: {} - - is-unicode-supported@0.1.0: {} - - is-unicode-supported@1.3.0: {} - - is-unicode-supported@2.1.0: {} - - is-url@1.2.4: {} - - is-utf8@0.2.1: {} - - is-weakmap@2.0.2: {} - - is-weakref@1.1.1: - dependencies: - call-bound: 1.0.4 - - is-weakset@2.0.4: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - - is-whitespace-character@1.0.4: {} - - is-window@1.0.2: {} - - is-windows@1.0.2: {} - - is-word-character@1.0.4: {} - - is-wsl@1.1.0: {} - - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - - is-wsl@3.1.0: - dependencies: - is-inside-container: 1.0.0 - - is2@2.0.9: - dependencies: - deep-is: 0.1.4 - ip-regex: 4.3.0 - is-url: 1.2.4 - - is64bit@2.0.0: - dependencies: - system-architecture: 0.1.0 - - isarray@0.0.1: {} - - isarray@1.0.0: {} - - isarray@2.0.5: {} - - isexe@2.0.0: {} - - isexe@3.1.1: {} - - isobject@3.0.1: {} - - isobject@4.0.0: {} - - isomorphic-unfetch@3.1.0(encoding@0.1.13): - dependencies: - node-fetch: 2.7.0(encoding@0.1.13) - unfetch: 4.2.0 - transitivePeerDependencies: - - encoding - - isomorphic-ws@5.0.0(ws@8.18.3): - dependencies: - ws: 8.18.3 - - isstream@0.1.2: {} - - istanbul-api@1.3.7: - dependencies: - async: 2.6.4 - fileset: 2.0.3 - istanbul-lib-coverage: 1.2.1 - istanbul-lib-hook: 1.2.2 - istanbul-lib-instrument: 1.10.2 - istanbul-lib-report: 1.1.5 - istanbul-lib-source-maps: 1.2.6 - istanbul-reports: 1.5.1 - js-yaml: 3.14.1 - mkdirp: 0.5.6 - once: 1.4.0 - transitivePeerDependencies: - - supports-color - - istanbul-lib-coverage@1.2.1: {} - - istanbul-lib-coverage@3.2.2: {} - - istanbul-lib-hook@1.2.2: - dependencies: - append-transform: 0.4.0 - - istanbul-lib-instrument@1.10.2: - dependencies: - babel-generator: 6.26.1 - babel-template: 6.26.0 - babel-traverse: 6.26.0 - babel-types: 6.26.0 - babylon: 6.18.0 - istanbul-lib-coverage: 1.2.1 - semver: 5.7.2 - transitivePeerDependencies: - - supports-color - - istanbul-lib-instrument@4.0.3: - dependencies: - '@babel/core': 7.27.4 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - istanbul-lib-instrument@5.2.1: - dependencies: - '@babel/core': 7.27.4 - '@babel/parser': 7.28.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - istanbul-lib-instrument@6.0.3: - dependencies: - '@babel/core': 7.27.4 - '@babel/parser': 7.28.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 7.7.2 - transitivePeerDependencies: - - supports-color - - istanbul-lib-report@1.1.5: - dependencies: - istanbul-lib-coverage: 1.2.1 - mkdirp: 0.5.6 - path-parse: 1.0.7 - supports-color: 3.2.3 - - istanbul-lib-report@3.0.1: - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - - istanbul-lib-source-maps@1.2.6: - dependencies: - debug: 3.2.7 - istanbul-lib-coverage: 1.2.1 - mkdirp: 0.5.6 - rimraf: 2.7.1 - source-map: 0.5.7 - transitivePeerDependencies: - - supports-color - - istanbul-lib-source-maps@4.0.1: - dependencies: - debug: 4.4.1(supports-color@8.1.1) - istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - - istanbul-reports@1.5.1: - dependencies: - handlebars: 4.7.8 - - istanbul-reports@3.1.7: - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - - istanbul@0.4.5: - dependencies: - abbrev: 1.0.9 - async: 1.5.2 - escodegen: 1.8.1 - esprima: 2.7.3 - glob: 5.0.15 - handlebars: 4.7.8 - js-yaml: 3.14.1 - mkdirp: 0.5.6 - nopt: 3.0.6 - once: 1.4.0 - resolve: 1.1.7 - supports-color: 3.2.3 - which: 1.3.1 - wordwrap: 1.0.0 - - istextorbinary@9.5.0: - dependencies: - binaryextensions: 6.11.0 - editions: 6.21.0 - textextensions: 6.11.0 - - iterate-iterator@1.0.2: {} - - iterate-value@1.0.2: - dependencies: - es-get-iterator: 1.1.3 - iterate-iterator: 1.0.2 - - iterator.prototype@1.1.5: - dependencies: - define-data-property: 1.1.4 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - has-symbols: 1.1.0 - set-function-name: 2.0.2 - - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jackspeak@4.1.1: - dependencies: - '@isaacs/cliui': 8.0.2 - - jake@10.9.2: - dependencies: - async: 3.2.6 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 - - jest-changed-files@20.0.3: {} - - jest-changed-files@25.5.0: - dependencies: - '@jest/types': 25.5.0 - execa: 3.4.0 - throat: 5.0.0 - - jest-changed-files@29.7.0: - dependencies: - execa: 5.1.1 - jest-util: 29.7.0 - p-limit: 3.1.0 - - jest-circus@29.7.0(babel-plugin-macros@3.1.0): - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.15.32 - chalk: 4.1.2 - co: 4.6.0 - dedent: 1.6.0(babel-plugin-macros@3.1.0) - is-generator-fn: 2.1.0 - jest-each: 29.7.0 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - p-limit: 3.1.0 - pretty-format: 29.7.0 - pure-rand: 6.1.0 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-cli@20.0.4: - dependencies: - ansi-escapes: 1.4.0 - callsites: 2.0.0 - chalk: 1.1.3 - graceful-fs: 4.2.11 - is-ci: 1.2.1 - istanbul-api: 1.3.7 - istanbul-lib-coverage: 1.2.1 - istanbul-lib-instrument: 1.10.2 - istanbul-lib-source-maps: 1.2.6 - jest-changed-files: 20.0.3 - jest-config: 20.0.4 - jest-docblock: 20.0.3 - jest-environment-jsdom: 20.0.3 - jest-haste-map: 20.0.5 - jest-jasmine2: 20.0.4 - jest-message-util: 20.0.3 - jest-regex-util: 20.0.3 - jest-resolve-dependencies: 20.0.3 - jest-runtime: 20.0.4 - jest-snapshot: 20.0.3 - jest-util: 20.0.3 - micromatch: 4.0.8 - node-notifier: 5.4.5 - pify: 2.3.0 - slash: 1.0.0 - string-length: 1.0.1 - throat: 3.2.0 - which: 1.3.1 - worker-farm: 1.7.0 - yargs: 7.1.2 - transitivePeerDependencies: - - supports-color - - jest-cli@25.5.4: - dependencies: - '@jest/core': 25.5.4 - '@jest/test-result': 25.5.0 - '@jest/types': 25.5.0 - chalk: 3.0.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - import-local: 3.2.0 - is-ci: 2.0.0 - jest-config: 25.5.4 - jest-util: 25.5.0 - jest-validate: 25.5.0 - prompts: 2.4.2 - realpath-native: 2.0.0 - yargs: 15.4.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - - jest-cli@29.7.0(@types/node@22.15.32)(babel-plugin-macros@3.1.0): - dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.15.32)(babel-plugin-macros@3.1.0) - exit: 0.1.2 - import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.15.32)(babel-plugin-macros@3.1.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest-config@20.0.4: - dependencies: - chalk: 1.1.3 - glob: 7.2.3 - jest-environment-jsdom: 20.0.3 - jest-environment-node: 20.0.3 - jest-jasmine2: 20.0.4 - jest-matcher-utils: 20.0.3 - jest-regex-util: 20.0.3 - jest-resolve: 20.0.4 - jest-validate: 20.0.3 - pretty-format: 20.0.3 - - jest-config@22.4.4: - dependencies: - chalk: 2.4.2 - glob: 7.2.3 - jest-environment-jsdom: 22.4.3 - jest-environment-node: 22.4.3 - jest-get-type: 22.4.3 - jest-jasmine2: 22.4.4 - jest-regex-util: 22.4.3 - jest-resolve: 22.4.3 - jest-util: 22.4.3 - jest-validate: 22.4.4 - pretty-format: 22.4.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - jest-config@25.5.4: - dependencies: - '@babel/core': 7.27.4 - '@jest/test-sequencer': 25.5.4 - '@jest/types': 25.5.0 - babel-jest: 25.5.1(@babel/core@7.27.4) - chalk: 3.0.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-environment-jsdom: 25.5.0 - jest-environment-node: 25.5.0 - jest-get-type: 25.2.6 - jest-jasmine2: 25.5.4 - jest-regex-util: 25.2.6 - jest-resolve: 25.5.1 - jest-util: 25.5.0 - jest-validate: 25.5.0 - micromatch: 4.0.8 - pretty-format: 25.5.0 - realpath-native: 2.0.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - - jest-config@29.7.0(@types/node@22.15.32)(babel-plugin-macros@3.1.0): - dependencies: - '@babel/core': 7.27.4 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.27.4) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0(babel-plugin-macros@3.1.0) - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 22.15.32 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-diff@20.0.3: - dependencies: - chalk: 1.1.3 - diff: 3.5.0 - 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 - jest-get-type: 22.4.3 - pretty-format: 22.4.3 - - jest-diff@25.5.0: - dependencies: - chalk: 3.0.0 - diff-sequences: 25.2.6 - jest-get-type: 25.2.6 - pretty-format: 25.5.0 - - jest-diff@29.7.0: - dependencies: - chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - - jest-docblock@20.0.3: {} - - jest-docblock@25.3.0: - dependencies: - detect-newline: 3.1.0 - - jest-docblock@29.7.0: - dependencies: - detect-newline: 3.1.0 - - jest-each@25.5.0: - dependencies: - '@jest/types': 25.5.0 - chalk: 3.0.0 - jest-get-type: 25.2.6 - jest-util: 25.5.0 - pretty-format: 25.5.0 - - jest-each@29.7.0: - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - jest-get-type: 29.6.3 - jest-util: 29.7.0 - pretty-format: 29.7.0 - - jest-environment-jsdom@20.0.3: - dependencies: - jest-mock: 20.0.3 - jest-util: 20.0.3 - jsdom: 9.12.0 - - jest-environment-jsdom@22.4.3: - dependencies: - jest-mock: 22.4.3 - jest-util: 22.4.3 - jsdom: 11.12.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - jest-environment-jsdom@25.5.0: - dependencies: - '@jest/environment': 25.5.0 - '@jest/fake-timers': 25.5.0 - '@jest/types': 25.5.0 - jest-mock: 25.5.0 - jest-util: 25.5.0 - jsdom: 15.2.1 - transitivePeerDependencies: - - bufferutil - - canvas - - utf-8-validate - - jest-environment-jsdom@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/jsdom': 20.0.1 - '@types/node': 22.15.32 - jest-mock: 29.7.0 - jest-util: 29.7.0 - jsdom: 20.0.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - jest-environment-node@20.0.3: - dependencies: - jest-mock: 20.0.3 - jest-util: 20.0.3 - - jest-environment-node@22.4.3: - dependencies: - jest-mock: 22.4.3 - jest-util: 22.4.3 - - jest-environment-node@25.5.0: - dependencies: - '@jest/environment': 25.5.0 - '@jest/fake-timers': 25.5.0 - '@jest/types': 25.5.0 - jest-mock: 25.5.0 - jest-util: 25.5.0 - semver: 6.3.1 - - jest-environment-node@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.15.32 - jest-mock: 29.7.0 - jest-util: 29.7.0 - - jest-get-type@22.4.3: {} - - jest-get-type@25.2.6: {} - - jest-get-type@29.6.3: {} - - jest-haste-map@20.0.5: - dependencies: - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-docblock: 20.0.3 - micromatch: 4.0.8 - sane: 1.6.0 - worker-farm: 1.7.0 - - jest-haste-map@25.5.1: - dependencies: - '@jest/types': 25.5.0 - '@types/graceful-fs': 4.1.9 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-serializer: 25.5.0 - jest-util: 25.5.0 - jest-worker: 25.5.0 - micromatch: 4.0.8 - sane: 4.1.0 - walker: 1.0.8 - which: 2.0.2 - optionalDependencies: - fsevents: 2.3.3 - - jest-haste-map@26.6.2: - dependencies: - '@jest/types': 26.6.2 - '@types/graceful-fs': 4.1.9 - '@types/node': 22.15.32 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 26.0.0 - jest-serializer: 26.6.2 - jest-util: 26.6.2 - jest-worker: 26.6.2 - micromatch: 4.0.8 - sane: 4.1.0 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - - jest-haste-map@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.9 - '@types/node': 22.15.32 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - jest-worker: 29.7.0 - micromatch: 4.0.8 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - - jest-jasmine2@20.0.4: - dependencies: - chalk: 1.1.3 - graceful-fs: 4.2.11 - jest-diff: 20.0.3 - jest-matcher-utils: 20.0.3 - jest-matchers: 20.0.3 - jest-message-util: 20.0.3 - jest-snapshot: 20.0.3 - once: 1.4.0 - p-map: 1.2.0 - - jest-jasmine2@22.4.4: - dependencies: - chalk: 2.4.2 - co: 4.6.0 - expect: 22.4.3 - graceful-fs: 4.2.11 - is-generator-fn: 1.0.0 - jest-diff: 22.4.3 - jest-matcher-utils: 22.4.3 - jest-message-util: 22.4.3 - jest-snapshot: 22.4.3 - jest-util: 22.4.3 - source-map-support: 0.5.21 - - jest-jasmine2@25.5.4: - dependencies: - '@babel/traverse': 7.27.4 - '@jest/environment': 25.5.0 - '@jest/source-map': 25.5.0 - '@jest/test-result': 25.5.0 - '@jest/types': 25.5.0 - chalk: 3.0.0 - co: 4.6.0 - expect: 25.5.0 - is-generator-fn: 2.1.0 - jest-each: 25.5.0 - jest-matcher-utils: 25.5.0 - jest-message-util: 25.5.0 - jest-runtime: 25.5.4 - jest-snapshot: 25.5.1 - jest-util: 25.5.0 - pretty-format: 25.5.0 - throat: 5.0.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - - jest-leak-detector@25.5.0: - dependencies: - jest-get-type: 25.2.6 - pretty-format: 25.5.0 - - jest-leak-detector@29.7.0: - dependencies: - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - - jest-matcher-utils@20.0.3: - dependencies: - chalk: 1.1.3 - pretty-format: 20.0.3 - - jest-matcher-utils@22.4.3: - dependencies: - chalk: 2.4.2 - jest-get-type: 22.4.3 - pretty-format: 22.4.3 - - jest-matcher-utils@25.5.0: - dependencies: - chalk: 3.0.0 - jest-diff: 25.5.0 - jest-get-type: 25.2.6 - pretty-format: 25.5.0 - - jest-matcher-utils@29.7.0: - dependencies: - chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - - jest-matchers@20.0.3: - dependencies: - jest-diff: 20.0.3 - jest-matcher-utils: 20.0.3 - jest-message-util: 20.0.3 - jest-regex-util: 20.0.3 - - jest-message-util@20.0.3: - dependencies: - chalk: 1.1.3 - micromatch: 4.0.8 - slash: 1.0.0 - - jest-message-util@22.4.3: - dependencies: - '@babel/code-frame': 7.27.1 - chalk: 2.4.2 - micromatch: 4.0.8 - slash: 1.0.0 - stack-utils: 1.0.5 - - jest-message-util@25.5.0: - dependencies: - '@babel/code-frame': 7.27.1 - '@jest/types': 25.5.0 - '@types/stack-utils': 1.0.1 - chalk: 3.0.0 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - slash: 3.0.0 - stack-utils: 1.0.5 - - jest-message-util@29.7.0: - dependencies: - '@babel/code-frame': 7.27.1 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - stack-utils: 2.0.6 - - jest-mock@20.0.3: {} - - jest-mock@22.4.3: {} - - jest-mock@25.5.0: - dependencies: - '@jest/types': 25.5.0 - - jest-mock@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/node': 22.15.32 - jest-util: 29.7.0 - - jest-pnp-resolver@1.2.3(jest-resolve@25.5.1): - optionalDependencies: - jest-resolve: 25.5.1 - - jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - optionalDependencies: - jest-resolve: 29.7.0 - - jest-regex-util@20.0.3: {} - - jest-regex-util@22.4.3: {} - - jest-regex-util@25.2.6: {} - - jest-regex-util@26.0.0: {} - - jest-regex-util@29.6.3: {} - - jest-resolve-dependencies@20.0.3: - dependencies: - jest-regex-util: 20.0.3 - - jest-resolve-dependencies@25.5.4: - dependencies: - '@jest/types': 25.5.0 - jest-regex-util: 25.2.6 - jest-snapshot: 25.5.1 - - jest-resolve-dependencies@29.7.0: - dependencies: - jest-regex-util: 29.6.3 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - - jest-resolve@20.0.4: - dependencies: - browser-resolve: 1.11.3 - is-builtin-module: 1.0.0 - resolve: 1.6.0 - - jest-resolve@22.4.3: - dependencies: - browser-resolve: 1.11.3 - chalk: 2.4.2 - - jest-resolve@25.5.1: - dependencies: - '@jest/types': 25.5.0 - browser-resolve: 1.11.3 - chalk: 3.0.0 - graceful-fs: 4.2.11 - jest-pnp-resolver: 1.2.3(jest-resolve@25.5.1) - read-pkg-up: 7.0.1 - realpath-native: 2.0.0 - resolve: 1.22.10 - slash: 3.0.0 - - jest-resolve@29.7.0: - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - resolve: 1.22.10 - resolve.exports: 2.0.3 - slash: 3.0.0 - - jest-runner@25.5.4: - dependencies: - '@jest/console': 25.5.0 - '@jest/environment': 25.5.0 - '@jest/test-result': 25.5.0 - '@jest/types': 25.5.0 - chalk: 3.0.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 25.5.4 - jest-docblock: 25.3.0 - jest-haste-map: 25.5.1 - jest-jasmine2: 25.5.4 - jest-leak-detector: 25.5.0 - jest-message-util: 25.5.0 - jest-resolve: 25.5.1 - jest-runtime: 25.5.4 - jest-util: 25.5.0 - jest-worker: 25.5.0 - source-map-support: 0.5.21 - throat: 5.0.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - - jest-runner@29.7.0: - dependencies: - '@jest/console': 29.7.0 - '@jest/environment': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.15.32 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.11 - jest-docblock: 29.7.0 - jest-environment-node: 29.7.0 - jest-haste-map: 29.7.0 - jest-leak-detector: 29.7.0 - jest-message-util: 29.7.0 - jest-resolve: 29.7.0 - jest-runtime: 29.7.0 - jest-util: 29.7.0 - jest-watcher: 29.7.0 - jest-worker: 29.7.0 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - - jest-runtime@20.0.4: - dependencies: - babel-core: 6.26.3 - babel-jest: 20.0.3 - babel-plugin-istanbul: 4.1.6 - chalk: 1.1.3 - convert-source-map: 1.9.0 - graceful-fs: 4.2.11 - jest-config: 20.0.4 - jest-haste-map: 20.0.5 - jest-regex-util: 20.0.3 - jest-resolve: 20.0.4 - jest-util: 20.0.3 - json-stable-stringify: 1.3.0 - micromatch: 4.0.8 - strip-bom: 3.0.0 - yargs: 7.1.2 - transitivePeerDependencies: - - supports-color - - jest-runtime@25.5.4: - dependencies: - '@jest/console': 25.5.0 - '@jest/environment': 25.5.0 - '@jest/globals': 25.5.2 - '@jest/source-map': 25.5.0 - '@jest/test-result': 25.5.0 - '@jest/transform': 25.5.1 - '@jest/types': 25.5.0 - '@types/yargs': 15.0.19 - chalk: 3.0.0 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-config: 25.5.4 - jest-haste-map: 25.5.1 - jest-message-util: 25.5.0 - jest-mock: 25.5.0 - jest-regex-util: 25.2.6 - jest-resolve: 25.5.1 - jest-snapshot: 25.5.1 - jest-util: 25.5.0 - jest-validate: 25.5.0 - realpath-native: 2.0.0 - slash: 3.0.0 - strip-bom: 4.0.0 - yargs: 15.4.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - - jest-runtime@29.7.0: - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0 - '@jest/source-map': 29.6.3 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.15.32 - chalk: 4.1.2 - cjs-module-lexer: 1.4.3 - collect-v8-coverage: 1.0.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - - jest-serializer@25.5.0: - dependencies: - graceful-fs: 4.2.11 - - jest-serializer@26.6.2: - dependencies: - '@types/node': 22.15.32 - graceful-fs: 4.2.11 - - jest-snapshot@20.0.3: - dependencies: - chalk: 1.1.3 - jest-diff: 20.0.3 - jest-matcher-utils: 20.0.3 - jest-util: 20.0.3 - natural-compare: 1.4.0 - pretty-format: 20.0.3 - - jest-snapshot@22.4.3: - dependencies: - chalk: 2.4.2 - jest-diff: 22.4.3 - jest-matcher-utils: 22.4.3 - mkdirp: 0.5.6 - natural-compare: 1.4.0 - pretty-format: 22.4.3 - - jest-snapshot@25.5.1: - dependencies: - '@babel/types': 7.28.1 - '@jest/types': 25.5.0 - '@types/prettier': 1.19.1 - chalk: 3.0.0 - expect: 25.5.0 - graceful-fs: 4.2.11 - jest-diff: 25.5.0 - jest-get-type: 25.2.6 - jest-matcher-utils: 25.5.0 - jest-message-util: 25.5.0 - jest-resolve: 25.5.1 - make-dir: 3.1.0 - natural-compare: 1.4.0 - pretty-format: 25.5.0 - semver: 6.3.1 - - jest-snapshot@29.7.0: - dependencies: - '@babel/core': 7.27.4 - '@babel/generator': 7.27.5 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.4) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.4) - '@babel/types': 7.28.1 - '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.27.4) - chalk: 4.1.2 - expect: 29.7.0 - graceful-fs: 4.2.11 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - natural-compare: 1.4.0 - pretty-format: 29.7.0 - semver: 7.7.2 - transitivePeerDependencies: - - supports-color - - jest-util@20.0.3: - dependencies: - chalk: 1.1.3 - graceful-fs: 4.2.11 - jest-message-util: 20.0.3 - jest-mock: 20.0.3 - jest-validate: 20.0.3 - leven: 2.1.0 - mkdirp: 0.5.6 - - jest-util@22.4.3: - dependencies: - callsites: 2.0.0 - chalk: 2.4.2 - graceful-fs: 4.2.11 - is-ci: 1.2.1 - jest-message-util: 22.4.3 - mkdirp: 0.5.6 - source-map: 0.6.1 - - jest-util@25.5.0: - dependencies: - '@jest/types': 25.5.0 - chalk: 3.0.0 - graceful-fs: 4.2.11 - is-ci: 2.0.0 - make-dir: 3.1.0 - - jest-util@26.6.2: - dependencies: - '@jest/types': 26.6.2 - '@types/node': 22.15.32 - chalk: 4.1.2 - graceful-fs: 4.2.11 - is-ci: 2.0.0 - micromatch: 4.0.8 - - jest-util@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/node': 22.15.32 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - - jest-validate@20.0.3: - dependencies: - chalk: 1.1.3 - jest-matcher-utils: 20.0.3 - leven: 2.1.0 - pretty-format: 20.0.3 - - jest-validate@22.4.4: - dependencies: - chalk: 2.4.2 - jest-config: 22.4.4 - jest-get-type: 22.4.3 - leven: 2.1.0 - pretty-format: 22.4.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - jest-validate@25.5.0: - dependencies: - '@jest/types': 25.5.0 - camelcase: 5.3.1 - chalk: 3.0.0 - jest-get-type: 25.2.6 - leven: 3.1.0 - pretty-format: 25.5.0 - - jest-validate@29.7.0: - dependencies: - '@jest/types': 29.6.3 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.6.3 - leven: 3.1.0 - pretty-format: 29.7.0 - - jest-watch-typeahead@0.5.0: - dependencies: - ansi-escapes: 4.3.2 - chalk: 3.0.0 - jest-regex-util: 25.2.6 - jest-watcher: 25.5.0 - slash: 3.0.0 - string-length: 3.1.0 - strip-ansi: 6.0.1 - - jest-watcher@25.5.0: - dependencies: - '@jest/test-result': 25.5.0 - '@jest/types': 25.5.0 - ansi-escapes: 4.3.2 - chalk: 3.0.0 - jest-util: 25.5.0 - string-length: 3.1.0 - - jest-watcher@29.7.0: - dependencies: - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 22.15.32 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.7.0 - string-length: 4.0.2 - - jest-worker@24.9.0: - dependencies: - merge-stream: 2.0.0 - supports-color: 6.1.0 - - jest-worker@25.5.0: - dependencies: - merge-stream: 2.0.0 - supports-color: 7.2.0 - - jest-worker@26.6.2: - dependencies: - '@types/node': 22.15.32 - merge-stream: 2.0.0 - supports-color: 7.2.0 - - jest-worker@27.5.1: - dependencies: - '@types/node': 22.15.32 - merge-stream: 2.0.0 - supports-color: 8.1.1 - - jest-worker@29.7.0: - dependencies: - '@types/node': 22.15.32 - jest-util: 29.7.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - - jest@20.0.4: - dependencies: - jest-cli: 20.0.4 - transitivePeerDependencies: - - supports-color - - jest@25.5.4: - dependencies: - '@jest/core': 25.5.4 - import-local: 3.2.0 - jest-cli: 25.5.4 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - - jest@29.7.0(@types/node@22.15.32)(babel-plugin-macros@3.1.0): - dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0) - '@jest/types': 29.6.3 - import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.15.32)(babel-plugin-macros@3.1.0) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jiti@1.21.7: {} - - jiti@2.4.2: {} - - joi@17.13.3: - dependencies: - '@hapi/hoek': 9.3.0 - '@hapi/topo': 5.1.0 - '@sideway/address': 4.1.5 - '@sideway/formula': 3.0.1 - '@sideway/pinpoint': 2.0.0 - - jpjs@1.2.1: {} - - js-base64@2.6.4: {} - - js-file-download@0.4.12: {} - - js-string-escape@1.0.1: {} - - js-tokens@3.0.2: {} - - js-tokens@4.0.0: {} - - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - js-yaml@3.7.0: - dependencies: - argparse: 1.0.10 - esprima: 2.7.3 - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - jsbn@0.1.1: {} - - jsbn@1.1.0: {} - - jschardet@3.1.4: {} - - jscodeshift@0.15.2(@babel/preset-env@7.27.2(@babel/core@7.27.4)): - dependencies: - '@babel/core': 7.28.0 - '@babel/parser': 7.28.0 - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.0) - '@babel/preset-flow': 7.27.1(@babel/core@7.28.0) - '@babel/preset-typescript': 7.27.1(@babel/core@7.28.0) - '@babel/register': 7.27.1(@babel/core@7.28.0) - babel-core: 7.0.0-bridge.0(@babel/core@7.28.0) - chalk: 4.1.2 - flow-parser: 0.275.0 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - neo-async: 2.6.2 - node-dir: 0.1.17 - recast: 0.23.11 - temp: 0.8.4 - write-file-atomic: 2.4.3 - optionalDependencies: - '@babel/preset-env': 7.27.2(@babel/core@7.27.4) - transitivePeerDependencies: - - supports-color - - jscodeshift@0.15.2(@babel/preset-env@7.27.2(@babel/core@7.28.0)): - dependencies: - '@babel/core': 7.28.0 - '@babel/parser': 7.28.0 - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.0) - '@babel/preset-flow': 7.27.1(@babel/core@7.28.0) - '@babel/preset-typescript': 7.27.1(@babel/core@7.28.0) - '@babel/register': 7.27.1(@babel/core@7.28.0) - babel-core: 7.0.0-bridge.0(@babel/core@7.28.0) - chalk: 4.1.2 - flow-parser: 0.275.0 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - neo-async: 2.6.2 - node-dir: 0.1.17 - recast: 0.23.11 - temp: 0.8.4 - write-file-atomic: 2.4.3 - optionalDependencies: - '@babel/preset-env': 7.27.2(@babel/core@7.28.0) - transitivePeerDependencies: - - supports-color - - jsdoc-type-pratt-parser@4.1.0: {} - - jsdom@11.12.0: - dependencies: - abab: 2.0.6 - acorn: 5.7.4 - acorn-globals: 4.3.4 - array-equal: 1.0.2 - cssom: 0.3.8 - cssstyle: 1.4.0 - data-urls: 1.1.0 - domexception: 1.0.1 - escodegen: 1.14.3 - html-encoding-sniffer: 1.0.2 - left-pad: 1.3.0 - nwsapi: 2.2.20 - 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.1 - symbol-tree: 3.2.4 - tough-cookie: 2.5.0 - w3c-hr-time: 1.0.2 - webidl-conversions: 4.0.2 - whatwg-encoding: 1.0.5 - whatwg-mimetype: 2.3.0 - whatwg-url: 6.5.0 - ws: 5.2.4 - xml-name-validator: 3.0.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - jsdom@15.2.1: - dependencies: - abab: 2.0.6 - acorn: 7.4.1 - acorn-globals: 4.3.4 - array-equal: 1.0.2 - cssom: 0.4.4 - cssstyle: 2.3.0 - data-urls: 1.1.0 - domexception: 1.0.1 - escodegen: 1.14.3 - html-encoding-sniffer: 1.0.2 - nwsapi: 2.2.20 - parse5: 5.1.0 - pn: 1.1.0 - request: 2.88.2 - request-promise-native: 1.0.9(request@2.88.2) - saxes: 3.1.11 - symbol-tree: 3.2.4 - tough-cookie: 3.0.1 - w3c-hr-time: 1.0.2 - w3c-xmlserializer: 1.1.2 - webidl-conversions: 4.0.2 - whatwg-encoding: 1.0.5 - whatwg-mimetype: 2.3.0 - whatwg-url: 7.1.0 - ws: 7.5.10 - xml-name-validator: 3.0.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - jsdom@20.0.3: - dependencies: - abab: 2.0.6 - acorn: 8.15.0 - acorn-globals: 7.0.1 - cssom: 0.5.0 - cssstyle: 2.3.0 - data-urls: 3.0.2 - decimal.js: 10.5.0 - domexception: 4.0.0 - escodegen: 2.1.0 - form-data: 4.0.4 - html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.20 - parse5: 7.3.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.4 - w3c-xmlserializer: 4.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 - whatwg-mimetype: 3.0.0 - whatwg-url: 11.0.0 - ws: 8.18.2 - xml-name-validator: 4.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - jsdom@9.12.0: - dependencies: - abab: 1.0.4 - acorn: 4.0.13 - acorn-globals: 3.1.0 - array-equal: 1.0.2 - content-type-parser: 1.0.2 - cssom: 0.3.8 - cssstyle: 0.2.37 - escodegen: 1.14.3 - html-encoding-sniffer: 1.0.2 - nwmatcher: 1.4.4 - parse5: 1.5.1 - request: 2.88.2 - sax: 1.4.1 - symbol-tree: 3.2.4 - tough-cookie: 2.5.0 - webidl-conversions: 4.0.2 - whatwg-encoding: 1.0.5 - whatwg-url: 4.8.0 - xml-name-validator: 2.0.1 - - jsesc@0.5.0: {} - - jsesc@1.3.0: {} - - jsesc@3.0.2: {} - - jsesc@3.1.0: {} - - json-buffer@3.0.1: {} - - json-parse-even-better-errors@2.3.1: {} - - json-parse-even-better-errors@3.0.2: {} - - json-schema-to-ts@3.1.1: - dependencies: - '@babel/runtime': 7.27.6 - ts-algebra: 2.0.0 - - json-schema-traverse@0.3.1: {} - - json-schema-traverse@0.4.1: {} - - json-schema-traverse@1.0.0: {} - - json-schema@0.4.0: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - json-stable-stringify@1.3.0: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - isarray: 2.0.5 - jsonify: 0.0.1 - object-keys: 1.1.1 - - json-stringify-safe@5.0.1: {} - - json3@3.3.3: {} - - json5@0.5.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - - json5@2.2.3: {} - - jsonc-parser@3.3.1: {} - - jsonfile@2.4.0: - optionalDependencies: - graceful-fs: 4.2.11 - - jsonfile@3.0.1: - optionalDependencies: - graceful-fs: 4.2.11 - - jsonfile@4.0.0: - optionalDependencies: - graceful-fs: 4.2.11 - - jsonfile@6.1.0: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - - jsonify@0.0.1: {} - - jsonix@3.0.0: - dependencies: - amdefine: 0.1.1 - xmldom: '@xmldom/xmldom@0.8.10' - xmlhttprequest: 1.8.0 - - jsonwebtoken@9.0.2: - dependencies: - jws: 3.2.2 - lodash.includes: 4.3.0 - lodash.isboolean: 3.0.3 - lodash.isinteger: 4.0.4 - lodash.isnumber: 3.0.3 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.once: 4.1.1 - ms: 2.1.3 - semver: 7.7.2 - - jsprim@1.4.2: - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - - jsx-ast-utils@3.3.5: - dependencies: - array-includes: 3.1.9 - array.prototype.flat: 1.3.3 - object.assign: 4.1.7 - object.values: 1.2.1 - - jszip@3.10.1: - dependencies: - lie: 3.3.0 - pako: 1.0.11 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - - junk@3.1.0: {} - - jwa@1.4.2: - dependencies: - buffer-equal-constant-time: 1.0.1 - ecdsa-sig-formatter: 1.0.11 - safe-buffer: 5.2.1 - - jws@3.2.2: - dependencies: - jwa: 1.4.2 - safe-buffer: 5.2.1 - - jwt-decode@4.0.0: {} - - keytar@7.9.0: - dependencies: - node-addon-api: 4.3.0 - prebuild-install: 7.1.3 - - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - - keyv@5.3.4: - dependencies: - '@keyv/serialize': 1.0.3 - - kill-port@2.0.1: - dependencies: - get-them-args: 1.3.2 - shell-exec: 1.0.2 - - kind-of@6.0.3: {} - - klaw@1.3.1: - optionalDependencies: - graceful-fs: 4.2.11 - - kleur@3.0.3: {} - - kleur@4.1.5: {} - - klona@2.0.6: {} - - known-css-properties@0.37.0: {} - - kuler@2.0.0: {} - - language-subtag-registry@0.3.23: {} - - language-tags@1.0.9: - dependencies: - language-subtag-registry: 0.3.23 - - latest-version@3.1.0: - dependencies: - package-json: 4.0.1 - - launch-editor@2.10.0: - dependencies: - picocolors: 1.1.1 - shell-quote: 1.8.3 - - lazy-universal-dotenv@3.0.1: - dependencies: - '@babel/runtime': 7.27.6 - app-root-dir: 1.0.2 - core-js: 3.43.0 - dotenv: 8.6.0 - dotenv-expand: 5.1.0 - - lazy-universal-dotenv@4.0.0: - dependencies: - app-root-dir: 1.0.2 - dotenv: 16.6.1 - dotenv-expand: 10.0.0 - - lcid@1.0.0: - dependencies: - invert-kv: 1.0.0 - - left-pad@1.3.0: {} - - leven@2.1.0: {} - - leven@3.1.0: {} - - levn@0.3.0: - dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - lie@3.3.0: - dependencies: - immediate: 3.0.6 - - lilconfig@2.1.0: {} - - lilconfig@3.1.3: {} - - lines-and-columns@1.2.4: {} - - lines-and-columns@2.0.4: {} - - linkify-it@3.0.3: - dependencies: - uc.micro: 1.0.6 - - linkify-it@5.0.0: - dependencies: - uc.micro: 2.1.0 - - lint-staged@16.1.2: - dependencies: - chalk: 5.4.1 - commander: 14.0.0 - debug: 4.4.1(supports-color@8.1.1) - lilconfig: 3.1.3 - listr2: 8.3.3 - micromatch: 4.0.8 - nano-spawn: 1.0.2 - pidtree: 0.6.0 - string-argv: 0.3.2 - yaml: 2.8.0 - transitivePeerDependencies: - - supports-color - - listenercount@1.0.1: {} - - listr2@8.3.3: - dependencies: - cli-truncate: 4.0.0 - colorette: 2.0.20 - eventemitter3: 5.0.1 - log-update: 6.1.0 - rfdc: 1.4.1 - wrap-ansi: 9.0.0 - - load-json-file@1.1.0: - dependencies: - graceful-fs: 4.2.11 - parse-json: 2.2.0 - pify: 2.3.0 - pinkie-promise: 2.0.1 - strip-bom: 2.0.0 - - loader-runner@4.3.0: {} - - loader-utils@0.2.17: - dependencies: - big.js: 3.2.0 - emojis-list: 2.1.0 - json5: 0.5.1 - object-assign: 4.1.1 - - loader-utils@1.4.2: - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 1.0.2 - - loader-utils@2.0.4: - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 2.2.3 - - loader-utils@3.3.1: {} - - locate-path@2.0.0: - dependencies: - p-locate: 2.0.0 - path-exists: 3.0.0 - - locate-path@3.0.0: - dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 - - locate-path@5.0.0: - dependencies: - p-locate: 4.1.0 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - locate-path@7.2.0: - dependencies: - p-locate: 6.0.0 - - lodash._reinterpolate@3.0.0: {} - - lodash.camelcase@4.3.0: {} - - lodash.clonedeep@4.5.0: {} - - lodash.curry@4.1.1: {} - - lodash.debounce@4.0.8: {} - - lodash.defaults@4.2.0: {} - - lodash.endswith@4.2.1: {} - - lodash.flow@3.5.0: {} - - lodash.includes@4.3.0: {} - - lodash.isboolean@3.0.3: {} - - lodash.isequal@4.5.0: {} - - lodash.isfunction@3.0.9: {} - - lodash.isinteger@4.0.4: {} - - lodash.isnumber@3.0.3: {} - - lodash.isplainobject@4.0.6: {} - - lodash.isstring@4.0.1: {} - - lodash.keys@4.2.0: {} - - lodash.memoize@4.1.2: {} - - lodash.merge@4.6.2: {} - - lodash.omit@4.5.0: {} - - lodash.once@4.1.1: {} - - lodash.sortby@4.7.0: {} - - lodash.startswith@4.2.1: {} - - lodash.template@4.5.0: - dependencies: - lodash._reinterpolate: 3.0.0 - lodash.templatesettings: 4.2.0 - - lodash.templatesettings@4.2.0: - dependencies: - lodash._reinterpolate: 3.0.0 - - lodash.truncate@4.4.2: {} - - lodash.uniq@4.5.0: {} - - lodash.without@4.4.0: {} - - lodash.xor@4.5.0: {} - - lodash@4.17.21: {} - - log-symbols@3.0.0: - dependencies: - chalk: 2.4.2 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - log-symbols@6.0.0: - dependencies: - chalk: 5.4.1 - is-unicode-supported: 1.3.0 - - log-update@2.3.0: - dependencies: - ansi-escapes: 3.2.0 - cli-cursor: 2.1.0 - wrap-ansi: 3.0.1 - - log-update@6.1.0: - dependencies: - ansi-escapes: 7.0.0 - cli-cursor: 5.0.0 - slice-ansi: 7.1.0 - strip-ansi: 7.1.0 - wrap-ansi: 9.0.0 - - logform@2.7.0: - dependencies: - '@colors/colors': 1.6.0 - '@types/triple-beam': 1.3.5 - fecha: 4.2.3 - ms: 2.1.3 - safe-stable-stringify: 2.5.0 - triple-beam: 1.3.0 - - loglevel@1.9.2: {} - - lolex@5.1.2: - dependencies: - '@sinonjs/commons': 1.8.6 - - long-timeout@0.1.1: {} - - longest-streak@3.1.0: {} - - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - - lottie-web@5.13.0: {} - - loud-rejection@1.6.0: - dependencies: - currently-unhandled: 0.4.1 - signal-exit: 3.0.7 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - loupe@3.1.4: {} - - lower-case@1.1.4: {} - - lower-case@2.0.2: - dependencies: - tslib: 2.8.1 - - lowercase-keys@1.0.1: {} - - lowercase-keys@3.0.0: {} - - lowlight@1.20.0: - dependencies: - fault: 1.0.4 - highlight.js: 10.7.3 - - lru-cache@10.4.3: {} - - lru-cache@11.1.0: {} - - lru-cache@4.1.5: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - - lru-cache@7.18.3: {} - - lru-queue@0.1.0: - dependencies: - es5-ext: 0.10.64 - - luxon@3.6.1: {} - - lz-string@1.5.0: {} - - magic-string@0.25.9: - dependencies: - sourcemap-codec: 1.4.8 - - magic-string@0.30.17: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 - - make-dir@1.3.0: - dependencies: - pify: 3.0.0 - - make-dir@2.1.0: - dependencies: - pify: 4.0.1 - semver: 5.7.2 - - make-dir@3.1.0: - dependencies: - semver: 6.3.1 - - make-dir@4.0.0: - dependencies: - semver: 7.7.2 - - make-error@1.3.6: {} - - make-fetch-happen@10.2.1: - dependencies: - agentkeepalive: 4.6.0 - cacache: 16.1.3 - http-cache-semantics: 4.2.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-fetch: 2.1.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.4 - promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 - ssri: 9.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - - make-fetch-happen@9.1.0: - dependencies: - agentkeepalive: 4.6.0 - cacache: 15.3.0 - http-cache-semantics: 4.2.0 - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 6.0.0 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-fetch: 1.4.1 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.4 - promise-retry: 2.0.1 - socks-proxy-agent: 6.2.1 - ssri: 8.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - - makeerror@1.0.12: - dependencies: - tmpl: 1.0.5 - - map-age-cleaner@0.1.3: - dependencies: - p-defer: 1.0.0 - - map-obj@1.0.1: {} - - map-obj@4.3.0: {} - - map-or-similar@1.5.0: {} - - markdown-escapes@1.0.4: {} - - markdown-it@12.3.2: - dependencies: - argparse: 2.0.1 - entities: 2.1.0 - linkify-it: 3.0.3 - mdurl: 1.0.1 - uc.micro: 1.0.6 - - markdown-it@14.1.0: - dependencies: - argparse: 2.0.1 - entities: 4.5.0 - linkify-it: 5.0.0 - mdurl: 2.0.0 - punycode.js: 2.3.1 - uc.micro: 2.1.0 - - markdown-table@3.0.4: {} - - markdown-to-jsx@7.7.8(react@18.2.0): - dependencies: - react: 18.2.0 - - matches-selector@0.0.1: {} - - math-expression-evaluator@1.4.0: {} - - math-intrinsics@1.1.0: {} - - mathml-tag-names@2.1.3: {} - - mdast-squeeze-paragraphs@4.0.0: - dependencies: - unist-util-remove: 2.1.0 - - mdast-util-definitions@4.0.0: - dependencies: - unist-util-visit: 2.0.3 - - mdast-util-definitions@5.1.2: - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.11 - unist-util-visit: 4.1.2 - - mdast-util-find-and-replace@3.0.2: - dependencies: - '@types/mdast': 4.0.4 - escape-string-regexp: 5.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - - mdast-util-from-markdown@1.3.1: - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.11 - decode-named-character-reference: 1.2.0 - mdast-util-to-string: 3.2.0 - micromark: 3.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-decode-string: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-stringify-position: 3.0.3 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - - mdast-util-from-markdown@2.0.2: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - decode-named-character-reference: 1.2.0 - devlop: 1.1.0 - mdast-util-to-string: 4.0.0 - micromark: 4.0.2 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-decode-string: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - unist-util-stringify-position: 4.0.0 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-autolink-literal@2.0.1: - dependencies: - '@types/mdast': 4.0.4 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.2 - micromark-util-character: 2.1.1 - - mdast-util-gfm-footnote@2.1.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - micromark-util-normalize-identifier: 2.0.1 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-strikethrough@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-table@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - markdown-table: 3.0.4 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-task-list-item@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm@3.1.0: - dependencies: - mdast-util-from-markdown: 2.0.2 - mdast-util-gfm-autolink-literal: 2.0.1 - mdast-util-gfm-footnote: 2.1.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-mdx-expression@2.0.1: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-mdx-jsx@3.2.0: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - parse-entities: 4.0.2 - stringify-entities: 4.0.4 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 - transitivePeerDependencies: - - supports-color - - mdast-util-mdxjs-esm@2.0.1: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-newline-to-break@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-find-and-replace: 3.0.2 - - mdast-util-phrasing@4.1.0: - dependencies: - '@types/mdast': 4.0.4 - unist-util-is: 6.0.0 - - mdast-util-to-hast@10.0.1: - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.11 - mdast-util-definitions: 4.0.0 - mdurl: 1.0.1 - unist-builder: 2.0.3 - unist-util-generated: 1.1.6 - unist-util-position: 3.1.0 - unist-util-visit: 2.0.3 - - mdast-util-to-hast@11.3.0: - dependencies: - '@types/hast': 2.3.10 - '@types/mdast': 3.0.15 - '@types/mdurl': 1.0.5 - mdast-util-definitions: 5.1.2 - mdurl: 1.0.1 - unist-builder: 3.0.1 - unist-util-generated: 2.0.1 - unist-util-position: 4.0.4 - unist-util-visit: 4.1.2 - - mdast-util-to-hast@13.2.0: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.1 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - - mdast-util-to-markdown@2.1.2: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.1.0 - 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 - zwitch: 2.0.4 - - mdast-util-to-string@1.1.0: {} - - mdast-util-to-string@3.2.0: - dependencies: - '@types/mdast': 3.0.15 - - mdast-util-to-string@4.0.0: - dependencies: - '@types/mdast': 4.0.4 - - mdn-data@2.0.14: {} - - mdn-data@2.12.2: {} - - mdurl@1.0.1: {} - - mdurl@2.0.0: {} - - media-typer@0.3.0: {} - - media-typer@1.1.0: {} - - mem@1.1.0: - dependencies: - mimic-fn: 1.2.0 - - mem@8.1.1: - dependencies: - map-age-cleaner: 0.1.3 - mimic-fn: 3.1.0 - - memfs@3.5.3: - dependencies: - fs-monkey: 1.0.6 - - memfs@4.17.2: - dependencies: - '@jsonjoy.com/json-pack': 1.2.0(tslib@2.8.1) - '@jsonjoy.com/util': 1.6.0(tslib@2.8.1) - tree-dump: 1.0.3(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 - - memory-fs@0.4.1: - dependencies: - errno: 0.1.8 - readable-stream: 2.3.8 - - meow@10.1.5: - dependencies: - '@types/minimist': 1.2.5 - camelcase-keys: 7.0.2 - decamelize: 5.0.1 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 8.0.0 - redent: 4.0.0 - trim-newlines: 4.1.1 - type-fest: 1.4.0 - yargs-parser: 20.2.9 - - meow@13.2.0: {} - - meow@3.7.0: - dependencies: - camelcase-keys: 2.1.0 - decamelize: 1.2.0 - loud-rejection: 1.6.0 - map-obj: 1.0.1 - minimist: 1.2.8 - normalize-package-data: 2.5.0 - object-assign: 4.1.1 - read-pkg-up: 1.0.1 - redent: 1.0.0 - trim-newlines: 1.0.0 - - meow@9.0.0: - dependencies: - '@types/minimist': 1.2.5 - camelcase-keys: 6.2.2 - decamelize: 1.2.0 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - - merge-descriptors@1.0.3: {} - - merge-descriptors@2.0.0: {} - - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - merge@1.2.1: {} - - meros@1.3.1(@types/node@24.0.14): - optionalDependencies: - '@types/node': 24.0.14 - - methods@1.1.2: {} - - microbuffer@1.0.0: {} - - microevent.ts@0.1.1: {} - - micromark-core-commonmark@1.1.0: - dependencies: - decode-named-character-reference: 1.2.0 - micromark-factory-destination: 1.1.0 - micromark-factory-label: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-factory-title: 1.1.0 - micromark-factory-whitespace: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-html-tag-name: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-core-commonmark@2.0.3: - dependencies: - decode-named-character-reference: 1.2.0 - devlop: 1.1.0 - micromark-factory-destination: 2.0.1 - micromark-factory-label: 2.0.1 - micromark-factory-space: 2.0.1 - micromark-factory-title: 2.0.1 - micromark-factory-whitespace: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-classify-character: 2.0.1 - micromark-util-html-tag-name: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-autolink-literal@2.1.0: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-footnote@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-strikethrough@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.1 - micromark-util-classify-character: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-table@2.1.1: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-tagfilter@2.0.0: - dependencies: - micromark-util-types: 2.0.2 - - micromark-extension-gfm-task-list-item@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm@3.0.0: - dependencies: - micromark-extension-gfm-autolink-literal: 2.1.0 - micromark-extension-gfm-footnote: 2.1.0 - micromark-extension-gfm-strikethrough: 2.1.0 - micromark-extension-gfm-table: 2.1.1 - micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.1.0 - micromark-util-combine-extensions: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-destination@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-factory-destination@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-label@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-factory-label@2.0.1: - dependencies: - devlop: 1.1.0 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-space@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-types: 1.1.0 - - micromark-factory-space@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-types: 2.0.2 - - micromark-factory-title@1.1.0: - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-factory-title@2.0.1: - dependencies: - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-whitespace@1.1.0: - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-factory-whitespace@2.0.1: - dependencies: - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-character@1.2.0: - dependencies: - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-util-character@2.1.1: - dependencies: - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-chunked@1.1.0: - dependencies: - micromark-util-symbol: 1.1.0 - - micromark-util-chunked@2.0.1: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-classify-character@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-util-classify-character@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-combine-extensions@1.1.0: - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-util-combine-extensions@2.0.1: - dependencies: - micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-decode-numeric-character-reference@1.1.0: - dependencies: - micromark-util-symbol: 1.1.0 - - micromark-util-decode-numeric-character-reference@2.0.2: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-decode-string@1.1.0: - dependencies: - decode-named-character-reference: 1.2.0 - micromark-util-character: 1.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-symbol: 1.1.0 - - micromark-util-decode-string@2.0.1: - dependencies: - decode-named-character-reference: 1.2.0 - micromark-util-character: 2.1.1 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-symbol: 2.0.1 - - micromark-util-encode@1.1.0: {} - - micromark-util-encode@2.0.1: {} - - micromark-util-html-tag-name@1.2.0: {} - - micromark-util-html-tag-name@2.0.1: {} - - micromark-util-normalize-identifier@1.1.0: - dependencies: - micromark-util-symbol: 1.1.0 - - micromark-util-normalize-identifier@2.0.1: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-resolve-all@1.1.0: - dependencies: - micromark-util-types: 1.1.0 - - micromark-util-resolve-all@2.0.1: - dependencies: - micromark-util-types: 2.0.2 - - micromark-util-sanitize-uri@1.2.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-encode: 1.1.0 - micromark-util-symbol: 1.1.0 - - micromark-util-sanitize-uri@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-encode: 2.0.1 - micromark-util-symbol: 2.0.1 - - micromark-util-subtokenize@1.1.0: - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-util-subtokenize@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-symbol@1.1.0: {} - - micromark-util-symbol@2.0.1: {} - - micromark-util-types@1.1.0: {} - - micromark-util-types@2.0.2: {} - - micromark@3.2.0: - dependencies: - '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) - decode-named-character-reference: 1.2.0 - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-combine-extensions: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-encode: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - - micromark@4.0.2: - dependencies: - '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@8.1.1) - decode-named-character-reference: 1.2.0 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-combine-extensions: 2.0.1 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-encode: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - transitivePeerDependencies: - - supports-color - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - mime-db@1.52.0: {} - - mime-db@1.54.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime-types@3.0.1: - dependencies: - mime-db: 1.54.0 - - mime@1.6.0: {} - - mime@2.6.0: {} - - mimic-fn@1.2.0: {} - - mimic-fn@2.1.0: {} - - mimic-fn@3.1.0: {} - - mimic-fn@4.0.0: {} - - mimic-function@5.0.1: {} - - mimic-response@3.1.0: {} - - mimic-response@4.0.0: {} - - min-document@2.19.0: - dependencies: - dom-walk: 0.1.2 - - min-indent@1.0.1: {} - - mini-css-extract-plugin@2.9.2(webpack@5.100.2): - dependencies: - schema-utils: 4.3.2 - tapable: 2.2.2 - webpack: 5.100.2(webpack-cli@4.10.0) - - minim@0.23.8: - dependencies: - lodash: 4.17.21 - - minimalistic-assert@1.0.1: {} - - minimatch@10.0.3: - dependencies: - '@isaacs/brace-expansion': 5.0.0 - - minimatch@3.0.3: - dependencies: - brace-expansion: 2.0.2 - - minimatch@3.0.8: - dependencies: - brace-expansion: 2.0.2 - - minimatch@3.1.2: - dependencies: - brace-expansion: 2.0.2 - - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.2 - - minimatch@7.4.6: - 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 - - minimist-options@4.1.0: - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - - minimist@1.2.8: {} - - minipass-collect@1.0.2: - dependencies: - minipass: 3.3.6 - - minipass-fetch@1.4.1: - dependencies: - minipass: 3.3.6 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - - minipass-fetch@2.1.2: - dependencies: - minipass: 3.3.6 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - - minipass-flush@1.0.5: - dependencies: - minipass: 3.3.6 - - minipass-pipeline@1.2.4: - dependencies: - minipass: 3.3.6 - - minipass-sized@1.0.3: - dependencies: - minipass: 3.3.6 - - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - - minipass@5.0.0: {} - - minipass@7.1.2: {} - - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - - mississippi@2.0.0: - dependencies: - concat-stream: 1.6.2 - duplexify: 3.7.1 - end-of-stream: 1.4.5 - flush-write-stream: 1.1.1 - from2: 2.3.0 - parallel-transform: 1.2.0 - pump: 2.0.1 - pumpify: 1.5.1 - stream-each: 1.2.3 - through2: 2.0.5 - - mkdirp-classic@0.5.3: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mkdirp@1.0.4: {} - - mkdirp@3.0.1: {} - - mlly@1.7.4: - dependencies: - acorn: 8.15.0 - pathe: 2.0.3 - pkg-types: 1.3.1 - ufo: 1.6.1 - - mocha@10.8.2: - dependencies: - ansi-colors: 4.1.3 - browser-stdout: 1.3.1 - chokidar: 3.6.0 - debug: 4.4.1(supports-color@8.1.1) - diff: 5.2.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 8.1.0 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 5.1.6 - ms: 2.1.3 - serialize-javascript: 6.0.2 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 6.5.1 - yargs: 16.2.0 - yargs-parser: 20.2.9 - yargs-unparser: 2.0.0 - - mocha@11.7.0: - dependencies: - browser-stdout: 1.3.1 - chokidar: 4.0.3 - debug: 4.4.1(supports-color@8.1.1) - diff: 7.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 10.4.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 9.0.5 - ms: 2.1.3 - picocolors: 1.1.1 - serialize-javascript: 6.0.2 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 9.3.2 - yargs: 17.7.2 - yargs-parser: 21.1.1 - yargs-unparser: 2.0.0 - - moment-timezone@0.5.39: - dependencies: - moment: 2.30.1 - - moment@2.30.1: {} - - monaco-editor-webpack-plugin@7.1.0(monaco-editor@0.52.2)(webpack@5.100.2): - dependencies: - loader-utils: 2.0.4 - monaco-editor: 0.52.2 - webpack: 5.100.2(webpack-cli@6.0.1) - - monaco-editor@0.44.0: {} - - monaco-editor@0.46.0: {} - - monaco-editor@0.52.2: {} - - monaco-languageclient@0.13.1-next.9: - dependencies: - glob-to-regexp: 0.4.1 - vscode-jsonrpc: 6.0.0 - vscode-languageclient: 7.0.0 - vscode-languageserver-textdocument: 1.0.12 - vscode-uri: 3.1.0 - - monaco-page-objects@3.14.1(selenium-webdriver@4.33.0)(typescript@5.8.3): - dependencies: - clipboardy: 4.0.0 - clone-deep: 4.0.1 - compare-versions: 6.1.1 - fs-extra: 11.3.0 - selenium-webdriver: 4.33.0 - type-fest: 4.41.0 - typescript: 5.8.3 - - mousetrap@1.6.5: {} - - move-concurrently@1.0.1: - dependencies: - aproba: 1.2.0 - copy-concurrently: 1.0.5 - fs-write-stream-atomic: 1.0.10 - mkdirp: 0.5.6 - rimraf: 2.7.1 - run-queue: 1.0.3 - - mri@1.2.0: {} - - ms@2.0.0: {} - - ms@2.1.2: {} - - ms@2.1.3: {} - - multicast-dns@7.2.5: - dependencies: - dns-packet: 5.6.1 - thunky: 1.1.0 - - mustache@4.2.0: {} - - mute-stream@0.0.7: {} - - mute-stream@0.0.8: {} - - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - - nan@2.22.2: {} - - nano-spawn@1.0.2: {} - - nanoid@3.3.11: {} - - nanoid@5.1.5: {} - - nanospinner@1.2.2: - dependencies: - picocolors: 1.1.1 - - napi-build-utils@2.0.0: {} - - natural-compare@1.4.0: {} - - neatequal@1.0.0: - dependencies: - varstream: 0.3.2 - - negotiator@0.6.3: {} - - negotiator@0.6.4: {} - - negotiator@1.0.0: {} - - neo-async@2.6.2: {} - - neotraverse@0.6.18: {} - - nested-error-stacks@2.1.1: {} - - next-tick@1.1.0: {} - - nice-try@1.0.5: {} - - no-case@2.3.2: - dependencies: - lower-case: 1.1.4 - - no-case@3.0.4: - dependencies: - lower-case: 2.0.2 - tslib: 2.8.1 - - node-abi@3.75.0: - dependencies: - semver: 7.7.2 - - node-abort-controller@3.1.1: {} - - node-addon-api@4.3.0: {} - - node-addon-api@7.1.1: - optional: true - - node-addon-api@8.4.0: - optional: true - - node-dir@0.1.17: - dependencies: - minimatch: 3.1.2 - - node-domexception@1.0.0: {} - - node-fetch-commonjs@3.3.2: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - - node-fetch-native@1.6.6: {} - - node-fetch@2.7.0(encoding@0.1.13): - dependencies: - whatwg-url: 5.0.0 - optionalDependencies: - encoding: 0.1.13 - - node-fetch@3.3.2: - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - - node-forge@1.3.1: {} - - node-gyp-build@4.8.4: - optional: true - - node-gyp@3.8.0: - dependencies: - fstream: 1.0.12 - glob: 7.2.3 - graceful-fs: 4.2.11 - mkdirp: 0.5.6 - nopt: 3.0.6 - npmlog: 4.1.2 - osenv: 0.1.5 - request: 2.88.2 - rimraf: 2.7.1 - semver: 5.3.0 - tar: 2.2.2 - which: 1.3.1 - - node-gyp@8.4.1: - dependencies: - env-paths: 2.2.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - make-fetch-happen: 9.1.0 - nopt: 5.0.0 - npmlog: 6.0.2 - rimraf: 3.0.2 - semver: 7.7.2 - tar: 6.2.1 - which: 2.0.2 - transitivePeerDependencies: - - bluebird - - supports-color - - node-gyp@9.4.1: - dependencies: - env-paths: 2.2.1 - exponential-backoff: 3.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - make-fetch-happen: 10.2.1 - nopt: 6.0.0 - npmlog: 6.0.2 - rimraf: 3.0.2 - semver: 7.7.2 - tar: 6.2.1 - which: 2.0.2 - transitivePeerDependencies: - - bluebird - - supports-color - - node-int64@0.4.0: {} - - node-loader@2.1.0(webpack@5.100.2): - dependencies: - loader-utils: 2.0.4 - webpack: 5.100.2(webpack-cli@4.10.0) - - node-notifier@5.4.5: - dependencies: - growly: 1.3.0 - is-wsl: 1.1.0 - semver: 5.7.2 - shellwords: 0.1.1 - which: 1.3.1 - - node-notifier@6.0.0: - dependencies: - growly: 1.3.0 - is-wsl: 2.2.0 - semver: 6.3.1 - shellwords: 0.1.1 - which: 1.3.1 - optional: true - - node-releases@2.0.19: {} - - node-sarif-builder@2.0.3: - dependencies: - '@types/sarif': 2.1.7 - fs-extra: 10.1.0 - - node-sass@9.0.0: - dependencies: - async-foreach: 0.1.3 - chalk: 4.1.2 - cross-spawn: 7.0.6 - gaze: 1.1.3 - get-stdin: 4.0.1 - glob: 7.2.3 - lodash: 4.17.21 - make-fetch-happen: 10.2.1 - meow: 9.0.0 - nan: 2.22.2 - node-gyp: 8.4.1 - sass-graph: 4.0.1 - stdout-stream: 1.4.1 - true-case-path: 2.2.1 - transitivePeerDependencies: - - bluebird - - supports-color - - node-schedule@2.1.1: - dependencies: - cron-parser: 4.9.0 - long-timeout: 0.1.1 - sorted-array-functions: 1.3.0 - - noms@0.0.0: - dependencies: - inherits: 2.0.4 - readable-stream: 1.0.34 - - nopt@3.0.6: - dependencies: - abbrev: 1.0.9 - - nopt@5.0.0: - dependencies: - abbrev: 1.1.1 - - nopt@6.0.0: - dependencies: - abbrev: 1.1.1 - - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.10 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - - normalize-package-data@3.0.3: - dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.16.1 - semver: 7.7.2 - validate-npm-package-license: 3.0.4 - - normalize-package-data@6.0.2: - dependencies: - hosted-git-info: 7.0.2 - semver: 7.7.2 - validate-npm-package-license: 3.0.4 - - normalize-path@2.1.1: - dependencies: - remove-trailing-separator: 1.1.0 - - normalize-path@3.0.0: {} - - normalize-range@0.1.2: {} - - normalize-url@1.9.1: - dependencies: - object-assign: 4.1.1 - prepend-http: 1.0.4 - query-string: 4.3.4 - sort-keys: 1.1.2 - - normalize-url@6.1.0: {} - - normalize-url@8.0.2: {} - - npm-run-path@2.0.2: - dependencies: - path-key: 2.0.1 - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - npm-run-path@5.3.0: - dependencies: - path-key: 4.0.0 - - npmlog@4.1.2: - dependencies: - are-we-there-yet: 1.1.7 - console-control-strings: 1.1.0 - gauge: 2.7.4 - set-blocking: 2.0.0 - - npmlog@5.0.1: - dependencies: - are-we-there-yet: 2.0.0 - console-control-strings: 1.1.0 - gauge: 3.0.2 - set-blocking: 2.0.0 - - npmlog@6.0.2: - dependencies: - are-we-there-yet: 3.0.1 - console-control-strings: 1.1.0 - gauge: 4.0.4 - set-blocking: 2.0.0 - - nth-check@2.1.1: - dependencies: - boolbase: 1.0.0 - - nullthrows@1.1.1: {} - - num2fraction@1.2.2: {} - - number-is-nan@1.0.1: {} - - nwmatcher@1.4.4: {} - - nwsapi@2.2.20: {} - - nypm@0.5.4: - dependencies: - citty: 0.1.6 - consola: 3.4.2 - pathe: 2.0.3 - pkg-types: 1.3.1 - tinyexec: 0.3.2 - ufo: 1.6.1 - - oauth-sign@0.9.0: {} - - object-assign@4.1.1: {} - - object-hash@3.0.0: {} - - object-inspect@1.13.4: {} - - object-is@1.1.6: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - - object-keys@1.1.1: {} - - object.assign@4.1.7: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - - object.entries@1.1.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - - object.getownpropertydescriptors@2.1.8: - dependencies: - array.prototype.reduce: 1.0.8 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - gopd: 1.2.0 - safe-array-concat: 1.1.3 - - object.groupby@1.0.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - - object.values@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - objectorarray@1.0.5: {} - - obuf@1.1.2: {} - - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - on-headers@1.1.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - one-time@1.0.0: - dependencies: - fn.name: 1.1.0 - - onetime@2.0.1: - dependencies: - mimic-fn: 1.2.0 - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - - onetime@7.0.0: - dependencies: - mimic-function: 5.0.1 - - open@10.1.2: - dependencies: - default-browser: 5.2.1 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - is-wsl: 3.1.0 - - open@7.4.2: - dependencies: - is-docker: 2.2.1 - is-wsl: 2.2.0 - - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - - openapi-path-templating@2.2.1: - dependencies: - apg-lite: 1.0.5 - - openapi-server-url-templating@1.3.0: - dependencies: - apg-lite: 1.0.5 - - opener@1.5.2: {} - - opn@5.2.0: - dependencies: - is-wsl: 1.1.0 - - optionator@0.8.3: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.5 - - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - - ora@4.1.1: - dependencies: - chalk: 3.0.0 - cli-cursor: 3.1.0 - cli-spinners: 2.9.2 - is-interactive: 1.0.0 - log-symbols: 3.0.0 - mute-stream: 0.0.8 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - - ora@5.4.1: - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.2 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - - ora@8.2.0: - dependencies: - chalk: 5.4.1 - cli-cursor: 5.0.0 - cli-spinners: 2.9.2 - is-interactive: 2.0.0 - is-unicode-supported: 2.1.0 - log-symbols: 6.0.0 - stdin-discarder: 0.2.2 - string-width: 7.2.0 - strip-ansi: 7.1.0 - - original@1.0.2: - dependencies: - url-parse: 1.5.10 - - os-homedir@1.0.2: {} - - os-locale@1.4.0: - dependencies: - lcid: 1.0.0 - - os-locale@2.1.0: - dependencies: - execa: 0.7.0 - lcid: 1.0.0 - mem: 1.1.0 - - os-tmpdir@1.0.2: {} - - osenv@0.1.5: - dependencies: - os-homedir: 1.0.2 - os-tmpdir: 1.0.2 - - own-keys@1.0.1: - dependencies: - get-intrinsic: 1.3.0 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 - - p-all@2.1.0: - dependencies: - p-map: 2.1.0 - - p-cancelable@3.0.0: {} - - p-cancelable@4.0.1: {} - - p-defer@1.0.0: {} - - p-each-series@2.2.0: {} - - p-event@4.2.0: - dependencies: - p-timeout: 3.2.0 - - p-filter@2.1.0: - dependencies: - p-map: 2.1.0 - - p-finally@1.0.0: {} - - p-finally@2.0.1: {} - - p-limit@1.3.0: - dependencies: - p-try: 1.0.0 - - p-limit@2.3.0: - dependencies: - p-try: 2.2.0 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-limit@4.0.0: - dependencies: - yocto-queue: 1.2.1 - - p-locate@2.0.0: - dependencies: - p-limit: 1.3.0 - - p-locate@3.0.0: - dependencies: - p-limit: 2.3.0 - - p-locate@4.1.0: - dependencies: - p-limit: 2.3.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - p-locate@6.0.0: - dependencies: - p-limit: 4.0.0 - - p-map@1.2.0: {} - - p-map@2.1.0: {} - - p-map@3.0.0: - dependencies: - aggregate-error: 3.1.0 - - p-map@4.0.0: - dependencies: - aggregate-error: 3.1.0 - - p-map@5.5.0: - dependencies: - aggregate-error: 4.0.1 - - p-map@7.0.3: {} - - p-queue@6.6.2: - dependencies: - eventemitter3: 4.0.7 - p-timeout: 3.2.0 - - p-retry@6.2.1: - dependencies: - '@types/retry': 0.12.2 - is-network-error: 1.1.0 - retry: 0.13.1 - - p-timeout@3.2.0: - dependencies: - p-finally: 1.0.0 - - p-try@1.0.0: {} - - p-try@2.2.0: {} - - package-json-from-dist@1.0.1: {} - - package-json@4.0.1: - dependencies: - got: 6.7.1 - registry-auth-token: 3.4.0 - registry-url: 3.1.0 - semver: 5.7.2 - - pako@0.2.9: {} - - pako@1.0.11: {} - - pako@2.1.0: {} - - parallel-transform@1.2.0: - dependencies: - cyclist: 1.0.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - - param-case@2.1.1: - dependencies: - no-case: 2.3.2 - - param-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.8.1 - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parse-entities@2.0.0: - dependencies: - character-entities: 1.2.4 - character-entities-legacy: 1.1.4 - character-reference-invalid: 1.1.4 - is-alphanumerical: 1.0.4 - is-decimal: 1.0.4 - is-hexadecimal: 1.0.4 - - parse-entities@4.0.2: - dependencies: - '@types/unist': 2.0.11 - character-entities-legacy: 3.0.0 - character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.2.0 - is-alphanumerical: 2.0.1 - is-decimal: 2.0.1 - is-hexadecimal: 2.0.1 - - parse-json@2.2.0: - dependencies: - error-ex: 1.3.2 - - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.27.1 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - - parse-json@7.1.1: - dependencies: - '@babel/code-frame': 7.27.1 - error-ex: 1.3.2 - json-parse-even-better-errors: 3.0.2 - lines-and-columns: 2.0.4 - type-fest: 3.13.1 - - parse-passwd@1.0.0: {} - - parse-semver@1.1.1: - dependencies: - semver: 5.7.2 - - parse5-htmlparser2-tree-adapter@7.1.0: - dependencies: - domhandler: 5.0.3 - parse5: 7.3.0 - - parse5-parser-stream@7.1.2: - dependencies: - parse5: 7.3.0 - - parse5@1.5.1: {} - - parse5@4.0.0: {} - - parse5@5.1.0: {} - - parse5@6.0.1: {} - - parse5@7.3.0: - dependencies: - entities: 6.0.1 - - parseurl@1.3.3: {} - - pascal-case@3.1.2: - dependencies: - no-case: 3.0.4 - tslib: 2.8.1 - - path-browserify@1.0.1: {} - - path-dirname@1.0.2: {} - - path-exists@2.1.0: - dependencies: - pinkie-promise: 2.0.1 - - path-exists@3.0.0: {} - - path-exists@4.0.0: {} - - path-exists@5.0.0: {} - - path-is-absolute@1.0.1: {} - - path-is-inside@1.0.2: {} - - path-key@2.0.1: {} - - path-key@3.1.1: {} - - path-key@4.0.0: {} - - path-parse@1.0.7: {} - - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - - path-scurry@2.0.0: - dependencies: - lru-cache: 11.1.0 - minipass: 7.1.2 - - path-to-regexp@0.1.12: {} - - path-to-regexp@1.9.0: - dependencies: - isarray: 0.0.1 - - path-to-regexp@8.2.0: {} - - path-type@1.1.0: - dependencies: - graceful-fs: 4.2.11 - pify: 2.3.0 - pinkie-promise: 2.0.1 - - path-type@3.0.0: - dependencies: - pify: 3.0.0 - - path-type@4.0.0: {} - - path-type@6.0.0: {} - - path@0.12.7: - dependencies: - process: 0.11.10 - util: 0.10.4 - - pathe@2.0.3: {} - - pathfinding@0.4.18: - dependencies: - heap: 0.2.5 - - paths-js@0.4.11: {} - - pathval@1.1.1: {} - - pathval@2.0.0: {} - - pathval@2.0.1: {} - - peek-readable@5.4.2: {} - - peek-stream@1.1.3: - dependencies: - buffer-from: 1.1.2 - duplexify: 3.7.1 - through2: 2.0.5 - - pend@1.2.0: {} - - performance-now@2.1.0: {} - - picocolors@0.2.1: {} - - picocolors@1.1.1: {} - - picomatch@2.3.1: {} - - picomatch@4.0.2: {} - - picomatch@4.0.3: {} - - pidtree@0.6.0: {} - - pify@2.3.0: {} - - pify@3.0.0: {} - - pify@4.0.1: {} - - pify@5.0.0: {} - - pinkie-promise@2.0.1: - dependencies: - pinkie: 2.0.4 - - pinkie@2.0.4: {} - - pirates@4.0.7: {} - - pkce-challenge@3.1.0: - dependencies: - crypto-js: 4.2.0 - - pkce-challenge@5.0.0: {} - - pkg-dir@2.0.0: - dependencies: - find-up: 2.1.0 - - pkg-dir@3.0.0: - dependencies: - find-up: 3.0.0 - - pkg-dir@4.2.0: - dependencies: - find-up: 4.1.0 - - pkg-dir@5.0.0: - dependencies: - find-up: 5.0.0 - - pkg-dir@7.0.0: - dependencies: - find-up: 6.3.0 - - pkg-types@1.3.1: - dependencies: - confbox: 0.1.8 - mlly: 1.7.4 - pathe: 2.0.3 - - playwright-core@1.52.0: {} - - playwright@1.52.0: - dependencies: - playwright-core: 1.52.0 - optionalDependencies: - fsevents: 2.3.2 - - plugin-error@1.0.1: - dependencies: - ansi-colors: 1.1.0 - arr-diff: 4.0.0 - arr-union: 3.1.0 - extend-shallow: 3.0.2 - - pluralize@2.0.0: {} - - pluralize@8.0.0: {} - - pn@1.1.0: {} - - pnp-webpack-plugin@1.6.4(typescript@4.9.5): - dependencies: - ts-pnp: 1.2.0(typescript@4.9.5) - transitivePeerDependencies: - - typescript - - pnp-webpack-plugin@1.6.4(typescript@5.8.3): - dependencies: - ts-pnp: 1.2.0(typescript@5.8.3) - transitivePeerDependencies: - - typescript - - polished@4.3.1: - dependencies: - '@babel/runtime': 7.27.6 - - popmotion@11.0.3: - dependencies: - framesync: 6.0.1 - hey-listen: 1.0.8 - style-value-types: 5.0.0 - tslib: 2.8.1 - - portfinder@1.0.37: - dependencies: - async: 3.2.6 - debug: 4.4.1(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - - possible-typed-array-names@1.1.0: {} - - postcss-calc@5.3.1: - dependencies: - postcss: 5.2.18 - postcss-message-helpers: 2.0.0 - reduce-css-calc: 1.3.0 - - postcss-calc@8.2.4(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-selector-parser: 6.1.2 - postcss-value-parser: 4.2.0 - - postcss-colormin@2.2.2: - dependencies: - colormin: 1.1.2 - postcss: 5.2.18 - postcss-value-parser: 3.3.1 - - postcss-colormin@5.3.1(postcss@8.5.6): - dependencies: - browserslist: 4.25.1 - caniuse-api: 3.0.0 - colord: 2.9.3 - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - - postcss-convert-values@2.6.1: - dependencies: - postcss: 5.2.18 - postcss-value-parser: 3.3.1 - - postcss-convert-values@5.1.3(postcss@8.5.6): - dependencies: - browserslist: 4.25.1 - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - - postcss-discard-comments@2.0.4: - dependencies: - postcss: 5.2.18 - - postcss-discard-comments@5.1.2(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - - postcss-discard-duplicates@2.1.0: - dependencies: - postcss: 5.2.18 - - postcss-discard-duplicates@5.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - - postcss-discard-empty@2.1.0: - dependencies: - postcss: 5.2.18 - - postcss-discard-empty@5.1.1(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - - postcss-discard-overridden@0.1.1: - dependencies: - postcss: 5.2.18 - - postcss-discard-overridden@5.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - - postcss-discard-unused@2.2.3: - dependencies: - postcss: 5.2.18 - uniqs: 2.0.0 - - postcss-filter-plugins@2.0.3: - dependencies: - postcss: 5.2.18 - - postcss-flexbugs-fixes@3.2.0: - dependencies: - postcss: 6.0.23 - - postcss-flexbugs-fixes@4.2.1: - dependencies: - postcss: 7.0.39 - - postcss-import@15.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.10 - - postcss-js@4.0.1(postcss@8.5.6): - dependencies: - camelcase-css: 2.0.1 - postcss: 8.5.6 - - postcss-load-config@1.2.0: - dependencies: - cosmiconfig: 2.2.2 - object-assign: 4.1.1 - postcss-load-options: 1.2.0 - postcss-load-plugins: 2.3.0 - - postcss-load-config@3.1.4(postcss@8.5.6): - dependencies: - lilconfig: 2.1.0 - yaml: 1.10.2 - optionalDependencies: - postcss: 8.5.6 - - postcss-load-config@4.0.2(postcss@8.5.6): - dependencies: - lilconfig: 3.1.3 - yaml: 2.8.0 - optionalDependencies: - postcss: 8.5.6 - - postcss-load-options@1.2.0: - dependencies: - cosmiconfig: 2.2.2 - object-assign: 4.1.1 - - postcss-load-plugins@2.3.0: - dependencies: - cosmiconfig: 2.2.2 - object-assign: 4.1.1 - - postcss-loader@2.0.8: - dependencies: - loader-utils: 1.4.2 - postcss: 6.0.23 - postcss-load-config: 1.2.0 - schema-utils: 0.3.0 - - postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.100.2): - dependencies: - cosmiconfig: 7.1.0 - klona: 2.0.6 - loader-utils: 2.0.4 - postcss: 7.0.39 - schema-utils: 3.3.0 - semver: 7.7.2 - webpack: 5.100.2(webpack-cli@4.10.0) - - postcss-loader@8.1.1(postcss@8.5.6)(typescript@5.8.3)(webpack@5.100.2): - dependencies: - cosmiconfig: 9.0.0(typescript@5.8.3) - jiti: 1.21.7 - postcss: 8.5.6 - semver: 7.7.2 - optionalDependencies: - webpack: 5.100.2(webpack-cli@6.0.1) - transitivePeerDependencies: - - typescript - - postcss-merge-idents@2.1.7: - dependencies: - has: 1.0.4 - postcss: 5.2.18 - postcss-value-parser: 3.3.1 - - postcss-merge-longhand@2.0.2: - dependencies: - postcss: 5.2.18 - - postcss-merge-longhand@5.1.7(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - stylehacks: 5.1.1(postcss@8.5.6) - - postcss-merge-rules@2.1.2: - dependencies: - browserslist: 1.7.7 - caniuse-api: 1.6.1 - postcss: 5.2.18 - postcss-selector-parser: 2.2.3 - vendors: 1.0.4 - - postcss-merge-rules@5.1.4(postcss@8.5.6): - dependencies: - browserslist: 4.25.1 - caniuse-api: 3.0.0 - cssnano-utils: 3.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-selector-parser: 6.1.2 - - postcss-message-helpers@2.0.0: {} - - postcss-minify-font-values@1.0.5: - dependencies: - object-assign: 4.1.1 - postcss: 5.2.18 - postcss-value-parser: 3.3.1 - - postcss-minify-font-values@5.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - - postcss-minify-gradients@1.0.5: - dependencies: - postcss: 5.2.18 - postcss-value-parser: 3.3.1 - - postcss-minify-gradients@5.1.1(postcss@8.5.6): - dependencies: - colord: 2.9.3 - cssnano-utils: 3.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - - postcss-minify-params@1.2.2: - dependencies: - alphanum-sort: 1.0.2 - postcss: 5.2.18 - postcss-value-parser: 3.3.1 - uniqs: 2.0.0 - - postcss-minify-params@5.1.4(postcss@8.5.6): - dependencies: - browserslist: 4.25.1 - cssnano-utils: 3.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - - postcss-minify-selectors@2.1.1: - dependencies: - alphanum-sort: 1.0.2 - has: 1.0.4 - postcss: 5.2.18 - postcss-selector-parser: 2.2.3 - - postcss-minify-selectors@5.2.1(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-selector-parser: 6.1.2 - - postcss-modules-extract-imports@1.2.1: - dependencies: - postcss: 6.0.23 - - postcss-modules-extract-imports@2.0.0: - dependencies: - postcss: 7.0.39 - - postcss-modules-extract-imports@3.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - - postcss-modules-local-by-default@1.2.0: - dependencies: - css-selector-tokenizer: 0.7.3 - postcss: 6.0.23 - - postcss-modules-local-by-default@3.0.3: - dependencies: - icss-utils: 4.1.1 - postcss: 7.0.39 - postcss-selector-parser: 6.1.2 - postcss-value-parser: 4.2.0 - - postcss-modules-local-by-default@4.2.0(postcss@8.5.6): - dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-selector-parser: 7.1.0 - postcss-value-parser: 4.2.0 - - postcss-modules-scope@1.1.0: - dependencies: - css-selector-tokenizer: 0.7.3 - postcss: 6.0.23 - - postcss-modules-scope@2.2.0: - dependencies: - postcss: 7.0.39 - postcss-selector-parser: 6.1.2 - - postcss-modules-scope@3.2.1(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-selector-parser: 7.1.0 - - postcss-modules-values@1.3.0: - dependencies: - icss-replace-symbols: 1.1.0 - postcss: 6.0.23 - - postcss-modules-values@3.0.0: - dependencies: - icss-utils: 4.1.1 - postcss: 7.0.39 - - postcss-modules-values@4.0.0(postcss@8.5.6): - dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 - - postcss-modules@4.3.1(postcss@8.5.6): - dependencies: - generic-names: 4.0.0 - icss-replace-symbols: 1.1.0 - lodash.camelcase: 4.3.0 - postcss: 8.5.6 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) - postcss-modules-scope: 3.2.1(postcss@8.5.6) - postcss-modules-values: 4.0.0(postcss@8.5.6) - string-hash: 1.1.3 - - postcss-nested@6.2.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-selector-parser: 6.1.2 - - postcss-normalize-charset@1.1.1: - dependencies: - postcss: 5.2.18 - - postcss-normalize-charset@5.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - - postcss-normalize-display-values@5.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - - postcss-normalize-positions@5.1.1(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - - postcss-normalize-repeat-style@5.1.1(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - - postcss-normalize-string@5.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - - postcss-normalize-timing-functions@5.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - - postcss-normalize-unicode@5.1.1(postcss@8.5.6): - dependencies: - browserslist: 4.25.1 - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - - postcss-normalize-url@3.0.8: - dependencies: - is-absolute-url: 2.1.0 - normalize-url: 1.9.1 - postcss: 5.2.18 - postcss-value-parser: 3.3.1 - - postcss-normalize-url@5.1.0(postcss@8.5.6): - dependencies: - normalize-url: 6.1.0 - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - - postcss-normalize-whitespace@5.1.1(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - - postcss-ordered-values@2.2.3: - dependencies: - postcss: 5.2.18 - postcss-value-parser: 3.3.1 - - postcss-ordered-values@5.1.3(postcss@8.5.6): - dependencies: - cssnano-utils: 3.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - - postcss-reduce-idents@2.4.0: - dependencies: - postcss: 5.2.18 - postcss-value-parser: 3.3.1 - - postcss-reduce-initial@1.0.1: - dependencies: - postcss: 5.2.18 - - postcss-reduce-initial@5.1.2(postcss@8.5.6): - dependencies: - browserslist: 4.25.1 - caniuse-api: 3.0.0 - postcss: 8.5.6 - - postcss-reduce-transforms@1.0.4: - dependencies: - has: 1.0.4 - postcss: 5.2.18 - postcss-value-parser: 3.3.1 - - postcss-reduce-transforms@5.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - - postcss-resolve-nested-selector@0.1.6: {} - - postcss-safe-parser@7.0.1(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - - postcss-selector-parser@2.2.3: - dependencies: - flatten: 1.0.3 - indexes-of: 1.0.1 - uniq: 1.0.1 - - postcss-selector-parser@6.1.2: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss-selector-parser@7.1.0: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss-svgo@2.1.6: - dependencies: - is-svg: 2.1.0 - postcss: 5.2.18 - postcss-value-parser: 3.3.1 - svgo: 0.7.2 - - postcss-svgo@5.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - svgo: 2.8.0 - - postcss-unique-selectors@2.0.2: - dependencies: - alphanum-sort: 1.0.2 - postcss: 5.2.18 - uniqs: 2.0.0 - - postcss-unique-selectors@5.1.1(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-selector-parser: 6.1.2 - - postcss-value-parser@3.3.1: {} - - postcss-value-parser@4.2.0: {} - - postcss-zindex@2.2.0: - dependencies: - has: 1.0.4 - postcss: 5.2.18 - uniqs: 2.0.0 - - postcss@5.2.18: - dependencies: - chalk: 1.1.3 - js-base64: 2.6.4 - source-map: 0.5.7 - supports-color: 3.2.3 - - postcss@6.0.23: - dependencies: - chalk: 2.4.2 - source-map: 0.6.1 - supports-color: 5.5.0 - - postcss@7.0.39: - dependencies: - picocolors: 0.2.1 - source-map: 0.6.1 - - postcss@8.5.6: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - prebuild-install@7.1.3: - dependencies: - detect-libc: 2.0.4 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 2.0.0 - node-abi: 3.75.0 - pump: 3.0.3 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.3 - tunnel-agent: 0.6.0 - - prelude-ls@1.1.2: {} - - prelude-ls@1.2.1: {} - - prepend-http@1.0.4: {} - - prettier-linter-helpers@1.0.0: - dependencies: - fast-diff: 1.3.0 - - prettier@1.19.1: {} - - prettier@2.3.0: {} - - prettier@2.8.8: {} - - prettier@3.5.3: {} - - prettier@3.6.2: {} - - pretty-bytes@4.0.2: {} - - pretty-error@2.1.2: - dependencies: - lodash: 4.17.21 - renderkid: 2.0.7 - - pretty-error@4.0.0: - dependencies: - lodash: 4.17.21 - renderkid: 3.0.0 - - pretty-format@20.0.3: - dependencies: - ansi-regex: 2.1.1 - ansi-styles: 3.2.1 - - pretty-format@22.4.3: - dependencies: - ansi-regex: 3.0.1 - ansi-styles: 3.2.1 - - pretty-format@25.5.0: - dependencies: - '@jest/types': 25.5.0 - ansi-regex: 5.0.1 - ansi-styles: 4.3.0 - react-is: 16.13.1 - - pretty-format@27.5.1: - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.3.1 - - pretty-hrtime@1.0.3: {} - - prism-react-renderer@2.4.1(react@18.2.0): - dependencies: - '@types/prismjs': 1.26.5 - clsx: 2.1.1 - react: 18.2.0 - - prismjs@1.30.0: {} - - private@0.1.8: {} - - process-nextick-args@1.0.7: {} - - process-nextick-args@2.0.1: {} - - process@0.11.10: {} - - progress-estimator@0.2.2: - dependencies: - chalk: 2.4.2 - cli-spinners: 1.3.1 - humanize-duration: 3.33.0 - log-update: 2.3.0 - - progress@2.0.3: {} - - promise-inflight@1.0.1(bluebird@3.7.2): - optionalDependencies: - bluebird: 3.7.2 - - promise-retry@2.0.1: - dependencies: - err-code: 2.0.3 - retry: 0.12.0 - - promise.allsettled@1.0.7: - dependencies: - array.prototype.map: 1.0.8 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - get-intrinsic: 1.3.0 - iterate-value: 1.0.2 - - promise.prototype.finally@3.1.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - set-function-name: 2.0.2 - - promise.series@0.2.0: {} - - promise@7.3.1: - dependencies: - asap: 2.0.6 - - promise@8.0.1: - dependencies: - asap: 2.0.6 - - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - - proper-lockfile@1.2.0: - dependencies: - err-code: 1.1.2 - extend: 3.0.2 - graceful-fs: 4.2.11 - retry: 0.10.1 - - property-expr@2.0.6: {} - - property-information@5.6.0: - dependencies: - xtend: 4.0.2 - - property-information@6.5.0: {} - - property-information@7.1.0: {} - - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - proxy-from-env@0.0.1: {} - - proxy-from-env@1.1.0: {} - - prr@1.0.1: {} - - pseudomap@1.0.2: {} - - psl@1.15.0: - dependencies: - punycode: 2.3.1 - - pump@1.0.3: - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - - pump@2.0.1: - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - - pump@3.0.3: - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - - pumpify@1.5.1: - dependencies: - duplexify: 3.7.1 - inherits: 2.0.4 - pump: 2.0.1 - - punycode.js@2.3.1: {} - - punycode@1.4.1: {} - - punycode@2.3.1: {} - - puppeteer-core@2.1.1: - dependencies: - '@types/mime-types': 2.1.4 - debug: 4.4.1(supports-color@8.1.1) - extract-zip: 1.7.0 - https-proxy-agent: 4.0.0 - mime: 2.6.0 - mime-types: 2.1.35 - progress: 2.0.3 - proxy-from-env: 1.1.0 - rimraf: 2.7.1 - ws: 6.2.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - pure-color@1.3.0: {} - - pure-rand@6.1.0: {} - - q@1.5.1: {} - - qs@6.13.0: - dependencies: - side-channel: 1.1.0 - - qs@6.14.0: - dependencies: - side-channel: 1.1.0 - - qs@6.5.3: {} - - query-string@4.3.4: - dependencies: - object-assign: 4.1.1 - strict-uri-encode: 1.1.0 - - querystringify@2.2.0: {} - - queue-microtask@1.2.3: {} - - quick-lru@4.0.1: {} - - quick-lru@5.1.1: {} - - raf@3.4.0: - dependencies: - performance-now: 2.1.0 - - ramda-adjunct@5.1.0(ramda@0.30.1): - dependencies: - ramda: 0.30.1 - - ramda@0.28.0: {} - - ramda@0.29.0: {} - - ramda@0.30.1: {} - - randexp@0.5.3: - dependencies: - drange: 1.1.1 - ret: 0.2.2 - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - range-parser@1.2.1: {} - - raw-body@2.5.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - - raw-body@3.0.0: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.6.3 - unpipe: 1.0.0 - - raw-loader@4.0.2(webpack@5.100.2): - dependencies: - loader-utils: 2.0.4 - schema-utils: 3.3.0 - webpack: 5.100.2(webpack-cli@4.10.0) - - rc-config-loader@4.1.3: - dependencies: - debug: 4.4.1(supports-color@8.1.1) - js-yaml: 4.1.0 - json5: 2.2.3 - require-from-string: 2.0.2 - transitivePeerDependencies: - - supports-color - - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - - react-base16-styling@0.6.0: - dependencies: - base16: 1.0.0 - lodash.curry: 4.1.1 - lodash.flow: 3.5.0 - pure-color: 1.3.0 - - react-collapse@5.1.1(react@18.2.0): - dependencies: - react: 18.2.0 - - react-colorful@5.6.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - react-copy-to-clipboard@5.1.0(react@18.2.0): - dependencies: - copy-to-clipboard: 3.3.3 - prop-types: 15.8.1 - react: 18.2.0 - - react-debounce-input@3.3.0(react@18.2.0): - dependencies: - lodash.debounce: 4.0.8 - prop-types: 15.8.1 - react: 18.2.0 - - react-dev-utils@5.0.3(typescript@5.8.3)(webpack@5.100.2): - dependencies: - address: 1.0.3 - babel-code-frame: 6.26.0 - chalk: 1.1.3 - cross-spawn: 5.1.0 - detect-port-alt: 1.1.6 - escape-string-regexp: 1.0.5 - filesize: 3.5.11 - global-modules: 1.0.0 - gzip-size: 3.0.0 - inquirer: 3.3.0 - is-root: 1.0.0 - opn: 5.2.0 - react-error-overlay: 4.0.1 - recursive-readdir: 2.2.1 - shell-quote: 1.6.1 - sockjs-client: 1.1.5 - strip-ansi: 3.0.1 - text-table: 0.2.0 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - react-dnd-html5-backend@16.0.1: - dependencies: - dnd-core: 16.0.1 - - react-dnd@16.0.1(@types/hoist-non-react-statics@3.3.6)(@types/node@22.15.32)(@types/react@18.2.0)(react@18.2.0): - dependencies: - '@react-dnd/invariant': 4.0.2 - '@react-dnd/shallowequal': 4.0.2 - dnd-core: 16.0.1 - fast-deep-equal: 3.1.3 - hoist-non-react-statics: 3.3.2 - react: 18.2.0 - optionalDependencies: - '@types/hoist-non-react-statics': 3.3.6 - '@types/node': 22.15.32 - '@types/react': 18.2.0 - - react-docgen-typescript@2.4.0(typescript@4.9.5): - dependencies: - typescript: 4.9.5 - - react-docgen-typescript@2.4.0(typescript@5.8.3): - dependencies: - typescript: 5.8.3 - - react-docgen@5.4.3: - dependencies: - '@babel/core': 7.27.4 - '@babel/generator': 7.27.5 - '@babel/runtime': 7.27.6 - ast-types: 0.14.2 - commander: 2.20.3 - doctrine: 3.0.0 - estree-to-babel: 3.2.1 - neo-async: 2.6.2 - node-dir: 0.1.17 - strip-indent: 3.0.0 - transitivePeerDependencies: - - supports-color - - react-docgen@7.1.1: - dependencies: - '@babel/core': 7.27.4 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 - '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.7 - '@types/doctrine': 0.0.9 - '@types/resolve': 1.20.6 - doctrine: 3.0.0 - resolve: 1.22.10 - strip-indent: 4.0.0 - transitivePeerDependencies: - - supports-color - - react-docgen@8.0.0: - dependencies: - '@babel/core': 7.28.0 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.1 - '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.7 - '@types/doctrine': 0.0.9 - '@types/resolve': 1.20.6 - doctrine: 3.0.0 - resolve: 1.22.10 - strip-indent: 4.0.0 - transitivePeerDependencies: - - supports-color - - react-dom@18.2.0(react@18.2.0): - dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.2 - - react-dom@19.1.0(react@19.1.0): - dependencies: - react: 19.1.0 - scheduler: 0.26.0 - - react-element-to-jsx-string@14.3.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - '@base2/pretty-print-object': 1.0.1 - is-plain-object: 5.0.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-is: 17.0.2 - - react-element-to-jsx-string@14.3.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0): - dependencies: - '@base2/pretty-print-object': 1.0.1 - is-plain-object: 5.0.0 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-is: 17.0.2 - - react-element-to-jsx-string@15.0.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - '@base2/pretty-print-object': 1.0.1 - is-plain-object: 5.0.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-is: 18.1.0 - - react-error-boundary@6.0.0(react@18.2.0): - dependencies: - '@babel/runtime': 7.27.6 - react: 18.2.0 - - react-error-overlay@4.0.1: {} - - react-hook-form@7.56.3(react@18.2.0): - dependencies: - react: 18.2.0 - - react-hook-form@7.56.4(react@18.2.0): - dependencies: - react: 18.2.0 - - react-hot-loader@4.13.1(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - fast-levenshtein: 2.0.6 - global: 4.4.0 - hoist-non-react-statics: 3.3.2 - loader-utils: 2.0.4 - prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-lifecycles-compat: 3.0.4 - shallowequal: 1.1.0 - source-map: 0.7.4 - optionalDependencies: - '@types/react': 18.2.0 - - react-icons@4.12.0(react@19.1.0): - dependencies: - react: 19.1.0 - - react-immutable-proptypes@2.2.0(immutable@3.8.2): - dependencies: - immutable: 3.8.2 - invariant: 2.2.4 - - react-immutable-pure-component@2.2.2(immutable@3.8.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - immutable: 3.8.2 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - react-inspector@5.1.1(react@18.2.0): - dependencies: - '@babel/runtime': 7.27.6 - is-dom: 1.1.0 - prop-types: 15.8.1 - react: 18.2.0 - - react-inspector@6.0.2(react@18.2.0): - dependencies: - react: 18.2.0 - - react-intl@7.1.11(react@18.2.0)(typescript@5.8.3): - dependencies: - '@formatjs/ecma402-abstract': 2.3.4 - '@formatjs/icu-messageformat-parser': 2.11.2 - '@formatjs/intl': 3.1.6(typescript@5.8.3) - '@types/hoist-non-react-statics': 3.3.6 - '@types/react': 18.2.0 - hoist-non-react-statics: 3.3.2 - intl-messageformat: 10.7.16 - react: 18.2.0 - tslib: 2.8.1 - optionalDependencies: - typescript: 5.8.3 - - react-intl@7.1.11(react@19.1.0)(typescript@4.9.5): - dependencies: - '@formatjs/ecma402-abstract': 2.3.4 - '@formatjs/icu-messageformat-parser': 2.11.2 - '@formatjs/intl': 3.1.6(typescript@4.9.5) - '@types/hoist-non-react-statics': 3.3.6 - '@types/react': 18.2.0 - hoist-non-react-statics: 3.3.2 - intl-messageformat: 10.7.16 - react: 19.1.0 - tslib: 2.8.1 - optionalDependencies: - typescript: 4.9.5 - - react-is@16.13.1: {} - - react-is@17.0.2: {} - - react-is@18.1.0: {} - - react-is@18.3.1: {} - - react-is@19.1.0: {} - - react-json-view-lite@2.4.1(react@18.2.0): - dependencies: - react: 18.2.0 - - react-json-view@1.21.3(@types/react@18.2.0)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - flux: 4.0.4(encoding@0.1.13)(react@18.2.0) - react: 18.2.0 - react-base16-styling: 0.6.0 - react-dom: 18.2.0(react@18.2.0) - react-lifecycles-compat: 3.0.4 - react-textarea-autosize: 8.5.9(@types/react@18.2.0)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - - encoding - - react-lifecycles-compat@3.0.4: {} - - react-lottie@1.2.10(react@18.2.0): - dependencies: - babel-runtime: 6.26.0 - lottie-web: 5.13.0 - prop-types: 15.8.1 - react: 18.2.0 - - react-lottie@1.2.10(react@19.1.0): - dependencies: - babel-runtime: 6.26.0 - lottie-web: 5.13.0 - prop-types: 15.8.1 - react: 19.1.0 - - react-markdown@10.1.0(@types/react@18.2.0)(react@18.2.0): - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@types/react': 18.2.0 - devlop: 1.1.0 - hast-util-to-jsx-runtime: 2.3.6 - html-url-attributes: 3.0.1 - mdast-util-to-hast: 13.2.0 - react: 18.2.0 - remark-parse: 11.0.0 - remark-rehype: 11.1.2 - unified: 11.0.5 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - transitivePeerDependencies: - - supports-color - - react-markdown@7.1.2(@types/react@18.2.0)(react@18.2.0): - dependencies: - '@types/hast': 2.3.10 - '@types/react': 18.2.0 - '@types/unist': 2.0.11 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 2.0.1 - prop-types: 15.8.1 - property-information: 6.5.0 - react: 18.2.0 - react-is: 17.0.2 - remark-parse: 10.0.2 - remark-rehype: 9.1.0 - space-separated-tokens: 2.0.2 - style-to-object: 0.3.0 - unified: 10.1.2 - unist-util-visit: 4.1.2 - vfile: 5.3.7 - transitivePeerDependencies: - - supports-color - - react-monaco-editor@0.58.0(monaco-editor@0.52.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - monaco-editor: 0.52.2 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - react-redux@9.2.0(@types/react@18.2.0)(react@18.2.0)(redux@5.0.1): - dependencies: - '@types/use-sync-external-store': 0.0.6 - react: 18.2.0 - use-sync-external-store: 1.5.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - redux: 5.0.1 - - react-refresh@0.11.0: {} - - react-refresh@0.17.0: {} - - react-remove-scroll-bar@2.3.8(@types/react@18.2.0)(react@18.2.0): - dependencies: - react: 18.2.0 - react-style-singleton: 2.2.3(@types/react@18.2.0)(react@18.2.0) - tslib: 2.8.1 - optionalDependencies: - '@types/react': 18.2.0 - - react-remove-scroll@2.5.5(@types/react@18.2.0)(react@18.2.0): - dependencies: - react: 18.2.0 - react-remove-scroll-bar: 2.3.8(@types/react@18.2.0)(react@18.2.0) - react-style-singleton: 2.2.3(@types/react@18.2.0)(react@18.2.0) - tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@18.2.0)(react@18.2.0) - use-sidecar: 1.1.3(@types/react@18.2.0)(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - - react-remove-scroll@2.7.1(@types/react@18.2.0)(react@18.2.0): - dependencies: - react: 18.2.0 - react-remove-scroll-bar: 2.3.8(@types/react@18.2.0)(react@18.2.0) - react-style-singleton: 2.2.3(@types/react@18.2.0)(react@18.2.0) - tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@18.2.0)(react@18.2.0) - use-sidecar: 1.1.3(@types/react@18.2.0)(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - - react-scripts-ts@3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.27.4))(babel-runtime@6.26.0)(esbuild@0.25.5)(eslint@9.27.0(jiti@2.4.2))(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.4))(webpack@5.100.2) - 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.100.2) - file-loader: 1.1.5(webpack@5.100.2) - fork-ts-checker-webpack-plugin: 0.2.10(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)(webpack@5.100.2) - fs-extra: 3.0.1 - html-webpack-plugin: 2.29.0(webpack@5.100.2) - jest: 20.0.4 - object-assign: 4.1.1 - postcss-flexbugs-fixes: 3.2.0 - postcss-loader: 2.0.8 - promise: 8.0.1 - raf: 3.4.0 - react-dev-utils: 5.0.3(typescript@5.8.3)(webpack@5.100.2) - resolve: 1.6.0 - source-map-loader: 0.2.4 - style-loader: 0.19.0 - sw-precache-webpack-plugin: 0.11.4(webpack@5.100.2) - 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 - tslint: 5.20.1(typescript@5.8.3) - 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.100.2) - url-loader: 0.6.2(file-loader@1.1.5(webpack@5.100.2)) - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) - webpack-manifest-plugin: 1.3.2(webpack@5.100.2) - whatwg-fetch: 2.0.3 - optionalDependencies: - fsevents: 1.2.13 - transitivePeerDependencies: - - '@swc/core' - - babel-core - - babel-runtime - - bufferutil - - debug - - esbuild - - eslint - - supports-color - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - react-scripts-ts@3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.27.4))(babel-runtime@6.26.0)(eslint@9.27.0(jiti@2.4.2))(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.4))(webpack@5.100.2) - 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.100.2) - file-loader: 1.1.5(webpack@5.100.2) - fork-ts-checker-webpack-plugin: 0.2.10(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)(webpack@5.100.2) - fs-extra: 3.0.1 - html-webpack-plugin: 2.29.0(webpack@5.100.2) - jest: 20.0.4 - object-assign: 4.1.1 - postcss-flexbugs-fixes: 3.2.0 - postcss-loader: 2.0.8 - promise: 8.0.1 - raf: 3.4.0 - react-dev-utils: 5.0.3(typescript@5.8.3)(webpack@5.100.2) - resolve: 1.6.0 - source-map-loader: 0.2.4 - style-loader: 0.19.0 - sw-precache-webpack-plugin: 0.11.4(webpack@5.100.2) - 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 - tslint: 5.20.1(typescript@5.8.3) - 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.100.2) - url-loader: 0.6.2(file-loader@1.1.5(webpack@5.100.2)) - webpack: 5.100.2(webpack-cli@6.0.1) - webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) - webpack-manifest-plugin: 1.3.2(webpack@5.100.2) - whatwg-fetch: 2.0.3 - optionalDependencies: - fsevents: 1.2.13 - transitivePeerDependencies: - - '@swc/core' - - babel-core - - babel-runtime - - bufferutil - - debug - - esbuild - - eslint - - supports-color - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - react-scripts-ts@3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.28.0))(babel-runtime@6.26.0)(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3): - 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.28.0))(webpack@5.100.2) - 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.100.2) - file-loader: 1.1.5(webpack@5.100.2) - fork-ts-checker-webpack-plugin: 0.2.10(eslint@9.26.0(jiti@2.4.2))(typescript@5.8.3)(webpack@5.100.2) - fs-extra: 3.0.1 - html-webpack-plugin: 2.29.0(webpack@5.100.2) - jest: 20.0.4 - object-assign: 4.1.1 - postcss-flexbugs-fixes: 3.2.0 - postcss-loader: 2.0.8 - promise: 8.0.1 - raf: 3.4.0 - react-dev-utils: 5.0.3(typescript@5.8.3)(webpack@5.100.2) - resolve: 1.6.0 - source-map-loader: 0.2.4 - style-loader: 0.19.0 - sw-precache-webpack-plugin: 0.11.4(webpack@5.100.2) - 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 - tslint: 5.20.1(typescript@5.8.3) - 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.100.2) - url-loader: 0.6.2(file-loader@1.1.5(webpack@5.100.2)) - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-dev-server: 5.2.2(webpack@5.100.2) - webpack-manifest-plugin: 1.3.2(webpack@5.100.2) - whatwg-fetch: 2.0.3 - optionalDependencies: - fsevents: 1.2.13 - transitivePeerDependencies: - - '@swc/core' - - babel-core - - babel-runtime - - bufferutil - - debug - - esbuild - - eslint - - supports-color - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - react-split-pane@0.1.92(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-lifecycles-compat: 3.0.4 - react-style-proptype: 3.2.2 - - react-style-proptype@3.2.2: - dependencies: - prop-types: 15.8.1 - - react-style-singleton@2.2.3(@types/react@18.2.0)(react@18.2.0): - dependencies: - get-nonce: 1.0.1 - react: 18.2.0 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 18.2.0 - - react-syntax-highlighter@15.6.1(react@18.2.0): - dependencies: - '@babel/runtime': 7.27.6 - highlight.js: 10.7.3 - highlightjs-vue: 1.0.0 - lowlight: 1.20.0 - prismjs: 1.30.0 - react: 18.2.0 - refractor: 3.6.0 - - react-test-renderer@19.1.0(react@18.2.0): - dependencies: - react: 18.2.0 - react-is: 19.1.0 - scheduler: 0.26.0 - - react-textarea-autosize@8.5.9(@types/react@18.2.0)(react@18.2.0): - dependencies: - '@babel/runtime': 7.27.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) - transitivePeerDependencies: - - '@types/react' - - react-zoom-pan-pinch@3.7.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - react@18.2.0: - dependencies: - loose-envify: 1.4.0 - - react@19.1.0: {} - - read-cache@1.0.0: - dependencies: - pify: 2.3.0 - - read-pkg-up@1.0.1: - dependencies: - find-up: 1.1.2 - read-pkg: 1.1.0 - - read-pkg-up@7.0.1: - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - - read-pkg-up@8.0.0: - dependencies: - find-up: 5.0.0 - read-pkg: 6.0.0 - type-fest: 1.4.0 - - read-pkg@1.1.0: - dependencies: - load-json-file: 1.1.0 - normalize-package-data: 2.5.0 - path-type: 1.1.0 - - read-pkg@5.2.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - - read-pkg@6.0.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 3.0.3 - parse-json: 5.2.0 - type-fest: 1.4.0 - - read-pkg@8.1.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 6.0.2 - parse-json: 7.1.1 - type-fest: 4.41.0 - - read@1.0.7: - dependencies: - mute-stream: 0.0.8 - - readable-stream@1.0.34: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 0.0.1 - string_decoder: 0.10.31 - - readable-stream@1.1.14: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 0.0.1 - string_decoder: 0.10.31 - - readable-stream@2.0.6: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 1.0.7 - string_decoder: 0.10.31 - util-deprecate: 1.0.2 - - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - readable-stream@4.7.0: - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - - readable-web-to-node-stream@3.0.4: - dependencies: - readable-stream: 4.7.0 - - readdirp@2.2.1: - dependencies: - graceful-fs: 4.2.11 - micromatch: 4.0.8 - readable-stream: 2.3.8 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - readdirp@4.1.2: {} - - realpath-native@2.0.0: {} - - recast@0.23.11: - dependencies: - ast-types: 0.16.1 - esprima: 4.0.1 - source-map: 0.6.1 - tiny-invariant: 1.3.3 - tslib: 2.8.1 - - rechoir@0.6.2: - dependencies: - resolve: 1.22.10 - - rechoir@0.7.1: - dependencies: - resolve: 1.22.10 - - rechoir@0.8.0: - dependencies: - resolve: 1.22.10 - - recursive-readdir@2.2.1: - dependencies: - minimatch: 3.0.3 - - redent@1.0.0: - dependencies: - indent-string: 2.1.0 - strip-indent: 1.0.1 - - redent@3.0.0: - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - - redent@4.0.0: - dependencies: - indent-string: 5.0.0 - strip-indent: 4.0.0 - - reduce-css-calc@1.3.0: - dependencies: - balanced-match: 0.4.2 - math-expression-evaluator: 1.4.0 - reduce-function-call: 1.0.3 - - reduce-function-call@1.0.3: - dependencies: - balanced-match: 1.0.2 - - redux-immutable@4.0.0(immutable@3.8.2): - dependencies: - immutable: 3.8.2 - - redux@4.2.1: - dependencies: - '@babel/runtime': 7.27.6 - - redux@5.0.1: {} - - reflect-metadata@0.1.14: {} - - reflect.getprototypeof@1.0.10: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - which-builtin-type: 1.2.1 - - refractor@3.6.0: - dependencies: - hastscript: 6.0.0 - parse-entities: 2.0.0 - prismjs: 1.30.0 - - regenerate-unicode-properties@10.2.0: - dependencies: - regenerate: 1.4.2 - - regenerate@1.4.2: {} - - regenerator-runtime@0.11.1: {} - - regenerator-runtime@0.13.11: {} - - regenerator-transform@0.10.1: - dependencies: - babel-runtime: 6.26.0 - babel-types: 6.26.0 - private: 0.1.8 - - regexp.prototype.flags@1.5.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - get-proto: 1.0.1 - gopd: 1.2.0 - set-function-name: 2.0.2 - - regexpp@2.0.1: {} - - regexpp@3.2.0: {} - - regexpu-core@2.0.0: - dependencies: - regenerate: 1.4.2 - regjsgen: 0.2.0 - regjsparser: 0.1.5 - - regexpu-core@6.2.0: - dependencies: - regenerate: 1.4.2 - regenerate-unicode-properties: 10.2.0 - regjsgen: 0.8.0 - regjsparser: 0.12.0 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.2.0 - - registry-auth-token@3.4.0: - dependencies: - rc: 1.2.8 - safe-buffer: 5.2.1 - - registry-url@3.1.0: - dependencies: - rc: 1.2.8 - - regjsgen@0.2.0: {} - - regjsgen@0.8.0: {} - - regjsparser@0.1.5: - dependencies: - jsesc: 0.5.0 - - regjsparser@0.12.0: - dependencies: - jsesc: 3.0.2 - - rehype-raw@6.1.1: - dependencies: - '@types/hast': 2.3.10 - hast-util-raw: 7.2.3 - unified: 10.1.2 - - rehype-raw@7.0.0: - dependencies: - '@types/hast': 3.0.4 - hast-util-raw: 9.1.0 - vfile: 6.0.3 - - relateurl@0.2.7: {} - - remap-istanbul@0.13.0: - dependencies: - istanbul: 0.4.5 - minimatch: 3.1.2 - plugin-error: 1.0.1 - source-map: 0.6.1 - through2: 3.0.0 - - remark-breaks@4.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-newline-to-break: 2.0.0 - unified: 11.0.5 - - remark-external-links@8.0.0: - dependencies: - extend: 3.0.2 - is-absolute-url: 3.0.3 - mdast-util-definitions: 4.0.0 - space-separated-tokens: 1.1.5 - unist-util-visit: 2.0.3 - - remark-footnotes@2.0.0: {} - - remark-gfm@4.0.1: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-gfm: 3.1.0 - micromark-extension-gfm: 3.0.0 - remark-parse: 11.0.0 - remark-stringify: 11.0.0 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color - - remark-mdx@1.6.22: - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.10.4 - '@babel/plugin-proposal-object-rest-spread': 7.12.1(@babel/core@7.12.9) - '@babel/plugin-syntax-jsx': 7.12.1(@babel/core@7.12.9) - '@mdx-js/util': 1.6.22 - is-alphabetical: 1.0.4 - remark-parse: 8.0.3 - unified: 9.2.0 - transitivePeerDependencies: - - supports-color - - remark-parse@10.0.2: - dependencies: - '@types/mdast': 3.0.15 - mdast-util-from-markdown: 1.3.1 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color - - remark-parse@11.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.2 - micromark-util-types: 2.0.2 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color - - remark-parse@8.0.3: - dependencies: - ccount: 1.1.0 - collapse-white-space: 1.0.6 - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 - is-whitespace-character: 1.0.4 - is-word-character: 1.0.4 - markdown-escapes: 1.0.4 - parse-entities: 2.0.0 - repeat-string: 1.6.1 - state-toggle: 1.0.3 - trim: 0.0.1 - trim-trailing-lines: 1.1.4 - unherit: 1.1.3 - unist-util-remove-position: 2.0.1 - vfile-location: 3.2.0 - xtend: 4.0.2 - - remark-rehype@11.1.2: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - mdast-util-to-hast: 13.2.0 - unified: 11.0.5 - vfile: 6.0.3 - - remark-rehype@9.1.0: - dependencies: - '@types/hast': 2.3.10 - '@types/mdast': 3.0.15 - mdast-util-to-hast: 11.3.0 - unified: 10.1.2 - - remark-slug@6.1.0: - dependencies: - github-slugger: 1.5.0 - mdast-util-to-string: 1.1.0 - unist-util-visit: 2.0.3 - - remark-squeeze-paragraphs@4.0.0: - dependencies: - mdast-squeeze-paragraphs: 4.0.0 - - remark-stringify@11.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-to-markdown: 2.1.2 - unified: 11.0.5 - - remarkable@2.0.1: - dependencies: - argparse: 1.0.10 - autolinker: 3.16.2 - - remove-trailing-separator@1.1.0: {} - - renderkid@2.0.7: - dependencies: - css-select: 4.3.0 - dom-converter: 0.2.0 - htmlparser2: 6.1.0 - lodash: 4.17.21 - strip-ansi: 3.0.1 - - renderkid@3.0.0: - dependencies: - css-select: 4.3.0 - dom-converter: 0.2.0 - htmlparser2: 6.1.0 - lodash: 4.17.21 - strip-ansi: 6.0.1 - - repeat-string@1.6.1: {} - - repeating@2.0.1: - dependencies: - is-finite: 1.1.0 - - request-promise-core@1.1.4(request@2.88.2): - dependencies: - lodash: 4.17.21 - request: 2.88.2 - - request-promise-native@1.0.9(request@2.88.2): - dependencies: - request: 2.88.2 - request-promise-core: 1.1.4(request@2.88.2) - stealthy-require: 1.1.1 - tough-cookie: 2.5.0 - - request@2.88.2: - dependencies: - aws-sign2: 0.7.0 - aws4: 1.13.2 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 4.0.4 - har-validator: 5.1.5 - http-signature: 1.2.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - oauth-sign: 0.9.0 - performance-now: 2.1.0 - qs: 6.5.3 - safe-buffer: 5.2.1 - tough-cookie: 2.5.0 - tunnel-agent: 0.6.0 - uuid: 3.4.0 - - require-directory@2.1.1: {} - - require-from-string@1.2.1: {} - - require-from-string@2.0.2: {} - - require-main-filename@1.0.1: {} - - require-main-filename@2.0.0: {} - - requires-port@1.0.0: {} - - reselect@5.1.1: {} - - resize-observer-polyfill@1.5.1: {} - - resolve-alpn@1.2.1: {} - - resolve-cwd@3.0.0: - dependencies: - resolve-from: 5.0.0 - - resolve-dir@1.0.1: - dependencies: - expand-tilde: 2.0.2 - global-modules: 1.0.0 - - resolve-from@4.0.0: {} - - resolve-from@5.0.0: {} - - resolve.exports@2.0.3: {} - - resolve@1.1.7: {} - - resolve@1.17.0: - dependencies: - path-parse: 1.0.7 - - resolve@1.22.10: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - resolve@1.6.0: - dependencies: - path-parse: 1.0.7 - - resolve@2.0.0-next.5: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - responselike@3.0.0: - dependencies: - lowercase-keys: 3.0.0 - - restore-cursor@2.0.0: - dependencies: - onetime: 2.0.1 - signal-exit: 3.0.7 - - restore-cursor@3.1.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - - restore-cursor@5.1.0: - dependencies: - onetime: 7.0.0 - signal-exit: 4.1.0 - - ret@0.2.2: {} - - retry@0.10.1: {} - - retry@0.12.0: {} - - retry@0.13.1: {} - - reusify@1.1.0: {} - - rev-hash@3.0.0: {} - - rfdc@1.4.1: {} - - rimraf@2.6.3: - dependencies: - glob: 7.2.3 - - rimraf@2.7.1: - dependencies: - glob: 7.2.3 - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - - rimraf@6.0.1: - dependencies: - glob: 11.0.3 - package-json-from-dist: 1.0.1 - - rollup-plugin-import-css@3.5.8(rollup@4.44.0): - dependencies: - '@rollup/pluginutils': 5.2.0(rollup@4.44.0) - rollup: 4.44.0 - - rollup-plugin-peer-deps-external@2.2.4(rollup@4.44.0): - dependencies: - rollup: 4.44.0 - - rollup-plugin-postcss@4.0.2(postcss@8.5.6): - dependencies: - chalk: 4.1.2 - concat-with-sourcemaps: 1.1.0 - cssnano: 5.1.15(postcss@8.5.6) - import-cwd: 3.0.0 - p-queue: 6.6.2 - pify: 5.0.0 - postcss: 8.5.6 - postcss-load-config: 3.1.4(postcss@8.5.6) - postcss-modules: 4.3.1(postcss@8.5.6) - promise.series: 0.2.0 - resolve: 1.22.10 - rollup-pluginutils: 2.8.2 - safe-identifier: 0.4.2 - style-inject: 0.3.0 - transitivePeerDependencies: - - ts-node - - rollup-plugin-scss@4.0.1: - dependencies: - rollup-pluginutils: 2.8.2 - - rollup-plugin-sourcemaps@0.6.3(@types/node@22.15.32)(rollup@1.32.1): - dependencies: - '@rollup/pluginutils': 3.1.0(rollup@1.32.1) - rollup: 1.32.1 - source-map-resolve: 0.6.0 - optionalDependencies: - '@types/node': 22.15.32 - - rollup-plugin-svg@2.0.0: - dependencies: - rollup-pluginutils: 1.5.2 - - rollup-plugin-terser@5.3.1(rollup@1.32.1): - dependencies: - '@babel/code-frame': 7.27.1 - jest-worker: 24.9.0 - rollup: 1.32.1 - rollup-pluginutils: 2.8.2 - serialize-javascript: 4.0.0 - terser: 4.8.1 - - rollup-plugin-typescript2@0.27.3(rollup@1.32.1)(typescript@3.9.10): - dependencies: - '@rollup/pluginutils': 3.1.0(rollup@1.32.1) - find-cache-dir: 3.3.2 - fs-extra: 8.1.0 - resolve: 1.17.0 - rollup: 1.32.1 - tslib: 2.0.1 - typescript: 3.9.10 - - rollup-plugin-typescript2@0.36.0(rollup@4.44.0)(typescript@5.8.3): - dependencies: - '@rollup/pluginutils': 4.2.1 - find-cache-dir: 3.3.2 - fs-extra: 10.1.0 - rollup: 4.44.0 - semver: 7.7.2 - tslib: 2.8.1 - typescript: 5.8.3 - - rollup-pluginutils@1.5.2: - dependencies: - estree-walker: 0.2.1 - minimatch: 3.1.2 - - rollup-pluginutils@2.8.2: - dependencies: - estree-walker: 0.6.1 - - rollup@1.32.1: - dependencies: - '@types/estree': 1.0.8 - '@types/node': 22.15.32 - acorn: 7.4.1 - - rollup@4.44.0: - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.44.0 - '@rollup/rollup-android-arm64': 4.44.0 - '@rollup/rollup-darwin-arm64': 4.44.0 - '@rollup/rollup-darwin-x64': 4.44.0 - '@rollup/rollup-freebsd-arm64': 4.44.0 - '@rollup/rollup-freebsd-x64': 4.44.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.44.0 - '@rollup/rollup-linux-arm-musleabihf': 4.44.0 - '@rollup/rollup-linux-arm64-gnu': 4.44.0 - '@rollup/rollup-linux-arm64-musl': 4.44.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.44.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.44.0 - '@rollup/rollup-linux-riscv64-gnu': 4.44.0 - '@rollup/rollup-linux-riscv64-musl': 4.44.0 - '@rollup/rollup-linux-s390x-gnu': 4.44.0 - '@rollup/rollup-linux-x64-gnu': 4.44.0 - '@rollup/rollup-linux-x64-musl': 4.44.0 - '@rollup/rollup-win32-arm64-msvc': 4.44.0 - '@rollup/rollup-win32-ia32-msvc': 4.44.0 - '@rollup/rollup-win32-x64-msvc': 4.44.0 - fsevents: 2.3.3 - - router@2.2.0: - dependencies: - debug: 4.4.1(supports-color@8.1.1) - depd: 2.0.0 - is-promise: 4.0.0 - parseurl: 1.3.3 - path-to-regexp: 8.2.0 - transitivePeerDependencies: - - supports-color - - rsvp@4.8.5: {} - - run-applescript@7.0.0: {} - - run-async@2.4.1: {} - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - run-queue@1.0.3: - dependencies: - aproba: 1.2.0 - - rx-lite-aggregates@4.0.8: - dependencies: - rx-lite: 4.0.8 - - rx-lite@4.0.8: {} - - rxjs@6.6.7: - dependencies: - tslib: 1.14.1 - - sade@1.8.1: - dependencies: - mri: 1.2.0 - - safe-array-concat@1.1.3: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - isarray: 2.0.5 - - safe-buffer@5.1.2: {} - - safe-buffer@5.2.1: {} - - safe-identifier@0.4.2: {} - - safe-push-apply@1.0.0: - dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 - - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-regex: 1.2.1 - - safe-stable-stringify@2.5.0: {} - - safer-buffer@2.1.2: {} - - sane@1.6.0: - dependencies: - anymatch: 1.3.2 - exec-sh: 0.2.2 - fb-watchman: 1.9.2 - minimatch: 3.1.2 - minimist: 1.2.8 - walker: 1.0.8 - watch: 0.10.0 - - sane@4.1.0: - dependencies: - '@cnakazawa/watch': 1.0.4 - anymatch: 2.0.0 - capture-exit: 2.0.0 - exec-sh: 0.3.6 - execa: 1.0.0 - fb-watchman: 2.0.2 - micromatch: 4.0.8 - minimist: 1.2.8 - walker: 1.0.8 - - sanitize-filename@1.6.3: - dependencies: - truncate-utf8-bytes: 1.0.2 - - sass-graph@4.0.1: - dependencies: - glob: 7.2.3 - lodash: 4.17.21 - scss-tokenizer: 0.4.3 - yargs: 17.7.2 - - sass-loader@16.0.5(node-sass@9.0.0)(sass@1.89.2)(webpack@5.100.2): - dependencies: - neo-async: 2.6.2 - optionalDependencies: - node-sass: 9.0.0 - sass: 1.89.2 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - - sass@1.89.2: - dependencies: - chokidar: 4.0.3 - immutable: 5.1.3 - source-map-js: 1.2.1 - optionalDependencies: - '@parcel/watcher': 2.5.1 - - sax@1.2.4: {} - - sax@1.4.1: {} - - saxes@3.1.11: - dependencies: - xmlchars: 2.2.0 - - saxes@6.0.0: - dependencies: - xmlchars: 2.2.0 - - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - - scheduler@0.26.0: {} - - schema-utils@0.3.0: - dependencies: - ajv: 5.5.2 - - schema-utils@0.4.7: - dependencies: - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - - schema-utils@2.7.0: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - - schema-utils@2.7.1: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - - schema-utils@3.3.0: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - - schema-utils@4.3.2: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - ajv-keywords: 5.1.0(ajv@8.17.1) - - scss-tokenizer@0.4.3: - dependencies: - js-base64: 2.6.4 - source-map: 0.7.4 - - secretlint@9.3.4: - dependencies: - '@secretlint/config-creator': 9.3.4 - '@secretlint/formatter': 9.3.4 - '@secretlint/node': 9.3.4 - '@secretlint/profiler': 9.3.4 - debug: 4.4.1(supports-color@8.1.1) - globby: 14.1.0 - read-pkg: 8.1.0 - transitivePeerDependencies: - - supports-color - - secure-compare@3.0.1: {} - - select-hose@2.0.0: {} - - selenium-webdriver@4.33.0: - dependencies: - '@bazel/runfiles': 6.3.1 - jszip: 3.10.1 - tmp: 0.2.3 - ws: 8.18.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - selfsigned@2.4.1: - dependencies: - '@types/node-forge': 1.3.11 - node-forge: 1.3.1 - - semver-diff@2.1.0: - dependencies: - semver: 5.7.2 - - semver@5.3.0: {} - - semver@5.7.2: {} - - semver@6.3.1: {} - - semver@7.7.2: {} - - 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 - transitivePeerDependencies: - - supports-color - - send@1.2.0: - dependencies: - debug: 4.4.1(supports-color@8.1.1) - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 2.0.0 - http-errors: 2.0.0 - mime-types: 3.0.1 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color - - serialize-error@8.1.0: - dependencies: - type-fest: 0.20.2 - - serialize-javascript@1.9.1: {} - - serialize-javascript@4.0.0: - dependencies: - randombytes: 2.1.0 - - serialize-javascript@5.0.1: - dependencies: - randombytes: 2.1.0 - - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 - - serve-favicon@2.5.1: - dependencies: - etag: 1.8.1 - fresh: 0.5.2 - ms: 2.1.3 - parseurl: 1.3.3 - safe-buffer: 5.2.1 - - serve-index@1.9.1: - dependencies: - accepts: 1.3.8 - batch: 0.6.1 - debug: 2.6.9 - escape-html: 1.0.3 - http-errors: 1.6.3 - mime-types: 2.1.35 - parseurl: 1.3.3 - transitivePeerDependencies: - - supports-color - - serve-static@1.16.2: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.0 - transitivePeerDependencies: - - supports-color - - serve-static@2.2.0: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 1.2.0 - transitivePeerDependencies: - - supports-color - - serviceworker-cache-polyfill@4.0.0: {} - - set-blocking@2.0.0: {} - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - - set-proto@1.0.0: - dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - - set-value@4.1.0: - dependencies: - is-plain-object: 2.0.4 - is-primitive: 3.0.1 - - setimmediate@1.0.5: {} - - setprototypeof@1.1.0: {} - - setprototypeof@1.2.0: {} - - sha.js@2.4.11: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - - shallow-clone@3.0.1: - dependencies: - kind-of: 6.0.3 - - shallowequal@1.1.0: {} - - shebang-command@1.2.0: - dependencies: - shebang-regex: 1.0.0 - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@1.0.0: {} - - shebang-regex@3.0.0: {} - - shell-exec@1.0.2: {} - - shell-quote@1.6.1: - dependencies: - array-filter: 0.0.1 - array-map: 0.0.1 - array-reduce: 0.0.0 - jsonify: 0.0.1 - - shell-quote@1.8.3: {} - - shelljs@0.8.5: - dependencies: - glob: 7.2.3 - interpret: 1.4.0 - rechoir: 0.6.2 - - shellwords@0.1.1: {} - - shimmer@1.2.1: {} - - short-unique-id@5.3.2: {} - - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - - side-channel-weakmap@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - - signal-exit@3.0.7: {} - - signal-exit@4.1.0: {} - - simple-concat@1.0.1: {} - - simple-get@4.0.1: - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - - sisteransi@1.0.5: {} - - size-limit@11.2.0: - dependencies: - bytes-iec: 3.1.1 - chokidar: 4.0.3 - jiti: 2.4.2 - lilconfig: 3.1.3 - nanospinner: 1.2.2 - picocolors: 1.1.1 - tinyglobby: 0.2.14 - - slash@1.0.0: {} - - slash@2.0.0: {} - - slash@3.0.0: {} - - slash@4.0.0: {} - - 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 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - - slice-ansi@5.0.0: - dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 4.0.0 - - slice-ansi@7.1.0: - dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 5.0.0 - - slugify@1.6.6: {} - - smart-buffer@4.2.0: {} - - sockjs-client@1.1.5: - dependencies: - debug: 2.6.9 - eventsource: 0.1.6 - faye-websocket: 0.11.4 - inherits: 2.0.4 - json3: 3.3.3 - url-parse: 1.5.10 - transitivePeerDependencies: - - supports-color - - sockjs@0.3.24: - dependencies: - faye-websocket: 0.11.4 - uuid: 8.3.2 - websocket-driver: 0.7.4 - - socks-proxy-agent@6.2.1: - dependencies: - agent-base: 6.0.2 - debug: 4.4.1(supports-color@8.1.1) - socks: 2.8.5 - transitivePeerDependencies: - - supports-color - - socks-proxy-agent@7.0.0: - dependencies: - agent-base: 6.0.2 - debug: 4.4.1(supports-color@8.1.1) - socks: 2.8.5 - transitivePeerDependencies: - - supports-color - - socks@2.8.5: - dependencies: - ip-address: 9.0.5 - smart-buffer: 4.2.0 - - sort-keys@1.1.2: - dependencies: - is-plain-obj: 1.1.0 - - sorted-array-functions@1.3.0: {} - - source-list-map@2.0.1: {} - - source-map-js@1.2.1: {} - - source-map-loader@0.2.4: - dependencies: - async: 2.6.4 - loader-utils: 1.4.2 - - source-map-loader@5.0.0(webpack@5.100.2): - dependencies: - iconv-lite: 0.6.3 - source-map-js: 1.2.1 - webpack: 5.100.2(webpack-cli@4.10.0) - - source-map-resolve@0.6.0: - dependencies: - atob: 2.1.2 - decode-uri-component: 0.2.2 - - source-map-support@0.4.18: - dependencies: - source-map: 0.5.7 - - source-map-support@0.5.13: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.2.0: - dependencies: - amdefine: 1.0.1 - optional: true - - source-map@0.5.6: {} - - source-map@0.5.7: {} - - source-map@0.6.1: {} - - source-map@0.7.4: {} - - sourcemap-codec@1.4.8: {} - - space-separated-tokens@1.1.5: {} - - space-separated-tokens@2.0.2: {} - - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.21 - - spdx-exceptions@2.5.0: {} - - spdx-expression-parse@3.0.1: - dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.21 - - spdx-license-ids@3.0.21: {} - - spdy-transport@3.0.0: - dependencies: - debug: 4.4.1(supports-color@8.1.1) - detect-node: 2.1.0 - hpack.js: 2.1.6 - obuf: 1.1.2 - readable-stream: 3.6.2 - wbuf: 1.7.3 - transitivePeerDependencies: - - supports-color - - spdy@4.0.2: - dependencies: - debug: 4.4.1(supports-color@8.1.1) - handle-thing: 2.0.1 - http-deceiver: 1.2.7 - select-hose: 2.0.0 - spdy-transport: 3.0.0 - transitivePeerDependencies: - - supports-color - - sprintf-js@1.0.3: {} - - sprintf-js@1.1.3: {} - - sshpk@1.18.0: - dependencies: - asn1: 0.2.6 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - - ssri@5.3.0: - dependencies: - safe-buffer: 5.2.1 - - ssri@8.0.1: - dependencies: - minipass: 3.3.6 - - ssri@9.0.1: - dependencies: - minipass: 3.3.6 - - stable@0.1.8: {} - - stack-chain@1.3.7: {} - - stack-generator@2.0.10: - dependencies: - stackframe: 1.3.4 - - stack-trace@0.0.10: {} - - stack-utils@1.0.5: - dependencies: - escape-string-regexp: 2.0.0 - - stack-utils@2.0.6: - dependencies: - escape-string-regexp: 2.0.0 - - stackframe@1.3.4: {} - - stacktrace-gps@3.1.2: - dependencies: - source-map: 0.5.6 - stackframe: 1.3.4 - - stacktrace-js@2.0.2: - dependencies: - error-stack-parser: 2.1.4 - stack-generator: 2.0.10 - stacktrace-gps: 3.1.2 - - state-local@1.0.7: {} - - state-toggle@1.0.3: {} - - statuses@1.5.0: {} - - statuses@2.0.1: {} - - statuses@2.0.2: {} - - stdin-discarder@0.2.2: {} - - stdout-stream@1.4.1: - dependencies: - readable-stream: 2.3.8 - - stealthy-require@1.1.1: {} - - stop-iteration-iterator@1.1.0: - dependencies: - es-errors: 1.3.0 - internal-slot: 1.1.0 - - store2@2.14.4: {} - - storybook@8.6.14(prettier@3.6.2): - dependencies: - '@storybook/core': 8.6.14(prettier@3.6.2)(storybook@8.6.14(prettier@3.6.2)) - optionalDependencies: - prettier: 3.6.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - storybook@9.0.12(@testing-library/dom@10.4.0)(prettier@3.6.2): - dependencies: - '@storybook/global': 5.0.0 - '@testing-library/jest-dom': 6.6.3 - '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/expect': 3.0.9 - '@vitest/spy': 3.0.9 - better-opn: 3.0.2 - esbuild: 0.25.5 - esbuild-register: 3.6.0(esbuild@0.25.5) - recast: 0.23.11 - semver: 7.7.2 - ws: 8.18.2 - optionalDependencies: - prettier: 3.6.2 - transitivePeerDependencies: - - '@testing-library/dom' - - bufferutil - - supports-color - - utf-8-validate - - storybook@9.0.17(@testing-library/dom@10.4.0)(prettier@3.6.2): - dependencies: - '@storybook/global': 5.0.0 - '@testing-library/jest-dom': 6.6.3 - '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/expect': 3.2.4 - '@vitest/spy': 3.2.4 - better-opn: 3.0.2 - esbuild: 0.25.6 - esbuild-register: 3.6.0(esbuild@0.25.6) - recast: 0.23.11 - semver: 7.7.2 - ws: 8.18.3 - optionalDependencies: - prettier: 3.6.2 - transitivePeerDependencies: - - '@testing-library/dom' - - bufferutil - - supports-color - - utf-8-validate - - stream-each@1.2.3: - dependencies: - end-of-stream: 1.4.5 - stream-shift: 1.0.3 - - stream-shift@1.0.3: {} - - streamroller@3.1.5: - dependencies: - date-format: 4.0.14 - debug: 4.4.1(supports-color@8.1.1) - fs-extra: 8.1.0 - transitivePeerDependencies: - - supports-color - - strict-uri-encode@1.1.0: {} - - string-argv@0.3.2: {} - - string-hash@1.1.3: {} - - string-length@1.0.1: - dependencies: - strip-ansi: 3.0.1 - - string-length@3.1.0: - dependencies: - astral-regex: 1.0.0 - strip-ansi: 5.2.0 - - string-length@4.0.2: - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - - string-width@1.0.2: - dependencies: - code-point-at: 1.1.0 - is-fullwidth-code-point: 1.0.0 - strip-ansi: 3.0.1 - - string-width@2.1.1: - dependencies: - 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 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - string-width@7.2.0: - dependencies: - emoji-regex: 10.4.0 - get-east-asian-width: 1.3.0 - strip-ansi: 7.1.0 - - string.fromcodepoint@0.2.1: {} - - string.prototype.codepointat@0.2.1: {} - - string.prototype.includes@2.0.1: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - - 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-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-symbols: 1.1.0 - internal-slot: 1.1.0 - regexp.prototype.flags: 1.5.4 - set-function-name: 2.0.2 - side-channel: 1.1.0 - - string.prototype.padend@3.1.6: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - - string.prototype.padstart@3.1.7: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - - string.prototype.repeat@1.0.0: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.24.0 - - string.prototype.trim@1.2.10: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 - - string.prototype.trimend@1.0.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - string_decoder@0.10.31: {} - - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - - stringify-entities@4.0.4: - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - - strip-ansi@3.0.1: - dependencies: - ansi-regex: 2.1.1 - - strip-ansi@4.0.0: - dependencies: - ansi-regex: 3.0.1 - - strip-ansi@5.2.0: - dependencies: - ansi-regex: 4.1.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.1.0 - - strip-bom@2.0.0: - dependencies: - is-utf8: 0.2.1 - - strip-bom@3.0.0: {} - - strip-bom@4.0.0: {} - - strip-eof@1.0.0: {} - - strip-final-newline@2.0.0: {} - - strip-final-newline@3.0.0: {} - - strip-indent@1.0.1: - dependencies: - get-stdin: 4.0.1 - - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 - - strip-indent@4.0.0: - dependencies: - min-indent: 1.0.1 - - strip-json-comments@2.0.1: {} - - strip-json-comments@3.1.1: {} - - strip-outer@1.0.1: - dependencies: - escape-string-regexp: 1.0.5 - - strnum@1.1.2: {} - - strnum@2.1.1: {} - - strtok3@7.1.1: - dependencies: - '@tokenizer/token': 0.3.0 - peek-readable: 5.4.2 - - structured-source@4.0.0: - dependencies: - boundary: 2.0.0 - - style-inject@0.3.0: {} - - style-loader@0.19.0: - dependencies: - loader-utils: 1.4.2 - schema-utils: 0.3.0 - - style-loader@1.3.0(webpack@5.100.2): - dependencies: - loader-utils: 2.0.4 - schema-utils: 2.7.1 - webpack: 5.100.2(webpack-cli@4.10.0) - - style-loader@2.0.0(webpack@5.100.2): - dependencies: - loader-utils: 2.0.4 - schema-utils: 3.3.0 - webpack: 5.100.2(webpack-cli@4.10.0) - - style-loader@3.3.4(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)): - dependencies: - webpack: 5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6) - - style-loader@3.3.4(webpack@5.100.2): - dependencies: - webpack: 5.100.2(webpack-cli@6.0.1) - - style-loader@4.0.0(webpack@5.100.2): - dependencies: - webpack: 5.100.2(webpack-cli@4.10.0) - - style-mod@4.1.2: {} - - style-to-js@1.1.17: - dependencies: - style-to-object: 1.0.9 - - style-to-object@0.3.0: - dependencies: - inline-style-parser: 0.1.1 - - style-to-object@1.0.9: - dependencies: - inline-style-parser: 0.2.4 - - style-value-types@5.0.0: - dependencies: - hey-listen: 1.0.8 - tslib: 2.8.1 - - stylehacks@5.1.1(postcss@8.5.6): - dependencies: - browserslist: 4.25.1 - postcss: 8.5.6 - postcss-selector-parser: 6.1.2 - - stylelint-config-recommended@16.0.0(stylelint@16.21.0(typescript@5.8.3)): - dependencies: - stylelint: 16.21.0(typescript@5.8.3) - - stylelint-config-standard@38.0.0(stylelint@16.21.0(typescript@5.8.3)): - dependencies: - stylelint: 16.21.0(typescript@5.8.3) - stylelint-config-recommended: 16.0.0(stylelint@16.21.0(typescript@5.8.3)) - - stylelint@16.21.0(typescript@5.8.3): - dependencies: - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@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.0) - '@dual-bundle/import-meta-resolve': 4.1.0 - balanced-match: 2.0.0 - colord: 2.9.3 - cosmiconfig: 9.0.0(typescript@5.8.3) - css-functions-list: 3.2.3 - css-tree: 3.1.0 - debug: 4.4.1(supports-color@8.1.1) - fast-glob: 3.3.3 - fastest-levenshtein: 1.0.16 - file-entry-cache: 10.1.1 - global-modules: 2.0.0 - globby: 11.1.0 - globjoin: 0.1.4 - html-tags: 3.3.1 - ignore: 7.0.5 - imurmurhash: 0.1.4 - is-plain-object: 5.0.0 - known-css-properties: 0.37.0 - mathml-tag-names: 2.1.3 - meow: 13.2.0 - micromatch: 4.0.8 - normalize-path: 3.0.0 - picocolors: 1.1.1 - postcss: 8.5.6 - postcss-resolve-nested-selector: 0.1.6 - postcss-safe-parser: 7.0.1(postcss@8.5.6) - postcss-selector-parser: 7.1.0 - postcss-value-parser: 4.2.0 - resolve-from: 5.0.0 - string-width: 4.2.3 - supports-hyperlinks: 3.2.0 - svg-tags: 1.0.0 - table: 6.9.0 - write-file-atomic: 5.0.1 - transitivePeerDependencies: - - supports-color - - typescript - - stylis@4.2.0: {} - - subarg@1.0.0: - dependencies: - minimist: 1.2.8 - - sucrase@3.35.0: - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - commander: 4.1.1 - glob: 10.4.5 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.7 - ts-interface-checker: 0.1.13 - - supports-color@2.0.0: {} - - supports-color@3.2.3: - dependencies: - has-flag: 1.0.0 - - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - - supports-color@6.1.0: - dependencies: - has-flag: 3.0.0 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - supports-hyperlinks@2.3.0: - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - - supports-hyperlinks@3.2.0: - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - svg-pathdata@1.0.4: - dependencies: - readable-stream: 2.0.6 - - svg-pathdata@6.0.3: {} - - svg-tags@1.0.0: {} - - svg-url-loader@8.0.0(webpack@5.100.2): - dependencies: - file-loader: 6.2.0(webpack@5.100.2) - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - - svg2ttf@4.3.0: - dependencies: - argparse: 1.0.10 - cubic2quad: 1.2.1 - lodash: 4.17.21 - microbuffer: 1.0.0 - svgpath: 2.6.0 - xmldom: '@xmldom/xmldom@0.8.10' - - svg2ttf@6.0.3: - dependencies: - '@xmldom/xmldom': 0.7.13 - argparse: 2.0.1 - cubic2quad: 1.2.1 - lodash: 4.17.21 - microbuffer: 1.0.0 - svgpath: 2.6.0 - - svgicons2svgfont@12.0.0: - dependencies: - commander: 9.5.0 - glob: 8.1.0 - sax: 1.4.1 - svg-pathdata: 6.0.3 - - svgicons2svgfont@5.0.2: - dependencies: - commander: 2.20.3 - neatequal: 1.0.0 - readable-stream: 2.3.8 - sax: 1.4.1 - string.fromcodepoint: 0.2.1 - string.prototype.codepointat: 0.2.1 - svg-pathdata: 1.0.4 - - svgo@0.7.2: - dependencies: - coa: 1.0.4 - colors: 1.1.2 - csso: 2.3.2 - js-yaml: 3.7.0 - mkdirp: 0.5.6 - sax: 1.2.4 - whet.extend: 0.9.9 - - svgo@2.8.0: - dependencies: - '@trysound/sax': 0.2.0 - commander: 7.2.0 - css-select: 4.3.0 - css-tree: 1.1.3 - csso: 4.2.0 - picocolors: 1.1.1 - stable: 0.1.8 - - svgpath@2.6.0: {} - - sw-precache-webpack-plugin@0.11.4(webpack@5.100.2): - dependencies: - del: 2.2.2 - sw-precache: 5.2.1 - uglify-js: 3.19.3 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - - sw-precache@5.2.1: - dependencies: - dom-urls: 1.1.0 - es6-promise: 4.2.8 - glob: 7.2.3 - lodash.defaults: 4.2.0 - lodash.template: 4.5.0 - meow: 3.7.0 - mkdirp: 0.5.6 - pretty-bytes: 4.0.2 - sw-toolbox: 3.6.0 - update-notifier: 2.5.0 - - sw-toolbox@3.6.0: - dependencies: - path-to-regexp: 1.9.0 - serviceworker-cache-polyfill: 4.0.0 - - swagger-client@3.35.5: - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@scarf/scarf': 1.4.0 - '@swagger-api/apidom-core': 1.0.0-beta.43 - '@swagger-api/apidom-error': 1.0.0-beta.43 - '@swagger-api/apidom-json-pointer': 1.0.0-beta.43 - '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-beta.43 - '@swagger-api/apidom-reference': 1.0.0-beta.43 - '@swaggerexpert/cookie': 2.0.2 - deepmerge: 4.3.1 - fast-json-patch: 3.1.1 - js-yaml: 4.1.0 - neotraverse: 0.6.18 - node-abort-controller: 3.1.1 - node-fetch-commonjs: 3.3.2 - openapi-path-templating: 2.2.1 - openapi-server-url-templating: 1.3.0 - ramda: 0.30.1 - ramda-adjunct: 5.1.0(ramda@0.30.1) - transitivePeerDependencies: - - debug - - 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.27.6 - '@scarf/scarf': 1.4.0 - base64-js: 1.5.1 - classnames: 2.5.1 - css.escape: 1.5.1 - deep-extend: 0.6.0 - dompurify: 3.2.4 - ieee754: 1.2.1 - immutable: 3.8.2 - js-file-download: 0.4.12 - js-yaml: 4.1.0 - lodash: 4.17.21 - prop-types: 15.8.1 - randexp: 0.5.3 - randombytes: 2.1.0 - react: 18.2.0 - react-copy-to-clipboard: 5.1.0(react@18.2.0) - react-debounce-input: 3.3.0(react@18.2.0) - react-dom: 18.2.0(react@18.2.0) - react-immutable-proptypes: 2.2.0(immutable@3.8.2) - react-immutable-pure-component: 2.2.2(immutable@3.8.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react-inspector: 6.0.2(react@18.2.0) - react-redux: 9.2.0(@types/react@18.2.0)(react@18.2.0)(redux@5.0.1) - react-syntax-highlighter: 15.6.1(react@18.2.0) - redux: 5.0.1 - redux-immutable: 4.0.0(immutable@3.8.2) - remarkable: 2.0.1 - reselect: 5.1.1 - serialize-error: 8.1.0 - sha.js: 2.4.11 - swagger-client: 3.35.5 - url-parse: 1.5.10 - xml: 1.0.1 - xml-but-prettier: 1.0.1 - zenscroll: 4.0.2 - transitivePeerDependencies: - - '@types/react' - - debug - - swagger-ui-react@5.25.2(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - '@babel/runtime-corejs3': 7.27.6 - '@scarf/scarf': 1.4.0 - base64-js: 1.5.1 - classnames: 2.5.1 - css.escape: 1.5.1 - deep-extend: 0.6.0 - dompurify: 3.2.4 - ieee754: 1.2.1 - immutable: 3.8.2 - js-file-download: 0.4.12 - js-yaml: 4.1.0 - lodash: 4.17.21 - prop-types: 15.8.1 - randexp: 0.5.3 - randombytes: 2.1.0 - react: 18.2.0 - react-copy-to-clipboard: 5.1.0(react@18.2.0) - react-debounce-input: 3.3.0(react@18.2.0) - react-dom: 18.2.0(react@18.2.0) - react-immutable-proptypes: 2.2.0(immutable@3.8.2) - react-immutable-pure-component: 2.2.2(immutable@3.8.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react-inspector: 6.0.2(react@18.2.0) - react-redux: 9.2.0(@types/react@18.2.0)(react@18.2.0)(redux@5.0.1) - react-syntax-highlighter: 15.6.1(react@18.2.0) - redux: 5.0.1 - redux-immutable: 4.0.0(immutable@3.8.2) - remarkable: 2.0.1 - reselect: 5.1.1 - serialize-error: 8.1.0 - sha.js: 2.4.11 - swagger-client: 3.35.5 - url-parse: 1.5.10 - xml: 1.0.1 - xml-but-prettier: 1.0.1 - zenscroll: 4.0.2 - transitivePeerDependencies: - - '@types/react' - - debug - - swc-loader@0.2.6(@swc/core@1.12.5(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)): - dependencies: - '@swc/core': 1.12.5(@swc/helpers@0.5.17) - '@swc/counter': 0.1.3 - webpack: 5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6) - - symbol-tree@3.2.4: {} - - symbol.prototype.description@1.0.7: - dependencies: - call-bind: 1.0.8 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-symbol-description: 1.1.0 - gopd: 1.2.0 - has-symbols: 1.1.0 - object.getownpropertydescriptors: 2.1.8 - - synchronous-promise@2.0.17: {} - - system-architecture@0.1.0: {} - - tabbable@5.3.3: {} - - tabbable@6.2.0: {} - - table@5.4.6: - dependencies: - ajv: 6.12.6 - lodash: 4.17.21 - slice-ansi: 2.1.0 - string-width: 3.1.0 - - table@6.9.0: - dependencies: - ajv: 8.17.1 - lodash.truncate: 4.4.2 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - tailwindcss@3.4.17: - dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.6.0 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.3 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.7 - lilconfig: 3.1.3 - micromatch: 4.0.8 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.1.1 - postcss: 8.5.6 - postcss-import: 15.1.0(postcss@8.5.6) - postcss-js: 4.0.1(postcss@8.5.6) - postcss-load-config: 4.0.2(postcss@8.5.6) - postcss-nested: 6.2.0(postcss@8.5.6) - postcss-selector-parser: 6.1.2 - resolve: 1.22.10 - sucrase: 3.35.0 - transitivePeerDependencies: - - ts-node - - tailwindcss@4.1.10: {} - - tapable@0.2.9: {} - - tapable@1.1.3: {} - - tapable@2.2.2: {} - - tar-fs@1.16.5: - dependencies: - chownr: 1.1.4 - mkdirp: 0.5.6 - pump: 1.0.3 - tar-stream: 1.6.2 - - tar-fs@2.1.3: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.3 - tar-stream: 2.2.0 - - tar-stream@1.6.2: - dependencies: - bl: 1.2.3 - buffer-alloc: 1.2.0 - end-of-stream: 1.4.5 - fs-constants: 1.0.0 - readable-stream: 2.3.8 - to-buffer: 1.2.1 - xtend: 4.0.2 - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.5 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - - tar@2.2.2: - dependencies: - block-stream: 0.0.9 - fstream: 1.0.12 - inherits: 2.0.4 - - tar@6.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - - targz@1.0.1: - dependencies: - tar-fs: 1.16.5 - - tcp-port-used@1.0.2: - dependencies: - debug: 4.3.1 - is2: 2.0.9 - transitivePeerDependencies: - - supports-color - - telejson@6.0.8: - dependencies: - '@types/is-function': 1.0.3 - global: 4.4.0 - is-function: 1.0.2 - is-regex: 1.2.1 - is-symbol: 1.1.1 - isobject: 4.0.0 - lodash: 4.17.21 - memoizerific: 1.11.3 - - telejson@7.2.0: - dependencies: - memoizerific: 1.11.3 - - temp-dir@2.0.0: {} - - temp@0.8.4: - dependencies: - rimraf: 2.6.3 - - tempy@1.0.1: - dependencies: - del: 6.1.1 - is-stream: 2.0.1 - temp-dir: 2.0.0 - type-fest: 0.16.0 - unique-string: 2.0.0 - - term-size@1.2.0: - dependencies: - execa: 0.7.0 - - terminal-link@2.1.1: - dependencies: - ansi-escapes: 4.3.2 - supports-hyperlinks: 2.3.0 - - terser-webpack-plugin@4.2.3(webpack@5.100.2): - dependencies: - cacache: 15.3.0 - find-cache-dir: 3.3.2 - jest-worker: 26.6.2 - p-limit: 3.1.0 - schema-utils: 3.3.0 - serialize-javascript: 5.0.1 - source-map: 0.6.1 - terser: 5.43.1 - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-sources: 1.4.3 - transitivePeerDependencies: - - bluebird - - terser-webpack-plugin@5.3.14(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 4.3.2 - serialize-javascript: 6.0.2 - terser: 5.43.1 - webpack: 5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6) - optionalDependencies: - '@swc/core': 1.12.5(@swc/helpers@0.5.17) - esbuild: 0.25.6 - - terser-webpack-plugin@5.3.14(esbuild@0.25.5)(webpack@5.100.2): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 4.3.2 - serialize-javascript: 6.0.2 - terser: 5.43.1 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - optionalDependencies: - esbuild: 0.25.5 - - terser-webpack-plugin@5.3.14(webpack@5.100.2): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 4.3.2 - serialize-javascript: 6.0.2 - terser: 5.43.1 - webpack: 5.100.2(webpack-cli@4.10.0) - - terser@4.8.1: - dependencies: - acorn: 8.15.0 - commander: 2.20.3 - source-map: 0.6.1 - source-map-support: 0.5.21 - - terser@5.43.1: - dependencies: - '@jridgewell/source-map': 0.3.6 - acorn: 8.15.0 - commander: 2.20.3 - source-map-support: 0.5.21 - - test-exclude@4.2.3: - dependencies: - arrify: 1.0.1 - micromatch: 4.0.8 - object-assign: 4.1.1 - read-pkg-up: 1.0.1 - require-main-filename: 1.0.1 - - test-exclude@6.0.0: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - - test-exclude@7.0.1: - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 10.4.5 - minimatch: 9.0.5 - - text-hex@1.0.0: {} - - text-table@0.2.0: {} - - textextensions@6.11.0: - dependencies: - editions: 6.21.0 - - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - - thingies@1.21.0(tslib@2.8.1): - dependencies: - tslib: 2.8.1 - - throat@3.2.0: {} - - throat@5.0.0: {} - - through2@2.0.5: - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - - through2@3.0.0: - dependencies: - readable-stream: 3.6.2 - xtend: 4.0.2 - - through@2.3.8: {} - - thunky@1.1.0: {} - - 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 - - tiny-case@1.0.3: {} - - tiny-glob@0.2.9: - dependencies: - globalyzer: 0.1.0 - globrex: 0.1.2 - - tiny-invariant@1.3.3: {} - - tinyexec@0.3.2: {} - - tinyglobby@0.2.14: - dependencies: - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 - - tinyrainbow@1.2.0: {} - - tinyrainbow@2.0.0: {} - - tinyspy@3.0.2: {} - - tinyspy@4.0.3: {} - - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 - - tmp@0.2.3: {} - - tmpl@1.0.5: {} - - to-buffer@1.2.1: - dependencies: - isarray: 2.0.5 - safe-buffer: 5.2.1 - typed-array-buffer: 1.0.3 - - to-fast-properties@1.0.3: {} - - to-json-schema@0.2.5: - dependencies: - lodash.isequal: 4.5.0 - lodash.keys: 4.2.0 - lodash.merge: 4.6.2 - lodash.omit: 4.5.0 - lodash.without: 4.4.0 - lodash.xor: 4.5.0 - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - tocbot@4.36.4: {} - - toggle-selection@1.0.6: {} - - toidentifier@1.0.1: {} - - token-types@5.0.1: - dependencies: - '@tokenizer/token': 0.3.0 - ieee754: 1.2.1 - - toml@3.0.0: {} - - toposort@1.0.7: {} - - toposort@2.0.2: {} - - tough-cookie@2.5.0: - dependencies: - psl: 1.15.0 - punycode: 2.3.1 - - tough-cookie@3.0.1: - dependencies: - ip-regex: 2.1.0 - psl: 1.15.0 - punycode: 2.3.1 - - tough-cookie@4.1.4: - dependencies: - psl: 1.15.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - - tr46@0.0.3: {} - - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - - tr46@3.0.0: - dependencies: - punycode: 2.3.1 - - traverse@0.3.9: {} - - tree-dump@1.0.3(tslib@2.8.1): - dependencies: - tslib: 2.8.1 - - tree-kill@1.2.2: {} - - tree-sitter-json@0.24.8(tree-sitter@0.21.1): - dependencies: - node-addon-api: 8.4.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.4.0 - node-gyp-build: 4.8.4 - optional: true - - tree-sitter@0.22.4: - dependencies: - node-addon-api: 8.4.0 - node-gyp-build: 4.8.4 - optional: true - - trim-lines@3.0.1: {} - - trim-newlines@1.0.0: {} - - trim-newlines@3.0.1: {} - - trim-newlines@4.1.1: {} - - trim-repeated@1.0.0: - dependencies: - escape-string-regexp: 1.0.5 - - trim-right@1.0.1: {} - - trim-trailing-lines@1.1.4: {} - - trim@0.0.1: {} - - triple-beam@1.3.0: {} - - triple-beam@1.4.1: {} - - trough@1.0.5: {} - - trough@2.2.0: {} - - true-case-path@2.2.1: {} - - truncate-utf8-bytes@1.0.2: - dependencies: - utf8-byte-length: 1.0.5 - - 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): - dependencies: - typescript: 5.8.3 - - ts-dedent@2.2.0: {} - - ts-interface-checker@0.1.13: {} - - ts-jest@22.0.1(jest@20.0.4)(typescript@5.8.3): - dependencies: - babel-core: 6.26.3 - babel-plugin-istanbul: 4.1.6 - babel-plugin-transform-es2015-modules-commonjs: 6.26.2 - babel-preset-jest: 22.4.4 - cpx: 1.5.0 - fs-extra: 4.0.3 - jest: 20.0.4 - jest-config: 22.4.4 - pkg-dir: 2.0.0 - source-map-support: 0.5.21 - typescript: 5.8.3 - yargs: 10.1.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - ts-jest@25.5.1(jest@25.5.4)(typescript@3.9.10): - dependencies: - bs-logger: 0.2.6 - buffer-from: 1.1.2 - fast-json-stable-stringify: 2.1.0 - jest: 25.5.4 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - micromatch: 4.0.8 - mkdirp: 0.5.6 - semver: 6.3.1 - typescript: 3.9.10 - yargs-parser: 18.1.3 - - ts-jest@29.3.4(@babel/core@7.27.4)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.4))(jest@29.7.0(@types/node@22.15.32)(babel-plugin-macros@3.1.0))(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.32)(babel-plugin-macros@3.1.0) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.7.2 - type-fest: 4.41.0 - typescript: 5.8.3 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.27.4 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.27.4) - - ts-loader@2.3.7: - dependencies: - chalk: 2.4.2 - enhanced-resolve: 3.4.1 - loader-utils: 1.4.2 - semver: 5.7.2 - - ts-loader@9.5.2(typescript@5.8.3)(webpack@5.100.2): - dependencies: - chalk: 4.1.2 - enhanced-resolve: 5.18.1 - micromatch: 4.0.8 - semver: 7.7.2 - source-map: 0.7.4 - typescript: 5.8.3 - webpack: 5.100.2(webpack-cli@4.10.0) - - ts-mixer@6.0.4: {} - - ts-morph@22.0.0: - dependencies: - '@ts-morph/common': 0.23.0 - code-block-writer: 13.0.3 - - ts-morph@26.0.0: - dependencies: - '@ts-morph/common': 0.27.0 - code-block-writer: 13.0.3 - - ts-pnp@1.2.0(typescript@4.9.5): - optionalDependencies: - typescript: 4.9.5 - - ts-pnp@1.2.0(typescript@5.8.3): - optionalDependencies: - typescript: 5.8.3 - - ts-toolbelt@9.6.0: {} - - tsconfig-paths-webpack-plugin@2.0.0: - dependencies: - chalk: 2.4.2 - tsconfig-paths: 3.15.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - - tsconfig-paths@4.2.0: - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - - tsdx@0.14.1(@types/babel__core@7.20.5)(@types/node@22.15.32): - dependencies: - '@babel/core': 7.27.4 - '@babel/helper-module-imports': 7.27.1 - '@babel/parser': 7.27.5 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.4) - '@babel/preset-env': 7.27.2(@babel/core@7.27.4) - '@babel/traverse': 7.27.4 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.27.4)(@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@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@6.8.0)(typescript@3.9.10) - '@typescript-eslint/parser': 2.34.0(eslint@6.8.0)(typescript@3.9.10) - ansi-escapes: 4.3.2 - asyncro: 3.0.0 - babel-eslint: 10.1.0(eslint@6.8.0) - babel-plugin-annotate-pure-calls: 0.4.0(@babel/core@7.27.4) - babel-plugin-dev-expression: 0.2.3(@babel/core@7.27.4) - babel-plugin-macros: 2.8.0 - babel-plugin-polyfill-regenerator: 0.0.4(@babel/core@7.27.4) - babel-plugin-transform-rename-import: 2.3.0 - 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@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@6.8.0)(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(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(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(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)(typescript@3.9.10) - eslint-plugin-flowtype: 3.13.0(eslint@6.8.0) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@2.34.0(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(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) - execa: 4.1.0 - fs-extra: 9.1.0 - jest: 25.5.4 - jest-watch-typeahead: 0.5.0 - jpjs: 1.2.1 - lodash.merge: 4.6.2 - ora: 4.1.1 - pascal-case: 3.1.2 - prettier: 1.19.1 - progress-estimator: 0.2.2 - regenerator-runtime: 0.13.11 - rollup: 1.32.1 - rollup-plugin-sourcemaps: 0.6.3(@types/node@22.15.32)(rollup@1.32.1) - rollup-plugin-terser: 5.3.1(rollup@1.32.1) - rollup-plugin-typescript2: 0.27.3(rollup@1.32.1)(typescript@3.9.10) - sade: 1.8.1 - semver: 7.7.2 - shelljs: 0.8.5 - tiny-glob: 0.2.9 - ts-jest: 25.5.1(jest@25.5.4)(typescript@3.9.10) - tslib: 1.14.1 - typescript: 3.9.10 - transitivePeerDependencies: - - '@types/babel__core' - - '@types/node' - - bufferutil - - canvas - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - utf-8-validate - - tslib@1.14.1: {} - - tslib@2.0.1: {} - - tslib@2.8.1: {} - - tslint-config-prettier@1.18.0: {} - - tslint-react-hooks@2.2.2(tslint@6.1.3(typescript@4.9.5))(typescript@4.9.5): - dependencies: - tslint: 6.1.3(typescript@4.9.5) - typescript: 4.9.5 - - tslint-react-hooks@2.2.2(tslint@6.1.3(typescript@5.8.3))(typescript@5.8.3): - dependencies: - tslint: 6.1.3(typescript@5.8.3) - typescript: 5.8.3 - - tslint-react@3.6.0(tslint@5.20.1(typescript@5.8.3))(typescript@5.8.3): - dependencies: - tslint: 5.20.1(typescript@5.8.3) - tsutils: 2.29.0(typescript@5.8.3) - typescript: 5.8.3 - - tslint-react@4.2.0(tslint@6.1.3(typescript@4.9.5))(typescript@4.9.5): - dependencies: - tslint: 6.1.3(typescript@4.9.5) - tsutils: 3.21.0(typescript@4.9.5) - typescript: 4.9.5 - - tslint-react@5.0.0(tslint@6.1.3(typescript@4.9.5))(typescript@4.9.5): - dependencies: - tslint: 6.1.3(typescript@4.9.5) - tsutils: 3.21.0(typescript@4.9.5) - typescript: 4.9.5 - - tslint-react@5.0.0(tslint@6.1.3(typescript@5.8.3))(typescript@5.8.3): - dependencies: - tslint: 6.1.3(typescript@5.8.3) - tsutils: 3.21.0(typescript@5.8.3) - typescript: 5.8.3 - - tslint@5.20.1(typescript@5.8.3): - dependencies: - '@babel/code-frame': 7.27.1 - builtin-modules: 1.1.1 - chalk: 2.4.2 - commander: 2.20.3 - diff: 4.0.2 - glob: 7.2.3 - js-yaml: 3.14.1 - minimatch: 3.1.2 - mkdirp: 0.5.6 - resolve: 1.6.0 - semver: 5.7.2 - tslib: 1.14.1 - tsutils: 2.29.0(typescript@5.8.3) - typescript: 5.8.3 - - tslint@6.1.3(typescript@4.9.5): - dependencies: - '@babel/code-frame': 7.27.1 - builtin-modules: 1.1.1 - chalk: 2.4.2 - commander: 2.20.3 - diff: 4.0.2 - glob: 7.2.3 - js-yaml: 3.14.1 - minimatch: 3.1.2 - mkdirp: 0.5.6 - resolve: 1.22.10 - semver: 5.7.2 - tslib: 1.14.1 - tsutils: 2.29.0(typescript@4.9.5) - typescript: 4.9.5 - - tslint@6.1.3(typescript@5.8.3): - dependencies: - '@babel/code-frame': 7.27.1 - builtin-modules: 1.1.1 - chalk: 2.4.2 - commander: 2.20.3 - diff: 4.0.2 - glob: 7.2.3 - js-yaml: 3.14.1 - minimatch: 3.1.2 - mkdirp: 0.5.6 - resolve: 1.22.10 - semver: 5.7.2 - tslib: 1.14.1 - tsutils: 2.29.0(typescript@5.8.3) - typescript: 5.8.3 - - tsutils@2.29.0(typescript@4.9.5): - dependencies: - tslib: 1.14.1 - typescript: 4.9.5 - - tsutils@2.29.0(typescript@5.8.3): - dependencies: - tslib: 1.14.1 - typescript: 5.8.3 - - tsutils@3.21.0(typescript@3.9.10): - dependencies: - tslib: 1.14.1 - typescript: 3.9.10 - - tsutils@3.21.0(typescript@4.9.5): - dependencies: - tslib: 1.14.1 - typescript: 4.9.5 - - tsutils@3.21.0(typescript@5.8.3): - dependencies: - 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 - microbuffer: 1.0.0 - - ttf2eot@3.1.0: - dependencies: - argparse: 2.0.1 - - ttf2woff2@2.0.3: - dependencies: - bindings: 1.5.0 - bufferstreams: 1.1.3 - nan: 2.22.2 - node-gyp: 3.8.0 - - ttf2woff2@5.0.0: - dependencies: - bindings: 1.5.0 - bufferstreams: 3.0.0 - nan: 2.22.2 - node-gyp: 9.4.1 - transitivePeerDependencies: - - bluebird - - supports-color - - ttf2woff@2.0.2: - dependencies: - argparse: 1.0.10 - microbuffer: 1.0.0 - pako: 1.0.11 - - ttf2woff@3.0.0: - dependencies: - argparse: 2.0.1 - pako: 1.0.11 - - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - - tunnel@0.0.6: {} - - tweetnacl@0.14.5: {} - - type-check@0.3.2: - dependencies: - prelude-ls: 1.1.2 - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-detect@4.0.8: {} - - type-detect@4.1.0: {} - - type-fest@0.16.0: {} - - type-fest@0.18.1: {} - - type-fest@0.20.2: {} - - type-fest@0.21.3: {} - - type-fest@0.6.0: {} - - type-fest@0.8.1: {} - - type-fest@1.4.0: {} - - type-fest@2.19.0: {} - - type-fest@3.13.1: {} - - type-fest@4.41.0: {} - - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - - type-is@2.0.1: - dependencies: - content-type: 1.0.5 - media-typer: 1.1.0 - mime-types: 3.0.1 - - type@2.7.3: {} - - typed-array-buffer@1.0.3: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-typed-array: 1.1.15 - - typed-array-byte-length@1.0.3: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - - typed-array-byte-offset@1.0.4: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.10 - - typed-array-length@1.0.7: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - is-typed-array: 1.1.15 - possible-typed-array-names: 1.1.0 - reflect.getprototypeof: 1.0.10 - - typed-rest-client@1.8.11: - dependencies: - qs: 6.14.0 - tunnel: 0.0.6 - underscore: 1.13.7 - - typedarray-to-buffer@3.1.5: - dependencies: - is-typedarray: 1.0.0 - - typedarray@0.0.6: {} - - types-ramda@0.30.1: - dependencies: - ts-toolbelt: 9.6.0 - - typescript@3.9.10: {} - - typescript@4.9.5: {} - - typescript@5.8.3: {} - - ua-parser-js@1.0.40: {} - - uc.micro@1.0.6: {} - - uc.micro@2.1.0: {} - - ufo@1.6.1: {} - - uglify-es@3.3.9: - dependencies: - commander: 2.13.0 - source-map: 0.6.1 - - uglify-js@3.19.3: {} - - uglify-js@3.4.10: - dependencies: - commander: 2.19.0 - source-map: 0.6.1 - - uglifyjs-webpack-plugin@1.2.5(webpack@5.100.2): - dependencies: - cacache: 10.0.4 - find-cache-dir: 1.0.0 - schema-utils: 0.4.7 - serialize-javascript: 1.9.1 - source-map: 0.6.1 - uglify-es: 3.3.9 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - webpack-sources: 1.4.3 - worker-farm: 1.7.0 - - unbox-primitive@1.1.0: - dependencies: - call-bound: 1.0.4 - has-bigints: 1.1.0 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 - - underscore@1.13.7: {} - - undici-types@5.26.5: {} - - undici-types@6.21.0: {} - - undici-types@7.8.0: {} - - undici@7.10.0: {} - - unfetch@4.2.0: {} - - unherit@1.1.3: - dependencies: - inherits: 2.0.4 - xtend: 4.0.2 - - unicode-canonical-property-names-ecmascript@2.0.1: {} - - unicode-match-property-ecmascript@2.0.0: - dependencies: - unicode-canonical-property-names-ecmascript: 2.0.1 - unicode-property-aliases-ecmascript: 2.1.0 - - unicode-match-property-value-ecmascript@2.2.0: {} - - unicode-property-aliases-ecmascript@2.1.0: {} - - unicorn-magic@0.1.0: {} - - unicorn-magic@0.3.0: {} - - unified@10.1.2: - dependencies: - '@types/unist': 2.0.11 - bail: 2.0.2 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 4.1.0 - trough: 2.2.0 - vfile: 5.3.7 - - unified@11.0.5: - dependencies: - '@types/unist': 3.0.3 - bail: 2.0.2 - devlop: 1.1.0 - extend: 3.0.2 - is-plain-obj: 4.1.0 - trough: 2.2.0 - vfile: 6.0.3 - - unified@9.2.0: - dependencies: - '@types/unist': 2.0.11 - bail: 1.0.5 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 2.1.0 - trough: 1.0.5 - vfile: 4.2.1 - - union@0.5.0: - dependencies: - qs: 6.14.0 - - uniq@1.0.1: {} - - uniqs@2.0.0: {} - - unique-filename@1.1.1: - dependencies: - unique-slug: 2.0.2 - - unique-filename@2.0.1: - dependencies: - unique-slug: 3.0.0 - - unique-slug@2.0.2: - dependencies: - imurmurhash: 0.1.4 - - unique-slug@3.0.0: - dependencies: - imurmurhash: 0.1.4 - - unique-string@1.0.0: - dependencies: - crypto-random-string: 1.0.0 - - unique-string@2.0.0: - dependencies: - crypto-random-string: 2.0.0 - - unist-builder@2.0.3: {} - - unist-builder@3.0.1: - dependencies: - '@types/unist': 2.0.11 - - unist-util-generated@1.1.6: {} - - unist-util-generated@2.0.1: {} - - unist-util-is@4.1.0: {} - - unist-util-is@5.2.1: - dependencies: - '@types/unist': 2.0.11 - - unist-util-is@6.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-position@3.1.0: {} - - unist-util-position@4.0.4: - dependencies: - '@types/unist': 2.0.11 - - unist-util-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-remove-position@2.0.1: - dependencies: - unist-util-visit: 2.0.3 - - unist-util-remove@2.1.0: - dependencies: - unist-util-is: 4.1.0 - - unist-util-stringify-position@2.0.3: - dependencies: - '@types/unist': 2.0.11 - - unist-util-stringify-position@3.0.3: - dependencies: - '@types/unist': 2.0.11 - - unist-util-stringify-position@4.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-visit-parents@3.1.1: - dependencies: - '@types/unist': 2.0.11 - unist-util-is: 4.1.0 - - unist-util-visit-parents@5.1.3: - dependencies: - '@types/unist': 2.0.11 - unist-util-is: 5.2.1 - - unist-util-visit-parents@6.0.1: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - - unist-util-visit@2.0.3: - dependencies: - '@types/unist': 2.0.11 - unist-util-is: 4.1.0 - unist-util-visit-parents: 3.1.1 - - unist-util-visit@4.1.2: - dependencies: - '@types/unist': 2.0.11 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - - unist-util-visit@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - - unit-compare@1.0.1: - dependencies: - moment: 2.30.1 - - universalify@0.1.2: {} - - universalify@0.2.0: {} - - universalify@2.0.1: {} - - unpipe@1.0.0: {} - - unplugin@1.16.1: - dependencies: - acorn: 8.15.0 - webpack-virtual-modules: 0.6.2 - - unraw@3.0.0: {} - - untildify@2.1.0: - dependencies: - os-homedir: 1.0.2 - optional: true - - untildify@4.0.0: {} - - unzip-response@2.0.1: {} - - unzipper@0.10.14: - dependencies: - big-integer: 1.6.52 - binary: 0.3.0 - bluebird: 3.4.7 - buffer-indexof-polyfill: 1.0.2 - duplexer2: 0.1.4 - fstream: 1.0.12 - graceful-fs: 4.2.11 - listenercount: 1.0.1 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - - unzipper@0.12.3: - dependencies: - bluebird: 3.7.2 - duplexer2: 0.1.4 - fs-extra: 11.3.0 - graceful-fs: 4.2.11 - node-int64: 0.4.0 - - upath@2.0.1: {} - - update-browserslist-db@1.1.3(browserslist@4.25.0): - dependencies: - browserslist: 4.25.0 - escalade: 3.2.0 - picocolors: 1.1.1 - - update-browserslist-db@1.1.3(browserslist@4.25.1): - dependencies: - browserslist: 4.25.1 - escalade: 3.2.0 - picocolors: 1.1.1 - - update-notifier@2.5.0: - dependencies: - boxen: 1.3.0 - chalk: 2.4.2 - configstore: 3.1.5 - import-lazy: 2.1.0 - is-ci: 1.2.1 - is-installed-globally: 0.1.0 - is-npm: 1.0.0 - latest-version: 3.1.0 - semver-diff: 2.1.0 - xdg-basedir: 3.0.0 - - upper-case@1.1.3: {} - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - urijs@1.19.11: {} - - url-join@1.1.0: {} - - url-join@4.0.1: {} - - url-loader@0.6.2(file-loader@1.1.5(webpack@5.100.2)): - dependencies: - file-loader: 1.1.5(webpack@5.100.2) - 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.100.2))(webpack@5.100.2): - dependencies: - loader-utils: 2.0.4 - mime-types: 2.1.35 - schema-utils: 3.3.0 - webpack: 5.100.2(webpack-cli@4.10.0) - optionalDependencies: - file-loader: 6.2.0(webpack@5.100.2) - - url-parse-lax@1.0.0: - dependencies: - prepend-http: 1.0.4 - - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - - url@0.11.4: - dependencies: - punycode: 1.4.1 - qs: 6.14.0 - - use-callback-ref@1.3.3(@types/react@18.2.0)(react@18.2.0): - dependencies: - react: 18.2.0 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 18.2.0 - - use-composed-ref@1.4.0(@types/react@18.2.0)(react@18.2.0): - dependencies: - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - use-isomorphic-layout-effect@1.2.1(@types/react@18.2.0)(react@18.2.0): - dependencies: - react: 18.2.0 - optionalDependencies: - '@types/react': 18.2.0 - - use-latest@1.3.0(@types/react@18.2.0)(react@18.2.0): - dependencies: - react: 18.2.0 - use-isomorphic-layout-effect: 1.2.1(@types/react@18.2.0)(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - - use-resize-observer@9.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): - dependencies: - '@juggle/resize-observer': 3.4.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - - use-sidecar@1.1.3(@types/react@18.2.0)(react@18.2.0): - dependencies: - detect-node-es: 1.1.0 - react: 18.2.0 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 18.2.0 - - use-sync-external-store@1.5.0(react@18.2.0): - dependencies: - react: 18.2.0 - - use-sync-external-store@1.5.0(react@19.1.0): - dependencies: - react: 19.1.0 - - utf8-byte-length@1.0.5: {} - - util-deprecate@1.0.2: {} - - util.promisify@1.0.0: - dependencies: - define-properties: 1.2.1 - object.getownpropertydescriptors: 2.1.8 - - util@0.10.4: - dependencies: - inherits: 2.0.3 - - util@0.12.5: - dependencies: - inherits: 2.0.4 - is-arguments: 1.2.0 - is-generator-function: 1.1.0 - is-typed-array: 1.1.15 - which-typed-array: 1.1.19 - - utila@0.4.0: {} - - utils-merge@1.0.1: {} - - uuid-browser@3.1.0: {} - - uuid@11.1.0: {} - - uuid@3.4.0: {} - - uuid@8.3.2: {} - - uuid@9.0.1: {} - - uvu@0.5.6: - dependencies: - dequal: 2.0.3 - diff: 5.2.0 - kleur: 4.1.5 - sade: 1.8.1 - - v8-compile-cache@2.4.0: {} - - v8-to-istanbul@4.1.4: - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 1.9.0 - source-map: 0.7.4 - - v8-to-istanbul@9.3.0: - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 - - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - - varstream@0.3.2: - dependencies: - readable-stream: 1.1.14 - - vary@1.1.2: {} - - vendors@1.0.4: {} - - verror@1.10.0: - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.3.0 - - version-range@4.14.0: {} - - vfile-location@3.2.0: {} - - vfile-location@4.1.0: - dependencies: - '@types/unist': 2.0.11 - vfile: 5.3.7 - - vfile-location@5.0.3: - dependencies: - '@types/unist': 3.0.3 - vfile: 6.0.3 - - vfile-message@2.0.4: - dependencies: - '@types/unist': 2.0.11 - unist-util-stringify-position: 2.0.3 - - vfile-message@3.1.4: - dependencies: - '@types/unist': 2.0.11 - unist-util-stringify-position: 3.0.3 - - vfile-message@4.0.2: - dependencies: - '@types/unist': 3.0.3 - unist-util-stringify-position: 4.0.0 - - vfile@4.2.1: - dependencies: - '@types/unist': 2.0.11 - is-buffer: 2.0.5 - unist-util-stringify-position: 2.0.3 - vfile-message: 2.0.4 - - vfile@5.3.7: - dependencies: - '@types/unist': 2.0.11 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - - vfile@6.0.3: - dependencies: - '@types/unist': 3.0.3 - vfile-message: 4.0.2 - - vite@6.3.5(@types/node@24.0.14)(jiti@2.4.2)(sass@1.89.2)(terser@5.43.1)(yaml@2.8.0): - dependencies: - esbuild: 0.25.5 - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 - postcss: 8.5.6 - rollup: 4.44.0 - tinyglobby: 0.2.14 - optionalDependencies: - '@types/node': 24.0.14 - fsevents: 2.3.3 - jiti: 2.4.2 - sass: 1.89.2 - terser: 5.43.1 - yaml: 2.8.0 - - vscode-debugadapter-testsupport@1.51.0: - dependencies: - vscode-debugprotocol: 1.51.0 - - vscode-debugadapter@1.51.0: - dependencies: - mkdirp: 1.0.4 - vscode-debugprotocol: 1.51.0 - - vscode-debugprotocol@1.51.0: {} - - vscode-extension-telemetry@0.1.7: - dependencies: - applicationinsights: 1.7.4 - - vscode-extension-tester-locators@3.12.2(monaco-page-objects@3.14.1(selenium-webdriver@4.33.0)(typescript@5.8.3))(selenium-webdriver@4.33.0): - dependencies: - monaco-page-objects: 3.14.1(selenium-webdriver@4.33.0)(typescript@5.8.3) - selenium-webdriver: 4.33.0 - - vscode-extension-tester@5.10.0(mocha@10.8.2)(typescript@5.8.3): - dependencies: - '@types/selenium-webdriver': 4.1.28 - '@vscode/vsce': 2.32.0 - commander: 11.1.0 - compare-versions: 6.1.1 - fs-extra: 11.3.0 - glob: 10.4.5 - got: 13.0.0 - hpagent: 1.2.0 - js-yaml: 4.1.0 - mocha: 10.8.2 - monaco-page-objects: 3.14.1(selenium-webdriver@4.33.0)(typescript@5.8.3) - sanitize-filename: 1.6.3 - selenium-webdriver: 4.33.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.33.0)(typescript@5.8.3))(selenium-webdriver@4.33.0) - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - vscode-extension-tester@8.14.1(mocha@11.7.0)(typescript@5.8.3): - dependencies: - '@redhat-developer/locators': 1.13.0(@redhat-developer/page-objects@1.13.0(selenium-webdriver@4.33.0)(typescript@5.8.3))(selenium-webdriver@4.33.0) - '@redhat-developer/page-objects': 1.13.0(selenium-webdriver@4.33.0)(typescript@5.8.3) - '@types/selenium-webdriver': 4.1.28 - '@vscode/vsce': 3.4.2 - c8: 10.1.3 - commander: 13.1.0 - compare-versions: 6.1.1 - find-up: 7.0.0 - fs-extra: 11.3.0 - glob: 11.0.3 - got: 14.4.7 - hpagent: 1.2.0 - js-yaml: 4.1.0 - mocha: 11.7.0 - sanitize-filename: 1.6.3 - selenium-webdriver: 4.33.0 - targz: 1.0.1 - typescript: 5.8.3 - unzipper: 0.12.3 - transitivePeerDependencies: - - bufferutil - - monocart-coverage-reports - - supports-color - - utf-8-validate - - vscode-jsonrpc@6.0.0: {} - - vscode-jsonrpc@8.1.0: {} - - vscode-jsonrpc@8.2.0: {} - - vscode-jsonrpc@8.2.1: {} - - vscode-languageclient@7.0.0: - dependencies: - minimatch: 3.1.2 - semver: 7.7.2 - vscode-languageserver-protocol: 3.16.0 - - vscode-languageclient@8.1.0: - dependencies: - minimatch: 5.1.6 - semver: 7.7.2 - vscode-languageserver-protocol: 3.17.3 - - vscode-languageclient@9.0.1: - dependencies: - minimatch: 5.1.6 - semver: 7.7.2 - vscode-languageserver-protocol: 3.17.5 - - vscode-languageserver-protocol@3.16.0: - dependencies: - vscode-jsonrpc: 6.0.0 - vscode-languageserver-types: 3.16.0 - - vscode-languageserver-protocol@3.17.3: - dependencies: - vscode-jsonrpc: 8.1.0 - vscode-languageserver-types: 3.17.3 - - vscode-languageserver-protocol@3.17.5: - dependencies: - vscode-jsonrpc: 8.2.0 - vscode-languageserver-types: 3.17.5 - - vscode-languageserver-textdocument@1.0.12: {} - - vscode-languageserver-types@3.16.0: {} - - vscode-languageserver-types@3.17.3: {} - - vscode-languageserver-types@3.17.5: {} - - vscode-messenger-common@0.4.5: {} - - vscode-messenger-common@0.5.1: {} - - vscode-messenger-webview@0.5.1: - dependencies: - vscode-messenger-common: 0.5.1 - - vscode-messenger@0.4.5: - dependencies: - vscode-messenger-common: 0.4.5 - - vscode-messenger@0.5.1: - dependencies: - vscode-messenger-common: 0.5.1 - - vscode-test@1.6.1: - dependencies: - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.1 - rimraf: 3.0.2 - unzipper: 0.10.14 - transitivePeerDependencies: - - supports-color - - vscode-uri@3.1.0: {} - - vscode-ws-jsonrpc@3.4.0: - dependencies: - vscode-jsonrpc: 8.2.1 - - w3c-hr-time@1.0.2: - dependencies: - browser-process-hrtime: 1.0.0 - - w3c-keyname@2.2.8: {} - - w3c-xmlserializer@1.1.2: - dependencies: - domexception: 1.0.1 - webidl-conversions: 4.0.2 - xml-name-validator: 3.0.0 - - w3c-xmlserializer@4.0.0: - dependencies: - xml-name-validator: 4.0.0 - - walker@1.0.8: - dependencies: - makeerror: 1.0.12 - - watch@0.10.0: {} - - watchpack@2.4.4: - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - - wbuf@1.7.3: - dependencies: - minimalistic-assert: 1.0.1 - - wcwidth@1.0.1: - dependencies: - defaults: 1.0.4 - - web-namespaces@1.1.4: {} - - web-namespaces@2.0.1: {} - - web-streams-polyfill@3.3.3: {} - - web-tree-sitter@0.24.5: - optional: true - - webfonts-generator@0.4.0: - dependencies: - handlebars: 4.7.8 - mkdirp: 0.5.6 - q: 1.5.1 - svg2ttf: 4.3.0 - svgicons2svgfont: 5.0.2 - ttf2eot: 2.0.0 - ttf2woff: 2.0.2 - ttf2woff2: 2.0.3 - underscore: 1.13.7 - url-join: 1.1.0 - - webidl-conversions@3.0.1: {} - - webidl-conversions@4.0.2: {} - - webidl-conversions@7.0.0: {} - - webpack-cli@4.10.0(webpack-dev-server@5.2.2)(webpack@5.100.2): - dependencies: - '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.100.2) - '@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) - colorette: 2.0.20 - commander: 7.2.0 - cross-spawn: 7.0.6 - fastest-levenshtein: 1.0.16 - import-local: 3.2.0 - interpret: 2.2.0 - rechoir: 0.7.1 - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-merge: 5.10.0 - optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@4.10.0)(webpack@5.100.2) - - webpack-cli@4.10.0(webpack@5.100.2): - dependencies: - '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.100.2) - '@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 - commander: 7.2.0 - cross-spawn: 7.0.6 - fastest-levenshtein: 1.0.16 - import-local: 3.2.0 - interpret: 2.2.0 - rechoir: 0.7.1 - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-merge: 5.10.0 - - webpack-cli@5.1.4(webpack-dev-server@5.2.2)(webpack@5.100.2): - dependencies: - '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.100.2) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.100.2) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack@5.100.2) - colorette: 2.0.20 - commander: 10.0.1 - cross-spawn: 7.0.6 - envinfo: 7.14.0 - fastest-levenshtein: 1.0.16 - import-local: 3.2.0 - interpret: 3.1.1 - rechoir: 0.8.0 - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-merge: 5.10.0 - optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.100.2) - - webpack-cli@5.1.4(webpack@5.100.2): - dependencies: - '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.100.2) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.100.2) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.100.2) - colorette: 2.0.20 - commander: 10.0.1 - cross-spawn: 7.0.6 - envinfo: 7.14.0 - fastest-levenshtein: 1.0.16 - import-local: 3.2.0 - interpret: 3.1.1 - rechoir: 0.8.0 - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-merge: 5.10.0 - - webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2): - dependencies: - '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.100.2) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.100.2) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.100.2) - colorette: 2.0.20 - commander: 12.1.0 - cross-spawn: 7.0.6 - envinfo: 7.14.0 - fastest-levenshtein: 1.0.16 - import-local: 3.2.0 - interpret: 3.1.1 - rechoir: 0.8.0 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - webpack-merge: 6.0.1 - optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.100.2) - - webpack-cli@6.0.1(webpack@5.100.2): - dependencies: - '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.100.2) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.100.2) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack@5.100.2) - colorette: 2.0.20 - commander: 12.1.0 - cross-spawn: 7.0.6 - envinfo: 7.14.0 - fastest-levenshtein: 1.0.16 - import-local: 3.2.0 - interpret: 3.1.1 - rechoir: 0.8.0 - webpack: 5.100.2(webpack-cli@6.0.1) - webpack-merge: 6.0.1 - - webpack-dev-middleware@3.7.3(webpack@5.100.2): - dependencies: - memory-fs: 0.4.1 - mime: 2.6.0 - mkdirp: 0.5.6 - range-parser: 1.2.1 - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-log: 2.0.0 - - webpack-dev-middleware@4.3.0(webpack@5.100.2): - dependencies: - colorette: 1.4.0 - mem: 8.1.1 - memfs: 3.5.3 - mime-types: 2.1.35 - range-parser: 1.2.1 - schema-utils: 3.3.0 - webpack: 5.100.2(webpack-cli@4.10.0) - - webpack-dev-middleware@6.1.3(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)): - dependencies: - colorette: 2.0.20 - memfs: 3.5.3 - mime-types: 2.1.35 - range-parser: 1.2.1 - schema-utils: 4.3.2 - optionalDependencies: - webpack: 5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6) - - webpack-dev-middleware@6.1.3(webpack@5.100.2): - dependencies: - colorette: 2.0.20 - memfs: 3.5.3 - mime-types: 2.1.35 - range-parser: 1.2.1 - schema-utils: 4.3.2 - optionalDependencies: - webpack: 5.100.2(webpack-cli@6.0.1) - - webpack-dev-middleware@7.4.2(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)): - dependencies: - colorette: 2.0.20 - memfs: 4.17.2 - mime-types: 2.1.35 - on-finished: 2.4.1 - range-parser: 1.2.1 - schema-utils: 4.3.2 - optionalDependencies: - webpack: 5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6) - optional: true - - webpack-dev-middleware@7.4.2(webpack@5.100.2): - dependencies: - colorette: 2.0.20 - memfs: 4.17.2 - mime-types: 2.1.35 - on-finished: 2.4.1 - range-parser: 1.2.1 - schema-utils: 4.3.2 - optionalDependencies: - webpack: 5.100.2(webpack-cli@4.10.0) - - webpack-dev-server@5.2.2(webpack-cli@4.10.0)(webpack@5.100.2): - dependencies: - '@types/bonjour': 3.5.13 - '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.23 - '@types/express-serve-static-core': 4.19.6 - '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.8 - '@types/sockjs': 0.3.36 - '@types/ws': 8.18.1 - ansi-html-community: 0.0.8 - bonjour-service: 1.3.0 - chokidar: 3.6.0 - colorette: 2.0.20 - compression: 1.8.0 - connect-history-api-fallback: 2.0.0 - express: 4.21.2 - graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.9(@types/express@4.17.23) - ipaddr.js: 2.2.0 - launch-editor: 2.10.0 - open: 10.1.2 - p-retry: 6.2.1 - schema-utils: 4.3.2 - selfsigned: 2.4.1 - serve-index: 1.9.1 - sockjs: 0.3.24 - spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.100.2) - ws: 8.18.2 - optionalDependencies: - webpack: 5.100.2(webpack-cli@4.10.0) - webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.100.2) - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - - webpack-dev-server@5.2.2(webpack-cli@5.1.4)(webpack@5.100.2): - dependencies: - '@types/bonjour': 3.5.13 - '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.23 - '@types/express-serve-static-core': 4.19.6 - '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.8 - '@types/sockjs': 0.3.36 - '@types/ws': 8.18.1 - ansi-html-community: 0.0.8 - bonjour-service: 1.3.0 - chokidar: 3.6.0 - colorette: 2.0.20 - compression: 1.8.0 - connect-history-api-fallback: 2.0.0 - express: 4.21.2 - graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.9(@types/express@4.17.23) - ipaddr.js: 2.2.0 - launch-editor: 2.10.0 - open: 10.1.2 - p-retry: 6.2.1 - schema-utils: 4.3.2 - selfsigned: 2.4.1 - serve-index: 1.9.1 - sockjs: 0.3.24 - spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.100.2) - ws: 8.18.2 - optionalDependencies: - webpack: 5.100.2(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.100.2) - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - - webpack-dev-server@5.2.2(webpack-cli@6.0.1)(webpack@5.100.2): - dependencies: - '@types/bonjour': 3.5.13 - '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.23 - '@types/express-serve-static-core': 4.19.6 - '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.8 - '@types/sockjs': 0.3.36 - '@types/ws': 8.18.1 - ansi-html-community: 0.0.8 - bonjour-service: 1.3.0 - chokidar: 3.6.0 - colorette: 2.0.20 - compression: 1.8.0 - connect-history-api-fallback: 2.0.0 - express: 4.21.2 - graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.9(@types/express@4.17.23) - ipaddr.js: 2.2.0 - launch-editor: 2.10.0 - open: 10.1.2 - p-retry: 6.2.1 - schema-utils: 4.3.2 - selfsigned: 2.4.1 - serve-index: 1.9.1 - sockjs: 0.3.24 - spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.100.2) - ws: 8.18.2 - optionalDependencies: - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2) - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - - webpack-dev-server@5.2.2(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)): - dependencies: - '@types/bonjour': 3.5.13 - '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.23 - '@types/express-serve-static-core': 4.19.6 - '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.8 - '@types/sockjs': 0.3.36 - '@types/ws': 8.18.1 - ansi-html-community: 0.0.8 - bonjour-service: 1.3.0 - chokidar: 3.6.0 - colorette: 2.0.20 - compression: 1.8.0 - connect-history-api-fallback: 2.0.0 - express: 4.21.2 - graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.9(@types/express@4.17.23) - ipaddr.js: 2.2.0 - launch-editor: 2.10.0 - open: 10.1.2 - p-retry: 6.2.1 - schema-utils: 4.3.2 - selfsigned: 2.4.1 - serve-index: 1.9.1 - sockjs: 0.3.24 - spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)) - ws: 8.18.2 - optionalDependencies: - webpack: 5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6) - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - optional: true - - webpack-dev-server@5.2.2(webpack@5.100.2): - dependencies: - '@types/bonjour': 3.5.13 - '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.23 - '@types/express-serve-static-core': 4.19.6 - '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.8 - '@types/sockjs': 0.3.36 - '@types/ws': 8.18.1 - ansi-html-community: 0.0.8 - bonjour-service: 1.3.0 - chokidar: 3.6.0 - colorette: 2.0.20 - compression: 1.8.0 - connect-history-api-fallback: 2.0.0 - express: 4.21.2 - graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.9(@types/express@4.17.23) - ipaddr.js: 2.2.0 - launch-editor: 2.10.0 - open: 10.1.2 - p-retry: 6.2.1 - schema-utils: 4.3.2 - selfsigned: 2.4.1 - serve-index: 1.9.1 - sockjs: 0.3.24 - spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.100.2) - ws: 8.18.2 - optionalDependencies: - webpack: 5.100.2(webpack-cli@4.10.0) - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - - webpack-filter-warnings-plugin@1.2.1(webpack@5.100.2): - dependencies: - webpack: 5.100.2(webpack-cli@4.10.0) - - webpack-hot-middleware@2.26.1: - dependencies: - ansi-html-community: 0.0.8 - html-entities: 2.6.0 - strip-ansi: 6.0.1 - - webpack-log@2.0.0: - dependencies: - ansi-colors: 3.2.4 - uuid: 3.4.0 - - webpack-manifest-plugin@1.3.2(webpack@5.100.2): - dependencies: - fs-extra: 0.30.0 - lodash: 4.17.21 - webpack: 5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1) - - webpack-merge-and-include-globally@2.3.4(webpack@5.100.2): - dependencies: - es6-promisify: 6.1.1 - glob: 7.2.3 - rev-hash: 3.0.0 - webpack: 5.100.2(webpack-cli@5.1.4) - - webpack-merge@5.10.0: - dependencies: - clone-deep: 4.0.1 - flat: 5.0.2 - wildcard: 2.0.1 - - webpack-merge@6.0.1: - dependencies: - clone-deep: 4.0.1 - flat: 5.0.2 - wildcard: 2.0.1 - - webpack-permissions-plugin@1.0.10: - dependencies: - filehound: 1.17.6 - - webpack-sources@1.4.3: - dependencies: - source-list-map: 2.0.1 - source-map: 0.6.1 - - webpack-sources@3.3.3: {} - - webpack-virtual-modules@0.2.2: - dependencies: - debug: 3.2.7 - transitivePeerDependencies: - - supports-color - - webpack-virtual-modules@0.4.6: {} - - webpack-virtual-modules@0.5.0: {} - - webpack-virtual-modules@0.6.2: {} - - webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6): - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.1 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.2 - es-module-lexer: 1.7.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)(webpack@5.100.2(@swc/core@1.12.5(@swc/helpers@0.5.17))(esbuild@0.25.6)) - watchpack: 2.4.4 - webpack-sources: 3.3.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack@5.100.2(esbuild@0.25.5)(webpack-cli@6.0.1): - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.1 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.2 - es-module-lexer: 1.7.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(esbuild@0.25.5)(webpack@5.100.2) - watchpack: 2.4.4 - webpack-sources: 3.3.3 - optionalDependencies: - webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2) - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack@5.100.2(webpack-cli@4.10.0): - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.1 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.2 - es-module-lexer: 1.7.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(webpack@5.100.2) - watchpack: 2.4.4 - webpack-sources: 3.3.3 - optionalDependencies: - webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.100.2) - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack@5.100.2(webpack-cli@5.1.4): - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.1 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.2 - es-module-lexer: 1.7.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(webpack@5.100.2) - watchpack: 2.4.4 - webpack-sources: 3.3.3 - optionalDependencies: - webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.100.2) - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack@5.100.2(webpack-cli@6.0.1): - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.1 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.2 - es-module-lexer: 1.7.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.2 - terser-webpack-plugin: 5.3.14(webpack@5.100.2) - watchpack: 2.4.4 - webpack-sources: 3.3.3 - optionalDependencies: - webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.100.2) - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - websocket-driver@0.7.4: - dependencies: - http-parser-js: 0.5.10 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - - websocket-extensions@0.1.4: {} - - whatwg-encoding@1.0.5: - dependencies: - iconv-lite: 0.4.24 - - whatwg-encoding@2.0.0: - dependencies: - iconv-lite: 0.6.3 - - whatwg-encoding@3.1.1: - dependencies: - iconv-lite: 0.6.3 - - whatwg-fetch@2.0.3: {} - - whatwg-mimetype@2.3.0: {} - - whatwg-mimetype@3.0.0: {} - - whatwg-mimetype@4.0.0: {} - - whatwg-url@11.0.0: - dependencies: - tr46: 3.0.0 - webidl-conversions: 7.0.0 - - whatwg-url@4.8.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - whatwg-url@6.5.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - - whet.extend@0.9.9: {} - - which-boxed-primitive@1.1.1: - dependencies: - is-bigint: 1.1.0 - is-boolean-object: 1.2.2 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 - - which-builtin-type@1.2.1: - dependencies: - call-bound: 1.0.4 - function.prototype.name: 1.1.8 - has-tostringtag: 1.0.2 - is-async-function: 2.1.1 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 - is-regex: 1.2.1 - is-weakref: 1.1.1 - isarray: 2.0.5 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.19 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.4 - - which-module@1.0.0: {} - - which-module@2.0.1: {} - - which-typed-array@1.1.19: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - - which@1.3.1: - dependencies: - isexe: 2.0.0 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - which@5.0.0: - dependencies: - isexe: 3.1.1 - - wide-align@1.1.5: - dependencies: - string-width: 4.2.3 - - widest-line@2.0.1: - dependencies: - string-width: 2.1.1 - - widest-line@3.1.0: - dependencies: - string-width: 4.2.3 - - wildcard@2.0.1: {} - - winston-transport@4.6.0: - dependencies: - logform: 2.7.0 - readable-stream: 3.6.2 - triple-beam: 1.4.1 - - winston@3.11.0: - dependencies: - '@colors/colors': 1.6.0 - '@dabh/diagnostics': 2.0.3 - async: 3.2.6 - is-stream: 2.0.1 - logform: 2.7.0 - one-time: 1.0.0 - readable-stream: 3.6.2 - safe-stable-stringify: 2.5.0 - stack-trace: 0.0.10 - triple-beam: 1.4.1 - winston-transport: 4.6.0 - - word-wrap@1.2.5: {} - - wordwrap@1.0.0: {} - - worker-farm@1.7.0: - dependencies: - errno: 0.1.8 - - worker-rpc@0.1.1: - dependencies: - microevent.ts: 0.1.1 - - workerpool@6.5.1: {} - - workerpool@9.3.2: {} - - wrap-ansi@2.1.0: - dependencies: - string-width: 1.0.2 - strip-ansi: 3.0.1 - - wrap-ansi@3.0.1: - dependencies: - string-width: 2.1.1 - strip-ansi: 4.0.0 - - wrap-ansi@6.2.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - wrap-ansi@9.0.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 7.2.0 - strip-ansi: 7.1.0 - - wrappy@1.0.2: {} - - write-file-atomic@2.4.3: - dependencies: - graceful-fs: 4.2.11 - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - - write-file-atomic@3.0.3: - dependencies: - imurmurhash: 0.1.4 - is-typedarray: 1.0.0 - signal-exit: 3.0.7 - typedarray-to-buffer: 3.1.5 - - write-file-atomic@4.0.2: - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - - write-file-atomic@5.0.1: - dependencies: - 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 - - ws@6.2.3: - dependencies: - async-limiter: 1.0.1 - - ws@7.5.10: {} - - ws@8.18.2: {} - - ws@8.18.3: {} - - x-default-browser@0.4.0: - optionalDependencies: - default-browser-id: 1.0.4 - - xdg-basedir@3.0.0: {} - - xml-but-prettier@1.0.1: - dependencies: - repeat-string: 1.6.1 - - xml-js@1.6.11: - dependencies: - sax: 1.4.1 - - xml-name-validator@2.0.1: {} - - xml-name-validator@3.0.0: {} - - xml-name-validator@4.0.0: {} - - xml2js@0.5.0: - dependencies: - sax: 1.4.1 - xmlbuilder: 11.0.1 - - xml2js@0.6.2: - dependencies: - sax: 1.4.1 - xmlbuilder: 11.0.1 - - xml@1.0.1: {} - - xmlbuilder2@3.1.1: - dependencies: - '@oozcitak/dom': 1.15.10 - '@oozcitak/infra': 1.0.8 - '@oozcitak/util': 8.3.8 - js-yaml: 3.14.1 - - xmlbuilder@11.0.1: {} - - xmlchars@2.2.0: {} - - xmlhttprequest@1.8.0: {} - - xstate@4.38.3: {} - - xtend@4.0.2: {} - - y18n@3.2.2: {} - - y18n@4.0.3: {} - - y18n@5.0.8: {} - - yallist@2.1.2: {} - - yallist@3.1.1: {} - - yallist@4.0.0: {} - - yaml@1.10.2: {} - - yaml@2.8.0: {} - - yargs-parser@18.1.3: - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - - yargs-parser@20.2.9: {} - - yargs-parser@21.1.1: {} - - yargs-parser@5.0.1: - dependencies: - camelcase: 3.0.0 - object.assign: 4.1.7 - - yargs-parser@8.1.0: - dependencies: - camelcase: 4.1.0 - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@10.1.2: - dependencies: - cliui: 4.1.0 - decamelize: 1.2.0 - find-up: 2.1.0 - get-caller-file: 1.0.3 - os-locale: 2.1.0 - require-directory: 2.1.1 - require-main-filename: 1.0.1 - set-blocking: 2.0.0 - string-width: 2.1.1 - which-module: 2.0.1 - y18n: 3.2.2 - yargs-parser: 8.1.0 - - yargs@15.4.1: - dependencies: - cliui: 6.0.0 - decamelize: 1.2.0 - find-up: 4.1.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 4.2.3 - which-module: 2.0.1 - y18n: 4.0.3 - yargs-parser: 18.1.3 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - - yargs@7.1.2: - dependencies: - camelcase: 3.0.0 - cliui: 3.2.0 - decamelize: 1.2.0 - get-caller-file: 1.0.3 - os-locale: 1.4.0 - read-pkg-up: 1.0.1 - require-directory: 2.1.1 - require-main-filename: 1.0.1 - set-blocking: 2.0.0 - string-width: 1.0.2 - which-module: 1.0.0 - y18n: 3.2.2 - yargs-parser: 5.0.1 - - yarn@1.22.22: {} - - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - - yazl@2.5.1: - dependencies: - buffer-crc32: 0.2.13 - - yocto-queue@0.1.0: {} - - yocto-queue@1.2.1: {} - - yup@1.6.1: - dependencies: - property-expr: 2.0.6 - tiny-case: 1.0.3 - toposort: 2.0.2 - type-fest: 2.19.0 - - zenscroll@4.0.2: {} - - zod-to-json-schema@3.24.5(zod@3.25.67): - dependencies: - zod: 3.25.67 - - zod@3.25.67: {} - - zod@3.25.76: {} - - zustand@4.5.7(@types/react@18.2.0)(immer@9.0.21)(react@18.2.0): - dependencies: - use-sync-external-store: 1.5.0(react@18.2.0) - optionalDependencies: - '@types/react': 18.2.0 - immer: 9.0.21 - react: 18.2.0 - - zustand@5.0.5(@types/react@18.2.0)(immer@9.0.21)(react@18.2.0)(use-sync-external-store@1.5.0(react@18.2.0)): - optionalDependencies: - '@types/react': 18.2.0 - immer: 9.0.21 - react: 18.2.0 - use-sync-external-store: 1.5.0(react@18.2.0) - - zustand@5.0.5(@types/react@18.2.0)(immer@9.0.21)(react@19.1.0)(use-sync-external-store@1.5.0(react@19.1.0)): - optionalDependencies: - '@types/react': 18.2.0 - immer: 9.0.21 - react: 19.1.0 - use-sync-external-store: 1.5.0(react@19.1.0) - - zwitch@1.0.5: {} - - zwitch@2.0.4: {} diff --git a/workspaces/mi/mi-extension/package.json b/workspaces/mi/mi-extension/package.json index a79747ec08f..8f4f55464a2 100644 --- a/workspaces/mi/mi-extension/package.json +++ b/workspaces/mi/mi-extension/package.json @@ -953,7 +953,7 @@ "node-loader": "~2.1.0", "to-json-schema": "0.2.5", "xml2js": "0.6.2", - "tmp": "~0.2.3", + "tmp": "~0.2.4", "fs-extra": "~11.3.0", "@iarna/toml": "^2.2.5", "@types/tmp": "~0.2.6", From deb88f068cfccf62a37eab68b642b0d123b506a6 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Thu, 7 Aug 2025 22:34:10 +0530 Subject: [PATCH 335/349] Use QueryOutputNode in focused view of query with collect --- .../Diagram/Node/QueryOutput/QueryOutputWidget.tsx | 4 ++-- .../src/visitors/IONodeInitVisitor.ts | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryOutput/QueryOutputWidget.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryOutput/QueryOutputWidget.tsx index 4f1ff6b2c1b..fff7211dd92 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryOutput/QueryOutputWidget.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryOutput/QueryOutputWidget.tsx @@ -70,7 +70,7 @@ export function QueryOutputWidget(props: QueryOutputWidgetProps) { })) ); - const fields = [outputType.member]; + const fields = [outputType.member ?? outputType]; const hasFields = fields.length > 0; const portIn = getPort(`${id}.IN`); @@ -108,7 +108,7 @@ export function QueryOutputWidget(props: QueryOutputWidgetProps) { const label = ( {valueLabel && ( - + {valueLabel} {typeName && ":"} diff --git a/workspaces/ballerina/inline-data-mapper/src/visitors/IONodeInitVisitor.ts b/workspaces/ballerina/inline-data-mapper/src/visitors/IONodeInitVisitor.ts index 5d1282c4382..239e25f7e8d 100644 --- a/workspaces/ballerina/inline-data-mapper/src/visitors/IONodeInitVisitor.ts +++ b/workspaces/ballerina/inline-data-mapper/src/visitors/IONodeInitVisitor.ts @@ -39,14 +39,12 @@ export class IONodeInitVisitor implements BaseVisitor { beginVisitOutputType(node: IOType, parent?: ExpandedDMModel): void { // Create output node - if (node.kind === TypeKind.Record) { + if (parent?.query) { + this.outputNode = new QueryOutputNode(this.context, node); + } else if (node.kind === TypeKind.Record) { this.outputNode = new ObjectOutputNode(this.context, node); } else if (node.kind === TypeKind.Array) { - if (parent?.query) { - this.outputNode = new QueryOutputNode(this.context, node); - } else { - this.outputNode = new ArrayOutputNode(this.context, node); - } + this.outputNode = new ArrayOutputNode(this.context, node); } else { this.outputNode = new PrimitiveOutputNode(this.context, node); } From ecef36c67ad82bcfc779db6af9050f818811e1ce Mon Sep 17 00:00:00 2001 From: ChamodA Date: Fri, 8 Aug 2025 11:55:08 +0530 Subject: [PATCH 336/349] Revert changes for collect clause support in primitive nodes --- .../PrimitiveOutput/PrimitiveOutputElementWidget.tsx | 7 +------ .../Node/PrimitiveOutput/PrimitiveOutputNode.ts | 12 ++---------- .../PrimitiveOutput/PrimitiveOutputNodeFactory.tsx | 2 +- .../Node/PrimitiveOutput/PrimitiveOutputWidget.tsx | 4 ++-- 4 files changed, 6 insertions(+), 19 deletions(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputElementWidget.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputElementWidget.tsx index c56883bda78..968cb113841 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputElementWidget.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputElementWidget.tsx @@ -71,12 +71,11 @@ export function PrimitiveOutputElementWidget(props: PrimitiveOutputElementWidget const [portState, setPortState] = useState(PortState.Unselected); const fieldName = field?.id || ''; - const view = context.views[context.views.length - 1]; let portName = getSanitizedId(parentId); if (fieldIndex !== undefined) { portName = `${portName}.${fieldIndex}`; - } else if (fieldName && view.subMappingInfo) { + } else if (fieldName) { portName = `${portName}.${fieldName}`; } @@ -85,10 +84,6 @@ export function PrimitiveOutputElementWidget(props: PrimitiveOutputElementWidget const mapping = portIn && portIn.attributes.value; let { expression, diagnostics } = mapping || {}; - if (portIn?.getParent() instanceof PrimitiveOutputNode && context.model.query) { - expression = context.model.query.resultClause.properties.expression; - } - const handleEditValue = () => { if (portIn) setExprBarFocusedPort(portIn); diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputNode.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputNode.ts index d591fb8ddb8..432cea78375 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputNode.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputNode.ts @@ -68,7 +68,7 @@ export class PrimitiveOutputNode extends DataMapperNodeModel { const parentPort = this.addPortsForHeader({ dmType: this.outputType, - name: `${this.rootName}.HEADER`, + name: "", portType: "IN", portPrefix: PRIMITIVE_OUTPUT_TARGET_PORT_PREFIX, mappings: this.context.model.mappings, @@ -76,19 +76,11 @@ export class PrimitiveOutputNode extends DataMapperNodeModel { expandedFields, isPreview: true }); - - function getParentId(input: string): string { - const lastDotIndex = input.lastIndexOf("."); - if (lastDotIndex === -1) { - return ""; - } - return input.substring(0, lastDotIndex); - } this.addPortsForOutputField({ field: this.outputType, type: "IN", - parentId: getParentId(this.rootName), + parentId: "", mappings: this.context.model.mappings, portPrefix: PRIMITIVE_OUTPUT_TARGET_PORT_PREFIX, parent: parentPort, diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputNodeFactory.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputNodeFactory.tsx index 88bb9a14c01..ffafa60bcfd 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputNodeFactory.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputNodeFactory.tsx @@ -41,7 +41,7 @@ export class PrimitiveOutputNodeFactory extends AbstractReactFactory event.model.getPort(portId) as InputOutputPortModel} diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputWidget.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputWidget.tsx index fc26cb53b90..f2c5f40af1f 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputWidget.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/PrimitiveOutput/PrimitiveOutputWidget.tsx @@ -66,7 +66,7 @@ export function PrimitiveOutputWidget(props: PrimitiveOutputWidgetProps) { })) ); - const portIn = getPort(`${id}.HEADER.IN`); + const portIn = getPort(`${id}.IN`); const isUnknownType = outputType.kind === TypeKind.Unknown; let expanded = true; @@ -128,7 +128,7 @@ export function PrimitiveOutputWidget(props: PrimitiveOutputWidgetProps) { onMouseLeave={onMouseLeave} > - {portIn && ( + {portIn && !expanded&& ( Date: Fri, 8 Aug 2025 14:31:50 +0530 Subject: [PATCH 337/349] Update targetField handling --- .../src/views/InlineDataMapper/DataMapperView.tsx | 11 ++++++----- .../QueryExprConnectorNodeWidget.tsx | 9 +++++++-- .../src/components/Diagram/utils/common-utils.ts | 4 ++++ .../components/Diagram/utils/modification-utils.ts | 9 +++++---- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/InlineDataMapper/DataMapperView.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/InlineDataMapper/DataMapperView.tsx index d0128986c4e..049018b6119 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/InlineDataMapper/DataMapperView.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/InlineDataMapper/DataMapperView.tsx @@ -241,16 +241,17 @@ export function InlineDataMapperView(props: InlineDataMapperProps) { const convertToQuery = async (mapping: Mapping, clauseType: ResultClauseType, viewId: string, name: string) => { try { + const a = viewId.split("."); + const b = mapping.output.split("."); + const targetField = [...a, ...b.slice(1)].join("."); + console.log(">>> [Inline Data Mapper] targetField:", targetField); const convertToQueryRequest: ConvertToQueryRequest = { filePath, codedata: viewState.codedata, - mapping: { - output: "OUTPUTID", // TODO: Remove this once the API is supporting on the fly mapping - expression: mapping.expression - }, + mapping, clauseType, varName: name, - targetField: mapping.output, + targetField: viewId, propertyKey: "expression" // TODO: Remove this once the API is updated }; const resp = await rpcClient diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryExprConnector/QueryExprConnectorNodeWidget.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryExprConnector/QueryExprConnectorNodeWidget.tsx index 65768e4c1cd..87b6236ef58 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryExprConnector/QueryExprConnectorNodeWidget.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryExprConnector/QueryExprConnectorNodeWidget.tsx @@ -25,7 +25,7 @@ import { useIntermediateNodeStyles } from '../../../styles'; import { QueryExprConnectorNode } from './QueryExprConnectorNode'; import { renderDeleteButton, renderEditButton, renderPortWidget } from "../LinkConnector/LinkConnectorWidgetComponents"; import { DiagnosticWidget } from "../../Diagnostic/DiagnosticWidget"; -import { expandArrayFn } from "../../utils/common-utils"; +import { expandArrayFn, getTargetField } from "../../utils/common-utils"; import { useDMCollapsedFieldsStore, useDMExpandedFieldsStore, useDMExpressionBarStore } from "../../../../store/store"; export interface QueryExprConnectorNodeWidgetWidgetProps { @@ -70,7 +70,12 @@ export function QueryExprConnectorNodeWidget(props: QueryExprConnectorNodeWidget collapsedFieldsStore.removeField(targetPort); expandedFieldsStore.removeField(targetPort); - expandArrayFn(node.context, node.sourcePorts[0].attributes.field?.id, node.targetMappedPort.attributes.value?.output); + const context = node.context; + + const lastView = context.views[context.views.length - 1]; + const targetField = getTargetField(lastView.targetField, node.targetMappedPort.attributes.value?.output); + + expandArrayFn(context, node.sourcePorts[0].attributes.field?.id, targetField); }; const loadingScreen = ( diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/common-utils.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/common-utils.ts index 2369442a837..64b1a86e343 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/common-utils.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/common-utils.ts @@ -266,3 +266,7 @@ export function isExpandable(field: IOType): boolean { field?.kind === TypeKind.Array || field?.kind === TypeKind.Enum; } + +export function getTargetField(viewId: string, outputId: string){ + return [...viewId.split("."), ...outputId.split(".").slice(1)].join("."); +} diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/modification-utils.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/modification-utils.ts index 60a32ae0780..644034af987 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/modification-utils.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/utils/modification-utils.ts @@ -21,7 +21,7 @@ import { InputOutputPortModel, ValueType } from "../Port"; import { IDataMapperContext } from "../../../utils/DataMapperContext/DataMapperContext"; import { MappingFindingVisitor } from "../../../visitors/MappingFindingVisitor"; import { traverseNode } from "../../../utils/model-utils"; -import { getValueType } from "./common-utils"; +import { getTargetField, getValueType } from "./common-utils"; import { CustomFnMetadata, CustomFnParams, Mapping, ResultClauseType } from "@wso2/ballerina-core"; import { getTypeName, isEnumMember } from "./type-utils"; import { InputNode } from "../Node/Input/InputNode"; @@ -137,11 +137,12 @@ export async function mapWithQuery(link: DataMapperLinkModel, clauseType: Result const name = context.views[0]?.targetField; const mapping: Mapping = { - output: outputId, + output: "OUTPUT",// TODO: Remove this once the API is updated, currently output is embedded in to targetField expression: input }; - - await context?.convertToQuery(mapping, clauseType, viewId, name); + const targetField = getTargetField(viewId, outputId); // TODO: Remove this once the API is updated + + await context?.convertToQuery(mapping, clauseType, targetField, name); } export function buildInputAccessExpr(fieldFqn: string): string { From a75ff6eae179fd928857044a1c9cecfb395b2749 Mon Sep 17 00:00:00 2001 From: ChamodA Date: Fri, 8 Aug 2025 14:33:33 +0530 Subject: [PATCH 338/349] Revert style change which added for debugging --- .../components/Diagram/Node/QueryOutput/QueryOutputWidget.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryOutput/QueryOutputWidget.tsx b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryOutput/QueryOutputWidget.tsx index fff7211dd92..44297c7b540 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryOutput/QueryOutputWidget.tsx +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryOutput/QueryOutputWidget.tsx @@ -108,7 +108,7 @@ export function QueryOutputWidget(props: QueryOutputWidgetProps) { const label = ( {valueLabel && ( - + {valueLabel} {typeName && ":"} From 3668bbbb4aea08aa8bfc7ada7e0a251915c5e4eb Mon Sep 17 00:00:00 2001 From: ChamodA Date: Fri, 8 Aug 2025 18:41:47 +0530 Subject: [PATCH 339/349] Fox nested focus view issues --- .../src/components/Diagram/Node/Input/InputNode.ts | 5 ++++- .../components/Diagram/Node/QueryOutput/QueryOutputNode.ts | 5 ++--- .../src/components/Diagram/Node/commons/DataMapperNode.ts | 1 + 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNode.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNode.ts index cbdc0fa6a58..f9bf6048d8e 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNode.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNode.ts @@ -54,7 +54,10 @@ export class InputNode extends DataMapperNodeModel { if (this.filteredInputType) { const collapsedFields = useDMCollapsedFieldsStore.getState().fields; const expandedFields = useDMExpandedFieldsStore.getState().fields; - const focusedFieldFQNs = this.context.model.query?.inputs || []; + const focusedFieldFQNs = [ + ...this.context.views.map(view => view.sourceField).filter(Boolean), + ...(this.context.model.query?.inputs || []) + ]; const parentPort = this.addPortsForHeader({ dmType: this.filteredInputType, name: this.identifier, diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryOutput/QueryOutputNode.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryOutput/QueryOutputNode.ts index 36be1f7cd38..3fcf32438ee 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryOutput/QueryOutputNode.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/QueryOutput/QueryOutputNode.ts @@ -103,7 +103,7 @@ export class QueryOutputNode extends DataMapperNodeModel { private createLinks(mappings: Mapping[]) { const views = this.context.views; - const focusedSourceField = views[views.length - 1].sourceField; + const focusedSourceField = views[1]?.sourceField; const { inputs: queryInputs, output: queryOutput} = this.context.model.query; mappings.forEach((mapping) => { @@ -158,8 +158,7 @@ export class QueryOutputNode extends DataMapperNodeModel { } }); - - const inputNode = findInputNode(queryInputs[0], this); + const inputNode = findInputNode(queryInputs[0], this, focusedSourceField); let inPort: InputOutputPortModel; if (inputNode) { inPort = getInputPort(inputNode, queryInputs[0].replace(/\.\d+/g, '')); diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts index 91c09ba6239..58ed518daf9 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/commons/DataMapperNode.ts @@ -41,6 +41,7 @@ interface InputPortAttributes { collapsed?: boolean; isOptional?: boolean; focusedFieldFQNs?: string[]; + isPreview?: boolean; }; interface OutputPortAttributes { From abbc82c8f101ba0411a433ee5f2fc9354b3397dc Mon Sep 17 00:00:00 2001 From: Anjana S Porawagama Date: Mon, 11 Aug 2025 10:50:53 +0530 Subject: [PATCH 340/349] Refactor DiagramWrapper component to improve sequence diagram rendering logic --- .../src/views/BI/DiagramWrapper/index.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx index 56561fad839..81ba9dcdd6d 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/DiagramWrapper/index.tsx @@ -354,9 +354,9 @@ export function DiagramWrapper(param: DiagramWrapperProps) { ) : ( )} - { - enableSequenceDiagram && !isAgent && !loadingDiagram ? - ( + {enableSequenceDiagram && !isAgent && + ( + !loadingDiagram ? ( ) + ) } { showSequenceDiagram ? ( From c8eb7e57199f8041b90d649a4bf3ca1095ba6b79 Mon Sep 17 00:00:00 2001 From: madushajg Date: Mon, 11 Aug 2025 11:02:07 +0530 Subject: [PATCH 341/349] Fix navigate into query expressions within array elements --- .../components/Diagram/Node/ArrayOutput/ArrayOutputNode.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/ArrayOutput/ArrayOutputNode.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/ArrayOutput/ArrayOutputNode.ts index f5e1b6af5db..ad6a44d1cb1 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/ArrayOutput/ArrayOutputNode.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/ArrayOutput/ArrayOutputNode.ts @@ -88,7 +88,7 @@ export class ArrayOutputNode extends DataMapperNodeModel { field: this.outputType.member, type: "IN", parentId: this.rootName, - mappings, + mappings: element.mappings, portPrefix: ARRAY_OUTPUT_TARGET_PORT_PREFIX, parent: parentPort, collapsedFields, @@ -128,8 +128,8 @@ export class ArrayOutputNode extends DataMapperNodeModel { private createLinks(mappings: Mapping[]) { mappings.forEach((mapping) => { - const { isComplex, inputs, output, expression, diagnostics } = mapping; - if (isComplex || inputs.length !== 1) { + const { isComplex, isQueryExpression, isFunctionCall, inputs, output, expression, diagnostics } = mapping; + if (isComplex || isQueryExpression || isFunctionCall || inputs.length !== 1) { // Complex mappings are handled in the LinkConnectorNode return; } From fbd6c68029da32a8c6db29676adfec64ee73fdc8 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Mon, 11 Aug 2025 12:24:14 +0530 Subject: [PATCH 342/349] Refactor enrichFormPropertiesWithValueConstraint to correctly copy value from formProperties to formTemplateProperties --- .../ballerina-visualizer/src/utils/bi.tsx | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx index 545f3bdc6b3..d5c1beba48e 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx @@ -423,21 +423,19 @@ export function enrichFormPropertiesWithValueConstraint( formProperties: NodeProperties, formTemplateProperties: NodeProperties ) { - const enrichedFormProperties = cloneDeep(formProperties); - - for (const key in formTemplateProperties) { - if (formTemplateProperties.hasOwnProperty(key)) { - const expression = formTemplateProperties[key as NodePropertyKey]; - if (expression) { - const valConstraint = formTemplateProperties[key as NodePropertyKey]?.valueTypeConstraint; - if (valConstraint && enrichedFormProperties[key as NodePropertyKey]) { - enrichedFormProperties[key as NodePropertyKey].valueTypeConstraint = valConstraint; - } + const enrichedFormTemplateProperties = cloneDeep(formTemplateProperties); + + for (const key in formProperties) { + if (formProperties.hasOwnProperty(key)) { + const formProperty = formProperties[key as NodePropertyKey]; + if (formProperty && enrichedFormTemplateProperties[key as NodePropertyKey]) { + // Copy the value from formProperties to formTemplateProperties + enrichedFormTemplateProperties[key as NodePropertyKey].value = formProperty.value; } } } - return enrichedFormProperties; + return enrichedFormTemplateProperties; } function getEnrichedValue(kind: CompletionItemKind, value: string): CompletionInsertText { From 1a1998d91c94fe1d1a31047ee052371f9cf83a6f Mon Sep 17 00:00:00 2001 From: madushajg Date: Mon, 11 Aug 2025 14:23:26 +0530 Subject: [PATCH 343/349] Fix creating links within root query expressions --- .../src/components/Diagram/Node/Input/InputNode.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNode.ts b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNode.ts index f9bf6048d8e..8eefac80e4c 100644 --- a/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNode.ts +++ b/workspaces/ballerina/inline-data-mapper/src/components/Diagram/Node/Input/InputNode.ts @@ -100,6 +100,13 @@ export class InputNode extends DataMapperNodeModel { }); }); } else if (this.filteredInputType.kind === TypeKind.Array) { + const focusedMemberId = this.filteredInputType?.focusedMemberId; + if (focusedMemberId) { + const focusedMemberField = this.context.model.inputs.find(input => input.id === focusedMemberId); + if (focusedMemberField) { + this.filteredInputType.member = focusedMemberField; + } + } this.numberOfFields += this.addPortsForInputField({ field: this.filteredInputType?.member, portType: "OUT", From b5354a22b8ca378b6c0c66500d6578e31e9c8a9e Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Mon, 11 Aug 2025 19:07:04 +0530 Subject: [PATCH 344/349] Fix copilot suggesions --- workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx | 7 +++++-- .../src/views/BI/Forms/FormGenerator/index.tsx | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx index d5c1beba48e..5f2ba54a7c7 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/utils/bi.tsx @@ -419,7 +419,7 @@ export function removeDraftNodeFromDiagram(flowModel: Flow) { return newFlow; } -export function enrichFormPropertiesWithValueConstraint( +export function enrichFormTemplatePropertiesWithValues( formProperties: NodeProperties, formTemplateProperties: NodeProperties ) { @@ -428,7 +428,10 @@ export function enrichFormPropertiesWithValueConstraint( for (const key in formProperties) { if (formProperties.hasOwnProperty(key)) { const formProperty = formProperties[key as NodePropertyKey]; - if (formProperty && enrichedFormTemplateProperties[key as NodePropertyKey]) { + if ( + formProperty && + enrichedFormTemplateProperties[key as NodePropertyKey] != null + ) { // Copy the value from formProperties to formTemplateProperties enrichedFormTemplateProperties[key as NodePropertyKey].value = formProperty.value; } diff --git a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx index 0f3838952de..6af595ddbaa 100644 --- a/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx +++ b/workspaces/ballerina/ballerina-visualizer/src/views/BI/Forms/FormGenerator/index.tsx @@ -62,7 +62,7 @@ import { convertNodePropertiesToFormFields, convertToFnSignature, convertToVisibleTypes, - enrichFormPropertiesWithValueConstraint, + enrichFormTemplatePropertiesWithValues, filterUnsupportedDiagnostics, getFormProperties, getImportsForFormFields, @@ -243,7 +243,7 @@ export const FormGenerator = forwardRef(func let enrichedNodeProperties; if (nodeFormTemplate) { const formTemplateProperties = getFormProperties(nodeFormTemplate); - enrichedNodeProperties = enrichFormPropertiesWithValueConstraint(formProperties, formTemplateProperties); + enrichedNodeProperties = enrichFormTemplatePropertiesWithValues(formProperties, formTemplateProperties); console.log(">>> Form properties", { formProperties, formTemplateProperties, enrichedNodeProperties }); } if (Object.keys(formProperties).length === 0) { From 77e8bc1d991a78535ceaa50922fe1cdbfda7576f Mon Sep 17 00:00:00 2001 From: madushajg Date: Mon, 11 Aug 2025 22:20:40 +0530 Subject: [PATCH 345/349] Enable create mappings using nullable input fields --- .../DataMapper/ConfigPanel/utils.ts | 2 +- .../Diagram/Node/FromClause/FromClauseNode.ts | 9 +++++++- .../Node/LinkConnector/LinkConnectorNode.ts | 12 ++++++----- .../Node/RequiredParam/RequiredParamNode.ts | 2 +- .../RequiredParamNodeFactory.tsx | 5 ++++- .../Diagram/Node/commons/DataMapperNode.ts | 6 ++---- .../RecordTypeTreeWidget.tsx | 21 ++++++++++++++----- .../src/components/Diagram/utils/dm-utils.ts | 4 +++- 8 files changed, 42 insertions(+), 19 deletions(-) diff --git a/workspaces/ballerina/data-mapper-view/src/components/DataMapper/ConfigPanel/utils.ts b/workspaces/ballerina/data-mapper-view/src/components/DataMapper/ConfigPanel/utils.ts index 9aa941ee23a..f235b820193 100644 --- a/workspaces/ballerina/data-mapper-view/src/components/DataMapper/ConfigPanel/utils.ts +++ b/workspaces/ballerina/data-mapper-view/src/components/DataMapper/ConfigPanel/utils.ts @@ -105,7 +105,7 @@ function isSupportedType(node: STNode, return [false, TypeNature.TYPE_UNAVAILABLE]; } else if ((isUnionType || isOptionalType) && kind === 'output' && getUnsupportedTypesFromTypeDesc(node).length === 0) { return [true]; - } else if (isUnionType || isMapType || isOptionalType) { + } else if (isMapType) { return [false, TypeNature.YET_TO_SUPPORT]; } else if (isArrayType || isParenthesisedType) { return [getUnsupportedTypesFromTypeDesc(node).length === 0, TypeNature.BLACKLISTED] diff --git a/workspaces/ballerina/data-mapper-view/src/components/Diagram/Node/FromClause/FromClauseNode.ts b/workspaces/ballerina/data-mapper-view/src/components/Diagram/Node/FromClause/FromClauseNode.ts index 5fdbfaa73aa..560d6e2f8f9 100644 --- a/workspaces/ballerina/data-mapper-view/src/components/Diagram/Node/FromClause/FromClauseNode.ts +++ b/workspaces/ballerina/data-mapper-view/src/components/Diagram/Node/FromClause/FromClauseNode.ts @@ -35,7 +35,8 @@ import { getFromClauseNodeLabel, getOptionalArrayField, getSearchFilteredInput, - getTypeFromStore + getTypeFromStore, + isOptionalAndNillableField } from "../../utils/dm-utils"; import { DataMapperNodeModel } from "../commons/DataMapperNode"; import { QueryExprMappingType } from "../QueryExpression"; @@ -128,6 +129,12 @@ export class FromClauseNode extends DataMapperNodeModel { parentPort.collapsed ); }); + } else { + const isOptional = isOptionalAndNillableField(this.typeDef); + this.numberOfFields += this.addPortsForInputRecordField( + this.typeDef, "OUT", this.nodeLabel, this.nodeLabel, + EXPANDED_QUERY_SOURCE_PORT_PREFIX, parentPort, this.context.collapsedFields, parentPort.collapsed, isOptional + ); } } } diff --git a/workspaces/ballerina/data-mapper-view/src/components/Diagram/Node/LinkConnector/LinkConnectorNode.ts b/workspaces/ballerina/data-mapper-view/src/components/Diagram/Node/LinkConnector/LinkConnectorNode.ts index 0a5ed2dde43..c1624bfe39f 100644 --- a/workspaces/ballerina/data-mapper-view/src/components/Diagram/Node/LinkConnector/LinkConnectorNode.ts +++ b/workspaces/ballerina/data-mapper-view/src/components/Diagram/Node/LinkConnector/LinkConnectorNode.ts @@ -114,11 +114,13 @@ export class LinkConnectorNode extends DataMapperNodeModel { const inputNode = getInputNodeExpr(field, this); if (inputNode) { const inputPort = getInputPortsForExpr(inputNode, field); - if (!this.sourcePorts.some(port => port.getID() === inputPort.getID())) { - this.sourcePorts.push(inputPort); - this.sourceValues[inputPort.getID()] = [field]; - } else { - this.sourceValues[inputPort.getID()].push(field); + if (inputPort) { + if (!this.sourcePorts.some(port => port.getID() === inputPort.getID())) { + this.sourcePorts.push(inputPort); + this.sourceValues[inputPort.getID()] = [field]; + } else { + this.sourceValues[inputPort.getID()].push(field); + } } } }) diff --git a/workspaces/ballerina/data-mapper-view/src/components/Diagram/Node/RequiredParam/RequiredParamNode.ts b/workspaces/ballerina/data-mapper-view/src/components/Diagram/Node/RequiredParam/RequiredParamNode.ts index dce85fc9112..5aa583f01c2 100644 --- a/workspaces/ballerina/data-mapper-view/src/components/Diagram/Node/RequiredParam/RequiredParamNode.ts +++ b/workspaces/ballerina/data-mapper-view/src/components/Diagram/Node/RequiredParam/RequiredParamNode.ts @@ -69,7 +69,7 @@ export class RequiredParamNode extends DataMapperNodeModel { }); } else { const isOptional = isOptionalAndNillableField(this.typeDef); - this.addPortsForInputRecordField( + this.numberOfFields += this.addPortsForInputRecordField( this.typeDef, "OUT", this.value.paramName.value, this.value.paramName.value, '', parentPort, this.context.collapsedFields, parentPort.collapsed, isOptional ); diff --git a/workspaces/ballerina/data-mapper-view/src/components/Diagram/Node/RequiredParam/RequiredParamNodeFactory.tsx b/workspaces/ballerina/data-mapper-view/src/components/Diagram/Node/RequiredParam/RequiredParamNodeFactory.tsx index 471fd31af0e..dbf2c70539d 100644 --- a/workspaces/ballerina/data-mapper-view/src/components/Diagram/Node/RequiredParam/RequiredParamNodeFactory.tsx +++ b/workspaces/ballerina/data-mapper-view/src/components/Diagram/Node/RequiredParam/RequiredParamNodeFactory.tsx @@ -27,7 +27,10 @@ export class RequiredParamNodeFactory extends AbstractReactFactory ); - } else if (event.model.typeDef && event.model.typeDef.typeName === PrimitiveBalType.Record) { + } else if (event.model.typeDef && + (event.model.typeDef.typeName === PrimitiveBalType.Record || + event.model.typeDef.typeName === PrimitiveBalType.Union) + ) { return ( 0; let expanded = true; - if (portOut && portOut.collapsed) { + if (portOut && (portOut.collapsed || portOut.hidden)) { expanded = false; } @@ -143,7 +154,7 @@ export function RecordTypeTreeWidget(props: RecordTypeTreeWidgetProps) { {expanded && hasFields && ( { - typeDesc.fields.map((field, index) => { + fields.map((field, index) => { return ( Date: Tue, 12 Aug 2025 16:26:36 +0530 Subject: [PATCH 346/349] Update changelog patch release date --- workspaces/ballerina/ballerina-extension/CHANGELOG.md | 2 +- workspaces/bi/bi-extension/CHANGELOG.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/CHANGELOG.md b/workspaces/ballerina/ballerina-extension/CHANGELOG.md index b44fc57fe74..c5bdd3cacf1 100644 --- a/workspaces/ballerina/ballerina-extension/CHANGELOG.md +++ b/workspaces/ballerina/ballerina-extension/CHANGELOG.md @@ -3,7 +3,7 @@ All notable changes to the "Ballerina" extension will be documented in this file. -## Version 5.3.1 (2025-08-07) +## Version 5.3.1 (2025-08-12) ### Fixed diff --git a/workspaces/bi/bi-extension/CHANGELOG.md b/workspaces/bi/bi-extension/CHANGELOG.md index e791d1b3f77..c7215e27a40 100644 --- a/workspaces/bi/bi-extension/CHANGELOG.md +++ b/workspaces/bi/bi-extension/CHANGELOG.md @@ -1,6 +1,6 @@ # Change log -## Version 1.2.1 (2025-08-07) +## Version 1.2.1 (2025-08-12) ### Fixed From 9dc7f11b31867070535b98a4ac7d3cf84dbcb2de Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Wed, 13 Aug 2025 08:18:06 +0530 Subject: [PATCH 347/349] Refactor changelog titles --- workspaces/ballerina/ballerina-extension/CHANGELOG.md | 5 +++-- workspaces/bi/bi-extension/CHANGELOG.md | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/CHANGELOG.md b/workspaces/ballerina/ballerina-extension/CHANGELOG.md index c5bdd3cacf1..4f36f470ed0 100644 --- a/workspaces/ballerina/ballerina-extension/CHANGELOG.md +++ b/workspaces/ballerina/ballerina-extension/CHANGELOG.md @@ -3,13 +3,14 @@ All notable changes to the "Ballerina" extension will be documented in this file. -## Version 5.3.1 (2025-08-12) +## **5.3.1** (2025-08-13) ### Fixed - Resolved issues affecting Inline Data Mapper functionality and flow diagram rendering -## Version 5.3.0 (2025-07-29) + +## **5.3.0** (2025-07-29) ### Major Updates diff --git a/workspaces/bi/bi-extension/CHANGELOG.md b/workspaces/bi/bi-extension/CHANGELOG.md index c7215e27a40..a65e0f449e4 100644 --- a/workspaces/bi/bi-extension/CHANGELOG.md +++ b/workspaces/bi/bi-extension/CHANGELOG.md @@ -1,12 +1,13 @@ # Change log -## Version 1.2.1 (2025-08-12) +## **1.2.1** (2025-08-13) ### Fixed - Resolved issues affecting Inline Data Mapper functionality and flow diagram rendering -## Version 1.2.0 (2025-07-29) + +## **1.2.0** (2025-07-29) ### Major Updates @@ -36,6 +37,7 @@ - **Configuration:** Fixed issues with Config.toml management and fast-run command failures. - **IDE Stability:** Addressed UI freezing, improved state management, and enhanced project handling in multi-root workspaces. + ## **1.1.0** (2025-07-14) ### Major Features From 274104f8cd3597f16dc48051667c2318b00fffd5 Mon Sep 17 00:00:00 2001 From: Vellummyilum Vinoth Date: Wed, 13 Aug 2025 09:39:14 +0530 Subject: [PATCH 348/349] Refactor code & Fix Incorrect Iteration --- .../src/rpc-types/ai-panel/interfaces.ts | 49 +- .../src/features/ai/dataMapping.ts | 5 +- .../ai/service/datamapper/datamapper.ts | 12 +- .../features/ai/service/datamapper/prompt.ts | 24 +- .../src/rpc-managers/ai-panel/constants.ts | 95 ++ .../src/rpc-managers/ai-panel/inline-utils.ts | 160 +-- .../src/rpc-managers/ai-panel/types.ts | 147 ++ .../src/rpc-managers/ai-panel/utils.ts | 1201 +++++++---------- .../src/views/ai-panel/errorCodes.ts | 4 +- .../test/ai/datamapper/datamapper.test.ts | 2 +- .../resources/Complex/case_18/expected.json | 1 + .../resources/Complex/case_18/mapping.json | 32 + .../resources/Complex/case_18/param_def.json | 199 +++ .../resources/Complex/case_20/expected.json | 1 + .../resources/Complex/case_20/mapping.json | 48 + .../resources/Complex/case_20/param_def.json | 233 ++++ .../resources/Complex/case_21/expected.json | 1 + .../resources/Complex/case_21/mapping.json | 73 + .../resources/Complex/case_21/param_def.json | 347 +++++ .../resources/Complex/case_22/expected.json | 1 + .../resources/Complex/case_22/mapping.json | 128 ++ .../resources/Complex/case_22/param_def.json | 593 ++++++++ .../test/ai/evals/code/code.test.ts | 2 +- 23 files changed, 2456 insertions(+), 902 deletions(-) create mode 100644 workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/types.ts create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_18/expected.json create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_18/mapping.json create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_18/param_def.json create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_20/expected.json create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_20/mapping.json create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_20/param_def.json create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_21/expected.json create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_21/mapping.json create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_21/param_def.json create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_22/expected.json create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_22/mapping.json create mode 100644 workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_22/param_def.json 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 da6e9e4b8ac..ac5b80a4290 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 @@ -87,12 +87,16 @@ export interface AddToProjectRequest { content: string; isTestCode: boolean; } + export interface GetFromFileRequest { filePath: string; } + export interface DeleteFromProjectRequest { filePath: string; } + +// Data-mapper related interfaces export interface GenerateMappingsRequest { position: NodePosition; filePath: string; @@ -111,51 +115,6 @@ export interface NotifyAIMappingsRequest { filePath: string; } -export interface ParameterMetadata { - inputs: object; - output: object; - inputMetadata: object; - outputMetadata: object; - mapping_fields?: object; - constants?: Record; - configurables?: Record; - variables?: Record; -} - -export interface RecordDefinitonObject { - recordFields: object; - recordFieldsMetadata: object; -} - -export interface MappingFileRecord { - mapping_fields: object; -} - -export interface ParameterDefinitions { - parameterMetadata: ParameterMetadata, - errorStatus: boolean -} - -export interface ParameterField { - isArrayType: boolean; - parameterName: string; - parameterType: string; - type: string; -} - -export interface FieldDescriptor { - type: string; - comment: string; -} - -export interface FieldConfig { - typeName: string; - type: string; - typeInstance: string; - nullable: boolean; - optional: boolean; -} - export interface CodeSegment { segmentText: string; filePath: string; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/dataMapping.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/dataMapping.ts index 0a08698caaf..df465995ab5 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/dataMapping.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/dataMapping.ts @@ -24,7 +24,7 @@ import * as fs from 'fs'; import * as os from 'os'; import { Uri, workspace } from "vscode"; import { langClient } from "./activator"; -import { getFunction, isErrorCode, processMappings, typesFileParameterDefinitions } from "../../rpc-managers/ai-panel/utils"; +import { getFunction, processMappings, typesFileParameterDefinitions } from "../../rpc-managers/ai-panel/utils"; import { MODIFIYING_ERROR } from "../../views/ai-panel/errorCodes"; import { writeBallerinaFileDidOpen } from "../../utils/modification"; @@ -103,9 +103,6 @@ async function getUpdatedFunctionSource( fileUri, file ); - if (isErrorCode(processedST)) { - throw new Error((processedST as ErrorCode).message); - } const { parseSuccess, source, syntaxTree } = processedST as SyntaxTree; if (!parseSuccess) { 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 index bb303dafc63..5d4e01fb7fc 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts @@ -467,10 +467,14 @@ function validateMappingOperation( // STEP 4: Validate SPLIT operation } else if (op.name === SPLIT) { - const paramOne = inputType[PARAMETER_1]; - const paramTwo = mapping.PARAMETER_2; - - if (!paramOne || !paramTwo) { + let paramOne: ParameterMetadata, paramTwo: string | MappingJson; + if (inputType[PARAMETER_1] && mapping.PARAMETER_2) { + paramOne = inputType[PARAMETER_1]; + paramTwo = mapping.PARAMETER_2; + } else if (inputType[PARAMETER_2] && mapping.PARAMETER_1) { + paramOne = inputType[PARAMETER_2]; + paramTwo = mapping.PARAMETER_1; + } else { throw new Error("Required parameters not found in input type for SPLIT operation"); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/prompt.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/prompt.ts index c0baa454bb3..2a123808886 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/prompt.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/prompt.ts @@ -60,18 +60,18 @@ Following operations/transformations can be used during a mapping between input 5) Member Access Expressions 5.1) x[y] : access y th element of x array object in the json 6) Regex Operations - 6.1) SPLIT(regex, text) : Split the string text based on the regex and returns an array of strings (string[]). + 6.1) SPLIT(text, regex) : Split the string text based on the regex and returns an array of strings (string[]). Example: - SPLIT(",", “word1, word2, word3”) will return a string array [“word1”, “word2”, “word3”]. - SPLIT(" ", “word1 word2 word3”) will return a string array [“word1”, “word2”, “word3”]. - 6.2) REPLACE_ALL(regex, text, replacement) : Replace all the instances of regex in the text using string replacement. - Example - REPLACE_ALL(" ", “word1 word2 word3”, "") will return a string “word1word2word3” + SPLIT("word1, word2, word3", ",") will return a string array ["word1", "word2", "word3"]. + SPLIT("word1 word2 word3", " ") will return a string array ["word1", "word2", "word3"]. + 6.2) REPLACE_ALL(text, regex, replacement) : Replace all the instances of regex in the text using string replacement. + Example - REPLACE_ALL("word1 word2 word3", " ", "") will return a string "word1word2word3" For above two operations, regex value must be one or combination of the following : [" ", "_", "-", "\n", ",", "\." ], here "\" is used to escape special characters. 7) Numerical Operations 7.1) AVERAGE(x, TYPE) : get the average over x. x is a single array of variables of TYPE (ex - [12, 13, 14]) when TYPE is INTEGER .TYPE can be either INT, DECIMAL, or FLOAT. 7.2) MAXIMUM(x, TYPE) : get the maximum over x. x is an array of variables of TYPE(ex - [12, 13, 14]) when TYPE is INTEGER .TYPE can be either INT, DECIMAL, or FLOAT. - 7.3) MINIMUM(x, TYPE) : get the minimum over x. x is an array of variables of TYPE (ex - [12, 13, 14]) when TYPE is INTEGER .TYPE can be either INT, DECIMAL, or FLOAT. + 7.3) MINIMUM(x, TYPE) : get the minimum over x. x is a single array of variables of TYPE (ex - [12, 13, 14]) when TYPE is INTEGER .TYPE can be either INT, DECIMAL, or FLOAT. 7.4) SUMMATION(x, TYPE) : get the summation over x. x is a single array of variables of TYPE(ex - [12, 13, 14]) when TYPE is INTEGER .TYPE can be either INT, DECIMAL, or FLOAT. 7.5) ABSOLUTE(x, TYPE) : get the absolute value of the given variable of TYPE, x .TYPE can be either INT, DECIMAL, or FLOAT. @@ -165,7 +165,7 @@ Example Input json : "comment":"zip code" } }, - academicDetails: { + "academicDetails": { "major":{ "type":"string", "optional" : false, @@ -292,12 +292,12 @@ Example Mapping: "OPERATION": { "NAME": "ADDITION", "PARAMETER_1": "studentDetails.address.address1", - "PARAMETER_2": ", " + "PARAMETER_2": ", ", "PARAMETER_3": "studentDetails.address.address2", "PARAMETER_4": ", ", "PARAMETER_5": "studentDetails.address.country", "PARAMETER_6": ", ", - "PARAMETER_7": "studentDetails.address.zip", + "PARAMETER_7": "studentDetails.address.zip" } }, "academicMajor": { @@ -313,8 +313,10 @@ Example Mapping: } }, "currentLevel": { - "OPERATION": "DIRECT", - "PARAMETER_1": "studentDetails.studentProgress.currentLevel" + "OPERATION": { + "NAME": "DIRECT", + "PARAMETER_1": "studentDetails.studentProgress.currentLevel" + } } } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/constants.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/constants.ts index 534951410d7..49c88fd0343 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/constants.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/constants.ts @@ -24,3 +24,98 @@ export const REQ_KEY = "user_requirements_file"; export const DEVELOPMENT_KEY = "developer_intention_file"; export const DEVELOPMENT_DOCUMENT = "developer.md"; export const TEST_DIR_NAME = "tests"; + +// Datamapper Constants +// Primitive data types supported by the datamapper +export enum PrimitiveType { + STRING = "string", + INT = "int", + FLOAT = "float", + DECIMAL = "decimal", + BOOLEAN = "boolean" +} + +export const NUMERIC_AND_BOOLEAN_TYPES = [ + PrimitiveType.INT, + PrimitiveType.FLOAT, + PrimitiveType.DECIMAL, + PrimitiveType.BOOLEAN +]; + +// Operations that can be performed during data mapping +export enum Operation { + DIRECT = "DIRECT", + LENGTH = "LENGTH", + SPLIT = "SPLIT", + ADDITION = "ADDITION", + SUBTRACTION = "SUBTRACTION", + MULTIPLICATION = "MULTIPLICATION", + DIVISION = "DIVISION", + MODULAR = "MODULAR", + EQUAL = "EQUAL", + NOTEQUAL = "NOTEQUAL", + LESS_THAN = "LESS_THAN", + LESS_THAN_OR_EQUAL = "LESS_THAN_OR_EQUAL", + AND = "AND", + OR = "OR", + REPLACE_ALL = "REPLACE_ALL", + AVERAGE = "AVERAGE", + MAXIMUM = "MAXIMUM", + MINIMUM = "MINIMUM", + SUMMATION = "SUMMATION", + ABSOLUTE = "ABSOLUTE" +} + +// Array types specifically for record data structures +export enum ArrayRecordType { + RECORD_ARRAY = "record[]", + RECORD_ARRAY_NULLABLE = "record[]|()", + READONLY_RECORD_ARRAY = "(readonly&record)[]", + READONLY_RECORD_ARRAY_NULLABLE = "(readonly&record)[]|()", + RECORD_OR_NULL_ARRAY = "(record|())[]", + RECORD_OR_NULL_ARRAY_NULLABLE = "(record|())[]|()", + READONLY_RECORD_OR_NULL_ARRAY = "(readonly&record|())[]", + READONLY_RECORD_OR_NULL_ARRAY_NULLABLE = "(readonly&record|())[]|()" +} + +// Array types for enum, union, and intersection data structures +export enum ArrayEnumUnionType { + ENUM_ARRAY = "enum[]", + UNION_ARRAY = "union[]", + INTERSECTION_ARRAY = "intersection[]", + ENUM_ARRAY_NULLABLE = "enum[]|()", + UNION_ARRAY_NULLABLE = "union[]|()", + INTERSECTION_ARRAY_NULLABLE = "intersection[]|()" +} + +export enum RecordType { + RECORD = "record", + RECORD_NULLABLE = "record|()", + READONLY_RECORD = "readonly&record", + READONLY_RECORD_NULLABLE = "readonly&record|()", + RECORD_ARRAY = "record[]", + RECORD_ARRAY_NULLABLE = "record[]|()", + READONLY_RECORD_ARRAY = "(readonly&record)[]", + READONLY_RECORD_ARRAY_NULLABLE = "(readonly&record)[]|()", + RECORD_OR_NULL_ARRAY = "(record|())[]", + RECORD_OR_NULL_ARRAY_NULLABLE = "(record|())[]|()", + READONLY_RECORD_OR_NULL_ARRAY = "(readonly&record|())[]", + READONLY_RECORD_OR_NULL_ARRAY_NULLABLE = "(readonly&record|())[]|()" +} + +export enum UnionEnumIntersectionType { + ENUM = "enum", + UNION = "union", + INTERSECTION = "intersection", + ENUM_ARRAY = "enum[]", + ENUM_ARRAY_NULLABLE = "enum[]|()", + UNION_ARRAY = "union[]", + UNION_ARRAY_NULLABLE = "union[]|()", + INTERSECTION_ARRAY = "intersection[]", + INTERSECTION_ARRAY_NULLABLE = "intersection[]|()" +} + +export enum MetadataType { + INPUT_METADATA = "inputMetadata", + OUTPUT_METADATA = "outputMetadata" +} diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/inline-utils.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/inline-utils.ts index a78f3303f93..cb63198594d 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/inline-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/inline-utils.ts @@ -7,20 +7,11 @@ * You may not alter or remove any copyright or other notice from copies of this content. */ -import { AIMachineEventType, Attachment, ErrorCode, ExpandedDMModel, FieldConfig, FormField, InlineDataMapperModelResponse, InputCategory, IOType, LoginMethod, Mapping, MappingElement, ParameterDefinitions, ParameterField, ParameterMetadata, RecordDefinitonObject, TypeKind } from "@wso2/ballerina-core"; -import { fetchWithTimeout, filterResponse, generateBallerinaCode, isErrorCode, mappingFileInlineDataMapperModel, navigateTypeInfo, REQUEST_TIMEOUT } from "./utils"; -import { getAccessToken, getLoginMethod, getRefreshedAccessToken } from "../../utils/ai/auth"; -import { NOT_LOGGED_IN, TIMEOUT } from "../../views/ai-panel/errorCodes"; -import { AIStateMachine } from "../../views/ai-panel/aiMachine"; -import { BACKEND_URL } from "../../features/ai/utils"; +import { Attachment, ExpandedDMModel, FormField, InlineDataMapperModelResponse, InputCategory, IOType, Mapping, MappingElement, TypeKind } from "@wso2/ballerina-core"; +import { generateBallerinaCode, mappingFileInlineDataMapperModel, navigateTypeInfo } from "./utils"; import { DatamapperResponse } from "../../../src/features/ai/service/datamapper/types"; import { generateInlineAutoMappings } from "../../../src/features/ai/service/datamapper/inline_datamapper"; - -let abortController = new AbortController(); - -export function handleStop() { - abortController.abort(); -} +import { FieldMetadata, ParameterDefinitions, ParameterField, ParameterMetadata } from "./types"; function transformIOType(input: IOType): FormField { const name = input.variableName || extractNameFromId(input.id); @@ -101,15 +92,15 @@ function extractNameFromId(id: string): string { } function transformInputs(inputs: IOType[]): { - constants: Record; - configurables: Record; - variables: Record; + constants: Record; + configurables: Record; + variables: Record; parameters: ParameterField[]; parameterFields: { [parameterName: string]: FormField[] }; } { - const constants: Record = {}; - const configurables: Record = {}; - const variables: Record = {}; + const constants: Record = {}; + const configurables: Record = {}; + const variables: Record = {}; const parameters: ParameterField[] = []; const parameterFields: { [parameterName: string]: FormField[] } = {}; @@ -152,7 +143,7 @@ function transformInputs(inputs: IOType[]): { }; }; - const createFieldConfig = (input: IOType): FieldConfig => { + const createFieldConfig = (input: IOType): FieldMetadata => { if (!input.typeName) { throw new Error("TypeName is missing"); } @@ -350,86 +341,53 @@ function transformCodeObjectToMappings(codeObject: any, request: InlineDataMappe export async function getInlineParamDefinitions( inlineDataMapperResponse: InlineDataMapperModelResponse ): Promise { - let inputs: { [key: string]: any } = {}; - let inputMetadata: { [key: string]: any } = {}; - let output: { [key: string]: any } = {}; - let outputMetadata: { [key: string]: any } = {}; - - let { inputs: mappingInputs, output: mappingOutput } = inlineDataMapperResponse.mappingsModel as ExpandedDMModel; - let transformedInputs = transformInputs(mappingInputs); - let transformedOutputs = transformOutput(mappingOutput); + const inputs: { [key: string]: any } = {}; + const inputMetadata: { [key: string]: any } = {}; + + const { inputs: mappingInputs, output: mappingOutput } = inlineDataMapperResponse.mappingsModel as ExpandedDMModel; + const transformedInputs = transformInputs(mappingInputs); + const transformedOutputs = transformOutput(mappingOutput); for (const parameter of transformedInputs.parameters) { - try { - const inputDefinition = navigateTypeInfo(transformedInputs.parameterFields[parameter.parameterName], false); - inputs = { - ...inputs, - [parameter.parameterName]: (inputDefinition as RecordDefinitonObject).recordFields - }; - inputMetadata = { - ...inputMetadata, - [parameter.parameterName]: { - "isArrayType": parameter.isArrayType, - "parameterName": parameter.parameterName, - "parameterType": parameter.parameterType, - "type": parameter.type, - "fields": (inputDefinition as RecordDefinitonObject).recordFieldsMetadata - } - }; - } catch (error) { - console.error(`Error in process input parameter: ${parameter.parameterName}`); - throw new Error(`Failed to process input parameter: ${parameter.parameterName}`); - } - } - - try { - const outputDefinition = navigateTypeInfo(transformedOutputs, false); - output = { ...(outputDefinition as RecordDefinitonObject).recordFields }; - outputMetadata = { ...(outputDefinition as RecordDefinitonObject).recordFieldsMetadata }; - } catch (error) { - console.error(`Error in process output definition: ${error}`); - throw new Error('Failed to process output definition'); + const inputDefinition = navigateTypeInfo(transformedInputs.parameterFields[parameter.parameterName], false); + + inputs[parameter.parameterName] = inputDefinition.recordFields; + inputMetadata[parameter.parameterName] = { + "isArrayType": parameter.isArrayType, + "parameterName": parameter.parameterName, + "parameterType": parameter.parameterType, + "type": parameter.type, + "fields": inputDefinition.recordFieldsMetadata + }; } - const response = { - inputs, - output, - inputMetadata, - outputMetadata, - constants: transformedInputs.constants, - configurables: transformedInputs.configurables, - variables: transformedInputs.variables - }; + const outputDefinition = navigateTypeInfo(transformedOutputs, false); + const output = { ...outputDefinition.recordFields }; + const outputMetadata = { ...outputDefinition.recordFieldsMetadata }; return { - parameterMetadata: response, + parameterMetadata: { + inputs, + output, + inputMetadata, + outputMetadata, + constants: transformedInputs.constants, + configurables: transformedInputs.configurables, + variables: transformedInputs.variables + }, errorStatus: false }; } -async function sendInlineDatamapperRequest(inlineDataMapperResponse: InlineDataMapperModelResponse | ErrorCode): Promise { - try { - const response: DatamapperResponse = await generateInlineAutoMappings(inlineDataMapperResponse as InlineDataMapperModelResponse); - return response; - } catch (error) { - console.error(`Error in sendInlineDatamapperRequest: ${error}`); - throw error; - } +async function sendInlineDatamapperRequest(inlineDataMapperResponse: InlineDataMapperModelResponse): Promise { + const response: DatamapperResponse = await generateInlineAutoMappings(inlineDataMapperResponse); + return response; } -async function getInlineDatamapperCode(inlineDataMapperResponse: InlineDataMapperModelResponse | ErrorCode, parameterDefinitions: ParameterMetadata | ErrorCode): Promise { +async function getInlineDatamapperCode(inlineDataMapperResponse: InlineDataMapperModelResponse, parameterDefinitions: ParameterMetadata): Promise> { let nestedKeyArray: string[] = []; try { - let accessToken: string | ErrorCode; - const loginMethod = await getLoginMethod(); - if (loginMethod === LoginMethod.BI_INTEL) { - accessToken = await getAccessToken().catch((error) => { - console.error(error); - return NOT_LOGGED_IN; - }); - } let response: DatamapperResponse = await sendInlineDatamapperRequest(inlineDataMapperResponse); - let intermediateMapping = response.mappings; let finalCode = await generateBallerinaCode(intermediateMapping, parameterDefinitions, "", nestedKeyArray); return finalCode; @@ -442,27 +400,17 @@ async function getInlineDatamapperCode(inlineDataMapperResponse: InlineDataMappe export async function processInlineMappings( request: ExpandedDMModel, file?: Attachment -): Promise { - let inlineDataMapperResponse = cleanInlineDataMapperModelResponse(request) as InlineDataMapperModelResponse; - - try { - let result = await getInlineParamDefinitions(inlineDataMapperResponse); - - let parameterDefinitions = (result as ParameterDefinitions).parameterMetadata; - if (file) { - let mappedResult = await mappingFileInlineDataMapperModel(file, inlineDataMapperResponse); - if (isErrorCode(mappedResult)) { - return mappedResult as ErrorCode; - } - inlineDataMapperResponse = mappedResult as InlineDataMapperModelResponse; - } - - const codeObject = await getInlineDatamapperCode(inlineDataMapperResponse, parameterDefinitions); - - const mappings: Mapping[] = transformCodeObjectToMappings(codeObject, inlineDataMapperResponse); - return { mappings }; - } catch (error) { - console.error(error); - throw error; +): Promise { + let inlineDataMapperResponse = cleanInlineDataMapperModelResponse(request); + const result = await getInlineParamDefinitions(inlineDataMapperResponse); + const parameterDefinitions = (result as ParameterDefinitions).parameterMetadata; + + if (file) { + const mappedResult = await mappingFileInlineDataMapperModel(file, inlineDataMapperResponse); + inlineDataMapperResponse = mappedResult as InlineDataMapperModelResponse; } + + const codeObject = await getInlineDatamapperCode(inlineDataMapperResponse, parameterDefinitions); + const mappings: Mapping[] = transformCodeObjectToMappings(codeObject, inlineDataMapperResponse); + return { mappings }; } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/types.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/types.ts new file mode 100644 index 00000000000..19f67c5883c --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/types.ts @@ -0,0 +1,147 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/** + * 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. + */ + +// Data-mapper related interfaces +export interface SimpleFieldDescriptor { + type: string; + comment: string; +} + +export interface NestedFieldDescriptor { + [key: string]: SimpleFieldDescriptor | NestedFieldDescriptor; +} + +export interface RecordDefinitonObject { + recordFields: NestedFieldDescriptor; + recordFieldsMetadata: { + [fieldName: string]: FieldMetadata; + }; +} + +export interface FieldMetadata { + typeName: string; + type: string; + typeInstance: string; + optional: boolean; + nullable?: boolean; + nullableArray?: boolean; + members?: { + [memberName: string]: FieldMetadata; + }; + fields?: { + [fieldName: string]: FieldMetadata; + }; +} + +export interface ParameterField { + isArrayType: boolean; + parameterName: string; + parameterType: string; + type: string; + members?: { + [memberName: string]: FieldMetadata; + }; + fields?: { + [fieldName: string]: FieldMetadata; + }; +} + +export interface InputMetadata { + [parameterName: string]: ParameterField; +} + +export interface OutputMetadata { + [fieldName: string]: FieldMetadata; +} + +export interface MappingField { + MAPPING_TIP: string; + INPUT_FIELDS: string[]; +} + +export interface MappingFields { + [outputField: string]: MappingField; +} + +export interface MappingFileRecord { + mapping_fields: MappingFields; +} + +export interface ParameterMetadata { + inputs: NestedFieldDescriptor; + output: NestedFieldDescriptor; + inputMetadata: InputMetadata; + outputMetadata: OutputMetadata; + mapping_fields?: MappingFields; + constants?: Record; + configurables?: Record; + variables?: Record; +} + +export interface ParameterDefinitions { + parameterMetadata: ParameterMetadata; + errorStatus: boolean; +} + +export interface VisitorContext { + recordFields: NestedFieldDescriptor; + recordFieldsMetadata: { [key: string]: FieldMetadata }; + memberRecordFields: NestedFieldDescriptor; + memberFieldsMetadata: { [key: string]: FieldMetadata }; + fieldMetadata: FieldMetadata; + isNill: boolean; + isNullable: boolean; + isArray: boolean; + isRecord: boolean; + isSimple: boolean; + isUnion: boolean; + isArrayNullable: boolean; + isRecordNullable: boolean; + memberName: string; +} + +export interface MappingData { + operation: string; + parameters: string[]; + targetType: string; +} + +export interface IntermediateMapping { + [key: string]: MappingData | IntermediateMapping; +} + +export interface MappingsResponse { + mappings: IntermediateMapping; +} + +export interface ProcessParentKeyResult { + itemKey: string; + combinedKey: string; + inputArrayNullable: boolean; + isSet: boolean; + isInputDeeplyNested: boolean; +} + +export interface ProcessCombinedKeyResult { + isinputRecordArrayNullable: boolean; + isinputRecordArrayOptional: boolean; + isinputArrayNullable: boolean; + isinputArrayOptional: boolean; + isinputNullableArray: boolean; +} 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 c6ddf511b5a..0b9e82a1d19 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 @@ -17,32 +17,25 @@ */ import { ArrayTypeDesc, FunctionDefinition, ModulePart, QualifiedNameReference, RequiredParam, STKindChecker } from "@wso2/syntax-tree"; -import { ErrorCode, FormField, STModification, SyntaxTree, Attachment, AttachmentStatus, RecordDefinitonObject, ParameterMetadata, ParameterDefinitions, MappingFileRecord, keywords, AIMachineEventType, DiagnosticEntry, InlineDataMapperModelResponse } from "@wso2/ballerina-core"; +import { FormField, STModification, SyntaxTree, Attachment, AttachmentStatus, keywords, DiagnosticEntry, InlineDataMapperModelResponse } from "@wso2/ballerina-core"; import { window } from 'vscode'; import { StateMachine } from "../../stateMachine"; import { - ENDPOINT_REMOVED, INVALID_PARAMETER_TYPE, INVALID_PARAMETER_TYPE_MULTIPLE_ARRAY, - PARSING_ERROR, - TIMEOUT, - NOT_LOGGED_IN, - SERVER_ERROR, - TOO_MANY_REQUESTS, INVALID_RECORD_UNION_TYPE } from "../../views/ai-panel/errorCodes"; -// import { StateMachineAI } from "../../views/ai-panel/aiMachine"; import path from "path"; import * as fs from 'fs'; import { BACKEND_URL } from "../../features/ai/utils"; -import { getAccessToken, getRefreshedAccessToken } from "../../../src/utils/ai/auth"; -import { AIStateMachine } from "../../../src/views/ai-panel/aiMachine"; import { AIChatError } from "./utils/errors"; import { generateAutoMappings } from "../../../src/features/ai/service/datamapper/datamapper"; import { DatamapperResponse, Payload } from "../../../src/features/ai/service/datamapper/types"; import { DataMapperRequest, DataMapperResponse, FileData, processDataMapperInput } from "../../../src/features/ai/service/datamapper/context_api"; import { getAskResponse } from "../../../src/features/ai/service/ask/ask"; +import { ArrayEnumUnionType, ArrayRecordType, MetadataType, NUMERIC_AND_BOOLEAN_TYPES, Operation, PrimitiveType, RecordType, UnionEnumIntersectionType } from "./constants"; +import { FieldMetadata, InputMetadata, IntermediateMapping, MappingData, MappingFileRecord, NestedFieldDescriptor, OutputMetadata, ParameterDefinitions, ParameterField, ParameterMetadata, ProcessCombinedKeyResult, ProcessParentKeyResult, RecordDefinitonObject } from "./types"; const BACKEND_BASE_URL = BACKEND_URL.replace(/\/v2\.0$/, ""); //TODO: Temp workaround as custom domain seem to block file uploads @@ -53,7 +46,6 @@ const ASK_API_URL_V1 = BACKEND_BASE_URL + "/ask-api/v1.0"; export const REQUEST_TIMEOUT = 2000000; let abortController = new AbortController(); -const primitiveTypes = ["string", "int", "float", "decimal", "boolean"]; export class AIPanelAbortController { private static instance: AIPanelAbortController; @@ -85,262 +77,255 @@ export function handleStop() { AIPanelAbortController.getInstance().abort(); } +const isPrimitiveType = (type: string): boolean => { + return Object.values(PrimitiveType).includes(type as PrimitiveType); +}; + +const isUnionEnumIntersectionType = (type: string): boolean => { + return Object.values(UnionEnumIntersectionType).includes(type as UnionEnumIntersectionType); +}; + +const isRecordType = (type: string): boolean => { + return Object.values(RecordType).includes(type as RecordType); +}; + +const isArrayRecord = (type: string): boolean => { + return Object.values(ArrayRecordType).includes(type as ArrayRecordType); +}; + +const isArrayEnumUnion = (type: string): boolean => { + return Object.values(ArrayEnumUnionType).includes(type as ArrayEnumUnionType); +}; + export async function getParamDefinitions( fnSt: FunctionDefinition, fileUri: string -): Promise { - let inputs: { [key: string]: any } = {}; - let inputMetadata: { [key: string]: any } = {}; - let output: { [key: string]: any } = {}; - let outputMetadata: { [key: string]: any } = {}; - let hasArrayParams = false; - let arrayParams = 0; - let isErrorExists = false; - - for (const parameter of fnSt.functionSignature.parameters) { - if (!STKindChecker.isRequiredParam(parameter)) { - continue; - } - - const param = parameter as RequiredParam; - let paramName = param.paramName.value; - let paramType = ""; +): Promise { + try { + const inputs: NestedFieldDescriptor = {}; + const inputMetadata: InputMetadata = {}; + let output: NestedFieldDescriptor = {}; + let outputMetadata: OutputMetadata = {}; + let hasArrayParams = false; + let arrayParams = 0; + let isErrorExists = false; + + for (const parameter of fnSt.functionSignature.parameters) { + if (!STKindChecker.isRequiredParam(parameter)) { + continue; + } - if (STKindChecker.isArrayTypeDesc(param.typeName)) { - arrayParams++; - } + const param = parameter as RequiredParam; + let paramName = param.paramName.value; + let paramType = ""; - if (param.typeData.typeSymbol.typeKind === "array") { - paramType = param.typeName.source; - } else if (param.typeData.typeSymbol.typeKind === "typeReference") { - paramType = param.typeData.typeSymbol.name; - } else { - paramType = param.typeName.source; - } + if (STKindChecker.isArrayTypeDesc(param.typeName) && STKindChecker.isArrayTypeDesc(fnSt.functionSignature.returnTypeDesc.type)) { + paramName = `${paramName}Item`; + arrayParams++; + } - const position = STKindChecker.isQualifiedNameReference(param.typeName) - ? { - line: (param.typeName as QualifiedNameReference).identifier.position.startLine, - offset: (param.typeName as QualifiedNameReference).identifier.position.startColumn + if (param.typeData.typeSymbol.typeKind === "array") { + paramType = param.typeName.source; + } else if (param.typeData.typeSymbol.typeKind === "typeReference") { + paramType = param.typeData.typeSymbol.name; + } else { + paramType = param.typeName.source; } - : STKindChecker.isArrayTypeDesc(param.typeName) && STKindChecker.isQualifiedNameReference( - (param.typeName as ArrayTypeDesc).memberTypeDesc) + + const position = STKindChecker.isQualifiedNameReference(param.typeName) ? { - line: ((param.typeName as ArrayTypeDesc).memberTypeDesc as QualifiedNameReference).identifier.position.startLine, - offset: ((param.typeName as ArrayTypeDesc).memberTypeDesc as QualifiedNameReference).identifier.position.startColumn + line: (param.typeName as QualifiedNameReference).identifier.position.startLine, + offset: (param.typeName as QualifiedNameReference).identifier.position.startColumn } - : { - line: parameter.position.startLine, - offset: parameter.position.startColumn - }; - const inputTypeDefinition = await StateMachine.langClient().getTypeFromSymbol({ - documentIdentifier: { - uri: fileUri - }, - positions: [position] - }); - - if ('types' in inputTypeDefinition && inputTypeDefinition.types.length > 1) { - return INVALID_PARAMETER_TYPE; - } - - if ('types' in inputTypeDefinition && !inputTypeDefinition.types[0].hasOwnProperty('type')) { - if (STKindChecker.isQualifiedNameReference(parameter.typeName)) { - throw new Error(`"${parameter.typeName["identifier"].value}" does not exist in the package "${parameter.typeName["modulePrefix"].value}". Please verify the record name or ensure that the correct package is imported.`); + : STKindChecker.isArrayTypeDesc(param.typeName) && STKindChecker.isQualifiedNameReference( + (param.typeName as ArrayTypeDesc).memberTypeDesc) + ? { + line: ((param.typeName as ArrayTypeDesc).memberTypeDesc as QualifiedNameReference).identifier.position.startLine, + offset: ((param.typeName as ArrayTypeDesc).memberTypeDesc as QualifiedNameReference).identifier.position.startColumn + } + : { + line: parameter.position.startLine, + offset: parameter.position.startColumn + }; + + const inputTypeDefinition = await StateMachine.langClient().getTypeFromSymbol({ + documentIdentifier: { + uri: fileUri + }, + positions: [position] + }); + + if ('types' in inputTypeDefinition && inputTypeDefinition.types.length > 1) { + throw new Error(INVALID_PARAMETER_TYPE.message); } - return INVALID_PARAMETER_TYPE; - } - if (inputTypeDefinition["types"] && inputTypeDefinition["types"].length > 0) { - const type = inputTypeDefinition["types"][0].type; - if (type.typeName === "union" && type.members) { - const hasFields = type.members.some(member => member.fields && member.fields.length > 0); - if (hasFields) { - return INVALID_RECORD_UNION_TYPE; + if ('types' in inputTypeDefinition && !inputTypeDefinition.types[0].hasOwnProperty('type')) { + if (STKindChecker.isQualifiedNameReference(parameter.typeName)) { + throw new Error(`"${parameter.typeName["identifier"].value}" does not exist in the package "${parameter.typeName["modulePrefix"].value}". Please verify the record name or ensure that the correct package is imported.`); } + throw new Error(INVALID_PARAMETER_TYPE.message); } - } - let inputDefinition: ErrorCode | RecordDefinitonObject; - if ('types' in inputTypeDefinition && inputTypeDefinition.types[0].type.hasOwnProperty('fields')) { - inputDefinition = navigateTypeInfo(inputTypeDefinition.types[0].type.fields, false); - } else { - let singleFieldType = 'types' in inputTypeDefinition && inputTypeDefinition.types[0].type; - inputDefinition = { - "recordFields": { [paramName]: { "type": singleFieldType.typeName, "comment": "" } }, - "recordFieldsMetadata": { - [paramName]: { - "typeName": singleFieldType.typeName, - "type": singleFieldType.typeName, - "typeInstance": paramName, - "nullable": false, - "optional": false - } - } - }; - } + const inputType = inputTypeDefinition["types"]?.[0].type; + if (inputType?.typeName === "union" && inputType.members?.some((m: { fields: string | any[]; }) => m.fields?.length > 0)) { + throw new Error(INVALID_RECORD_UNION_TYPE.message); + } - if (isErrorCode(inputDefinition)) { - return inputDefinition as ErrorCode; - } + let inputDefinition: RecordDefinitonObject; + if (inputType?.fields) { + inputDefinition = navigateTypeInfo(inputType.fields, false); + } else { + inputDefinition = { + "recordFields": { [paramName]: { "type": inputType.typeName, "comment": "" } }, + "recordFieldsMetadata": { + [paramName]: { + "typeName": inputType.typeName, + "type": inputType.typeName, + "typeInstance": paramName, + "nullable": false, + "optional": false + } + } + }; + } - inputs = { ...inputs, [paramName]: (inputDefinition as RecordDefinitonObject).recordFields }; - inputMetadata = { - ...inputMetadata, - [paramName]: { - "isArrayType": STKindChecker.isArrayTypeDesc(parameter.typeName), - "parameterName": paramName, - "parameterType": paramType, - "type": STKindChecker.isArrayTypeDesc(parameter.typeName) ? "record[]" : "record", - "fields": (inputDefinition as RecordDefinitonObject).recordFieldsMetadata + inputs[paramName] = inputDefinition.recordFields; + inputMetadata[paramName] = { + isArrayType: STKindChecker.isArrayTypeDesc(parameter.typeName), + parameterName: paramName, + parameterType: paramType, + type: STKindChecker.isArrayTypeDesc(parameter.typeName) ? "record[]" : "record", + fields: inputDefinition.recordFieldsMetadata, + }; + if (STKindChecker.isArrayTypeDesc(parameter.typeName)) { + hasArrayParams = true; } - }; - if (STKindChecker.isArrayTypeDesc(parameter.typeName)) { - hasArrayParams = true; } - } - if (STKindChecker.isUnionTypeDesc(fnSt.functionSignature.returnTypeDesc.type)) { - let unionType = fnSt.functionSignature.returnTypeDesc.type; - let leftType = unionType.leftTypeDesc; - let rightType = unionType.rightTypeDesc; + if (STKindChecker.isUnionTypeDesc(fnSt.functionSignature.returnTypeDesc.type)) { + let unionType = fnSt.functionSignature.returnTypeDesc.type; + let leftType = unionType.leftTypeDesc; + let rightType = unionType.rightTypeDesc; - if (STKindChecker.isArrayTypeDesc(leftType) && STKindChecker.isErrorTypeDesc(rightType)) { - if (!STKindChecker.isSimpleNameReference(leftType.memberTypeDesc)) { - return INVALID_PARAMETER_TYPE; + if (STKindChecker.isArrayTypeDesc(leftType) && STKindChecker.isErrorTypeDesc(rightType)) { + if (!STKindChecker.isSimpleNameReference(leftType.memberTypeDesc)) { + throw new Error(INVALID_PARAMETER_TYPE.message); + } + isErrorExists = true; + } else if (STKindChecker.isArrayTypeDesc(rightType) && STKindChecker.isErrorTypeDesc(leftType)) { + if (!STKindChecker.isSimpleNameReference(rightType.memberTypeDesc)) { + throw new Error(INVALID_PARAMETER_TYPE.message); + } + isErrorExists = true; + } else if ( + (STKindChecker.isSimpleNameReference(leftType) || STKindChecker.isQualifiedNameReference(leftType)) && + STKindChecker.isErrorTypeDesc(rightType)) { + isErrorExists = true; + } else if ( + (STKindChecker.isSimpleNameReference(rightType) || STKindChecker.isQualifiedNameReference(rightType)) && + STKindChecker.isErrorTypeDesc(leftType)) { + isErrorExists = true; + } else { + throw new Error(INVALID_PARAMETER_TYPE.message); } - isErrorExists = true; - } else if (STKindChecker.isArrayTypeDesc(rightType) && STKindChecker.isErrorTypeDesc(leftType)) { - if (!STKindChecker.isSimpleNameReference(rightType.memberTypeDesc)) { - return INVALID_PARAMETER_TYPE; + } else if (STKindChecker.isArrayTypeDesc(fnSt.functionSignature.returnTypeDesc.type)) { + if (arrayParams > 1) { + throw new Error(INVALID_PARAMETER_TYPE_MULTIPLE_ARRAY.message); + } + if (!hasArrayParams) { + throw new Error(INVALID_PARAMETER_TYPE_MULTIPLE_ARRAY.message); + } + if (!(STKindChecker.isSimpleNameReference(fnSt.functionSignature.returnTypeDesc.type.memberTypeDesc) || + STKindChecker.isQualifiedNameReference(fnSt.functionSignature.returnTypeDesc.type.memberTypeDesc))) { + throw new Error(INVALID_PARAMETER_TYPE.message); } - isErrorExists = true; - } else if ( - (STKindChecker.isSimpleNameReference(leftType) || STKindChecker.isQualifiedNameReference(leftType)) && - STKindChecker.isErrorTypeDesc(rightType)) { - isErrorExists = true; - } else if ( - (STKindChecker.isSimpleNameReference(rightType) || STKindChecker.isQualifiedNameReference(rightType)) && - STKindChecker.isErrorTypeDesc(leftType)) { - isErrorExists = true; } else { - return INVALID_PARAMETER_TYPE; - } - } else if (STKindChecker.isArrayTypeDesc(fnSt.functionSignature.returnTypeDesc.type)) { - if (arrayParams > 1) { - return INVALID_PARAMETER_TYPE_MULTIPLE_ARRAY; - } - if (!hasArrayParams) { - return INVALID_PARAMETER_TYPE_MULTIPLE_ARRAY; - } - if (!(STKindChecker.isSimpleNameReference(fnSt.functionSignature.returnTypeDesc.type.memberTypeDesc) || - STKindChecker.isQualifiedNameReference(fnSt.functionSignature.returnTypeDesc.type.memberTypeDesc))) { - return INVALID_PARAMETER_TYPE; - } - } else { - if (!STKindChecker.isSimpleNameReference(fnSt.functionSignature.returnTypeDesc.type) && - !STKindChecker.isQualifiedNameReference(fnSt.functionSignature.returnTypeDesc.type)) { - return INVALID_PARAMETER_TYPE; + if (!STKindChecker.isSimpleNameReference(fnSt.functionSignature.returnTypeDesc.type) && + !STKindChecker.isQualifiedNameReference(fnSt.functionSignature.returnTypeDesc.type)) { + throw new Error(INVALID_PARAMETER_TYPE.message); + } } - } - let returnType = fnSt.functionSignature.returnTypeDesc.type; + let returnType = fnSt.functionSignature.returnTypeDesc.type; - const returnTypePosition = STKindChecker.isUnionTypeDesc(returnType) - ? { - line: STKindChecker.isErrorTypeDesc(returnType.leftTypeDesc) - ? returnType.rightTypeDesc.position.startLine - : returnType.leftTypeDesc.position.startLine, - offset: STKindChecker.isErrorTypeDesc(returnType.leftTypeDesc) - ? returnType.rightTypeDesc.position.startColumn - : returnType.leftTypeDesc.position.startColumn - } - : STKindChecker.isArrayTypeDesc(returnType) && STKindChecker.isQualifiedNameReference(returnType.memberTypeDesc) + const returnTypePosition = STKindChecker.isUnionTypeDesc(returnType) ? { - line: returnType.memberTypeDesc.identifier.position.startLine, - offset: returnType.memberTypeDesc.identifier.position.startColumn + line: STKindChecker.isErrorTypeDesc(returnType.leftTypeDesc) + ? returnType.rightTypeDesc.position.startLine + : returnType.leftTypeDesc.position.startLine, + offset: STKindChecker.isErrorTypeDesc(returnType.leftTypeDesc) + ? returnType.rightTypeDesc.position.startColumn + : returnType.leftTypeDesc.position.startColumn } - : STKindChecker.isQualifiedNameReference(returnType) + : STKindChecker.isArrayTypeDesc(returnType) && STKindChecker.isQualifiedNameReference(returnType.memberTypeDesc) ? { - line: returnType.identifier.position.startLine, - offset: returnType.identifier.position.startColumn + line: returnType.memberTypeDesc.identifier.position.startLine, + offset: returnType.memberTypeDesc.identifier.position.startColumn } - : { - line: returnType.position.startLine, - offset: returnType.position.startColumn - }; - - const outputTypeDefinition = await StateMachine.langClient().getTypeFromSymbol({ - documentIdentifier: { - uri: fileUri - }, - positions: [returnTypePosition] - }); + : STKindChecker.isQualifiedNameReference(returnType) + ? { + line: returnType.identifier.position.startLine, + offset: returnType.identifier.position.startColumn + } + : { + line: returnType.position.startLine, + offset: returnType.position.startColumn + }; - if ('types' in outputTypeDefinition && !outputTypeDefinition.types[0].hasOwnProperty('type')) { - if (STKindChecker.isQualifiedNameReference(returnType)) { - throw new Error(`"${returnType["identifier"].value}" does not exist in the package "${returnType["modulePrefix"].value}". Please verify the record name or ensure that the correct package is imported.`); - } - return INVALID_PARAMETER_TYPE; - } + const outputTypeDefinition = await StateMachine.langClient().getTypeFromSymbol({ + documentIdentifier: { + uri: fileUri + }, + positions: [returnTypePosition] + }); - if (outputTypeDefinition["types"] && outputTypeDefinition["types"].length > 0) { - const type = outputTypeDefinition["types"][0].type; - if (type.typeName === "union" && type.members) { - const hasFields = type.members.some(member => member.fields); - if (hasFields) { - return INVALID_RECORD_UNION_TYPE; + if ('types' in outputTypeDefinition && !outputTypeDefinition.types[0].hasOwnProperty('type')) { + if (STKindChecker.isQualifiedNameReference(returnType)) { + throw new Error(`"${returnType["identifier"].value}" does not exist in the package "${returnType["modulePrefix"].value}". Please verify the record name or ensure that the correct package is imported.`); } + throw new Error(INVALID_PARAMETER_TYPE.message); } - } - const outputDefinition = navigateTypeInfo('types' in outputTypeDefinition && outputTypeDefinition.types[0].type.fields, false); - - if (isErrorCode(outputDefinition)) { - return outputDefinition as ErrorCode; - } + const outputType = outputTypeDefinition["types"]?.[0].type; + if (outputType?.typeName === "union" && outputType.members?.some((m) => m.fields)) { + throw new Error(INVALID_RECORD_UNION_TYPE.message); + } - output = { ...(outputDefinition as RecordDefinitonObject).recordFields }; - outputMetadata = { ...(outputDefinition as RecordDefinitonObject).recordFieldsMetadata }; + const outputDefinition = navigateTypeInfo('types' in outputTypeDefinition && outputTypeDefinition.types[0].type.fields, false); + output = { ...outputDefinition.recordFields }; + outputMetadata = { ...outputDefinition.recordFieldsMetadata }; - const response = { - inputs, - output, - inputMetadata, - outputMetadata - }; + const response = { + inputs, + output, + inputMetadata, + outputMetadata + }; - return { - parameterMetadata: response, - errorStatus: isErrorExists - }; + return { + parameterMetadata: response, + errorStatus: isErrorExists + }; + } catch (error) { + throw error; + } } export async function processMappings( fnSt: FunctionDefinition, fileUri: string, file?: Attachment -): Promise { +): Promise { let result = await getParamDefinitions(fnSt, fileUri); - if (isErrorCode(result)) { - return result as ErrorCode; - } - let parameterDefinitions = (result as ParameterDefinitions).parameterMetadata; - const isErrorExists = (result as ParameterDefinitions).errorStatus; + let parameterDefinitions = result.parameterMetadata; + const isErrorExists = result.errorStatus; if (file) { let mappedResult = await mappingFileParameterDefinitions(file, parameterDefinitions); - if (isErrorCode(mappedResult)) { - return mappedResult as ErrorCode; - } parameterDefinitions = mappedResult as ParameterMetadata; } const codeObject = await getDatamapperCode(parameterDefinitions); - if (isErrorCode(codeObject) || Object.keys(codeObject).length === 0) { - return codeObject as ErrorCode; - } - const { recordString, isCheckError } = await constructRecord(codeObject); let codeString: string; const parameter = fnSt.functionSignature.parameters[0] as RequiredParam; @@ -387,59 +372,87 @@ export async function processMappings( return stModifyResponse as SyntaxTree; } +function isMappingData(obj: MappingData | IntermediateMapping): obj is MappingData { + return ( + typeof obj === "object" && + obj !== null && + typeof obj.operation === "string" && + Array.isArray(obj.parameters) && + typeof obj.targetType === "string" + ); +} -export async function generateBallerinaCode(response: object, parameterDefinitions: ParameterMetadata | ErrorCode, nestedKey: string = "", nestedKeyArray: string[]): Promise { - let recordFields: { [key: string]: any } = {}; - const arrayRecords = [ - "record[]", "record[]|()", "(readonly&record)[]", "(readonly&record)[]|()", - "(record|())[]", "(record|())[]|()", "(readonly&record|())[]", "(readonly&record|())[]|()", - ]; - const arrayEnumUnion = ["enum[]", "union[]", "intersection[]", "enum[]|()", "union[]|()", "intersection[]|()"]; - const recordTypes = [ - "record", "record|()", "readonly&record", "readonly&record|()", - "record[]", "record[]|()", "(readonly&record)[]", "(readonly&record)[]|()", - "(record|())[]", "(record|())[]|()", "(readonly&record|())[]", "(readonly&record|())[]|()", - ]; - const unionEnumIntersectionTypes = [ - "enum", "union", "intersection", "enum[]", - "enum[]|()", "union[]", "union[]|()", "intersection[]", "intersection[]|()"]; - - if (response.hasOwnProperty("code") && response.hasOwnProperty("message")) { - return response as ErrorCode; +export async function generateBallerinaCode( + response: IntermediateMapping, + parameterDefinitions: ParameterMetadata, + nestedKey: string = "", + nestedKeyArray: string[] +): Promise> { + let recordFields: Record = {}; + if (isMappingData(response)) { + return await processMappingData( + response, + parameterDefinitions, + nestedKey, + nestedKeyArray + ); } - if (response.hasOwnProperty("operation") && response.hasOwnProperty("parameters") && response.hasOwnProperty("targetType")) { - let parameters: string[] = response["parameters"]; - let paths = parameters[0].split("."); - - let path = await getMappingString(response, parameterDefinitions, nestedKey, recordTypes, unionEnumIntersectionTypes, arrayRecords, arrayEnumUnion, nestedKeyArray); + const objectKeys = Object.keys(response); + for (const key of objectKeys) { + const subRecord = response[key]; + if (isMappingData(subRecord)) { + const nestedResponseRecord = await processMappingData( + subRecord, + parameterDefinitions, + key, + nestedKeyArray + ); + Object.assign(recordFields, nestedResponseRecord); + } else { + nestedKeyArray.push(key); + const responseRecord = await generateBallerinaCode( + subRecord as IntermediateMapping, + parameterDefinitions, + key, + nestedKeyArray + ); + const recordFieldDetails = await handleRecordArrays( + key, + nestedKey, + responseRecord, + parameterDefinitions, + nestedKeyArray + ); + nestedKeyArray.pop(); + Object.assign(recordFields, recordFieldDetails); + } + } + return recordFields; +} - if (isErrorCode(path) || path === "") { - return {}; - } +async function processMappingData( + mappingData: MappingData, + parameterDefinitions: ParameterMetadata, + nestedKey: string, + nestedKeyArray: string[] +): Promise> { + const parameters = mappingData.parameters; + const paths = parameters[0].split("."); - let recordFieldName: string = paths.length === 1 ? nestedKey : (nestedKey || paths[1]); - return { [recordFieldName]: path }; - } else { - let objectKeys = Object.keys(response); - for (let index = 0; index < objectKeys.length; index++) { - let key = objectKeys[index]; - let subRecord = response[key]; - - if (!subRecord.hasOwnProperty("operation") && !subRecord.hasOwnProperty("parameters") && !subRecord.hasOwnProperty("targetType")) { - nestedKeyArray.push(key); - let responseRecord = await generateBallerinaCode(subRecord, parameterDefinitions, key, nestedKeyArray); - let recordFieldDetails = await handleRecordArrays(key, nestedKey, responseRecord, parameterDefinitions, arrayRecords, arrayEnumUnion, nestedKeyArray); - nestedKeyArray.pop(); - recordFields = { ...recordFields, ...recordFieldDetails }; - } else { - let nestedResponseRecord = await generateBallerinaCode(subRecord, parameterDefinitions, key, nestedKeyArray); - recordFields = { ...recordFields, ...nestedResponseRecord }; - } - } + const path = await getMappingString( + mappingData, + parameterDefinitions, + nestedKey, + nestedKeyArray + ); - return { ...recordFields }; + if (typeof path !== "string" || path === "") { + return {}; } + + const recordFieldName = paths.length === 1 ? nestedKey : (nestedKey || paths[1]); + return { [recordFieldName]: path }; } // Get union types from the combination of union types @@ -469,14 +482,14 @@ function generateCombinations(arr: string[], size: number, start: number, curren // Function to check if a given type is a valid union type (order-independent) function isUnionType(type: string): boolean { const sortedType = type.split("|").sort().join("|"); // Sort input type for consistency - const validUnionTypes = getUnionTypes(primitiveTypes); // Get valid union types + const validUnionTypes = getUnionTypes(Object.values(PrimitiveType)); // Get valid union types return validUnionTypes.includes(sortedType); // Check against Set } -async function getMappingString(mapping: object, parameterDefinitions: ParameterMetadata | ErrorCode, nestedKey: string, recordTypes: string[], unionEnumIntersectionTypes: string[], arrayRecords: string[], arrayEnumUnion: string[], nestedKeyArray: string[]): Promise { - let operation: string = mapping["operation"]; - let targetType: string = mapping["targetType"]; - let parameters: string[] = mapping["parameters"]; +async function getMappingString(mapping: MappingData, parameterDefinitions: ParameterMetadata, nestedKey: string, nestedKeyArray: string[]): Promise { + let operation: string = mapping.operation; + let targetType: string = mapping.targetType; + let parameters: string[] = mapping.parameters; let path: string = ""; let modifiedPaths: string[] = []; @@ -487,8 +500,8 @@ async function getMappingString(mapping: object, parameterDefinitions: Parameter let outputType: string = ""; let baseOutputType: string = ""; let baseInputType: string = ""; - let modifiedInput: object; - let outputObject: object; + let modifiedInput: FieldMetadata; + let outputObject: FieldMetadata; let isInputNullableArray: boolean; let isOutputNullableArray: boolean; @@ -497,48 +510,47 @@ async function getMappingString(mapping: object, parameterDefinitions: Parameter // Retrieve inputType if (paths.length > 2) { - modifiedInput = await getNestedType(paths.slice(1), parameterDefinitions["inputMetadata"][recordObjectName]); + modifiedInput = await getNestedType(paths.slice(1), parameterDefinitions.inputMetadata[recordObjectName]); } else if (paths.length === 2) { - modifiedInput = parameterDefinitions["inputMetadata"][recordObjectName]["fields"][paths[1]]; + modifiedInput = parameterDefinitions.inputMetadata[recordObjectName]["fields"][paths[1]]; } else { - modifiedInput = parameterDefinitions["configurables"][recordObjectName] || - parameterDefinitions["constants"][recordObjectName] || - parameterDefinitions["variables"][recordObjectName] || parameterDefinitions["inputMetadata"][recordObjectName]["fields"][paths[0]]; + modifiedInput = parameterDefinitions.configurables[recordObjectName] || + parameterDefinitions.constants[recordObjectName] || + parameterDefinitions.variables[recordObjectName] || parameterDefinitions.inputMetadata[recordObjectName].fields[paths[0]]; } // Resolve output metadata if (nestedKeyArray.length > 0) { - outputObject = await resolveMetadata(parameterDefinitions, nestedKeyArray, nestedKey, "outputMetadata"); - if (!outputObject) { throw new Error(`Metadata not found for ${nestedKey}.`); } - } else if (parameterDefinitions["outputMetadata"].hasOwnProperty("fields") || !parameterDefinitions["outputMetadata"][nestedKey]) { + outputObject = await getMetadata(parameterDefinitions, nestedKeyArray, nestedKey, MetadataType.OUTPUT_METADATA); + } else if (parameterDefinitions.outputMetadata.hasOwnProperty("fields") || !parameterDefinitions.outputMetadata[nestedKey]) { throw new Error(`Invalid or missing metadata for nestedKey: ${nestedKey}.`); } else { - outputObject = parameterDefinitions["outputMetadata"][nestedKey]; + outputObject = parameterDefinitions.outputMetadata[nestedKey]; } baseTargetType = targetType.replace(/\|\(\)$/, ""); - inputTypeName = modifiedInput["typeName"]; + inputTypeName = modifiedInput.typeName; baseType = inputTypeName.replace(/\|\(\)$/, ""); - inputType = modifiedInput["type"]; + inputType = modifiedInput.type; baseInputType = inputType.replace(/\|\(\)$/, ""); - outputType = outputObject["type"]; + outputType = outputObject.type; baseOutputType = outputType.replace(/\|\(\)$/, ""); - if (operation === "DIRECT") { + if (operation === Operation.DIRECT) { if (parameters.length > 1) { return ""; } // Helper function to check if type contains [] const hasArrayNotation = (type: string) => type.includes("[]"); - if (recordTypes.includes(baseType)) { + if (isRecordType(baseType)) { // Both baseType and baseTargetType either contain "[]" or do not if (!(hasArrayNotation(baseType) === hasArrayNotation(baseTargetType)) && !(baseTargetType === "int")) { return ""; } - } else if (unionEnumIntersectionTypes.includes(baseOutputType)) { + } else if (isUnionEnumIntersectionType(baseOutputType)) { // Both baseInputType and baseOutputType either contain "[]" or do not if (!(hasArrayNotation(baseInputType) === hasArrayNotation(baseOutputType))) { return ""; @@ -550,12 +562,7 @@ async function getMappingString(mapping: object, parameterDefinitions: Parameter outputObject, baseType, baseTargetType, - nestedKey, - operation, - unionEnumIntersectionTypes, - recordTypes, - arrayRecords, - arrayEnumUnion + operation ); for (let index = 0; index < modifiedPaths.length; index++) { if (index > 0 && modifiedPaths[index] === modifiedPaths[index - 1]) { @@ -567,24 +574,24 @@ async function getMappingString(mapping: object, parameterDefinitions: Parameter path = `${path}${modifiedPaths[index]}`; } // Add split operation if inputType is "string" and targetType is "string[]" - if (baseType === "string" && baseTargetType === "string[]") { + if (baseType === PrimitiveType.STRING && baseTargetType === "string[]") { return `re \`,\`.split(${path})`; } // Add length operation if inputType is "record[]" and targetType is "int" - if (arrayRecords.includes(baseType) && baseTargetType === "int") { + if (isArrayRecord(baseType) && baseTargetType === PrimitiveType.INT) { return `(${path}).length()`; } // Type conversion logic - const stringConversions: { [key: string]: string } = { + const stringConversions: Record = { int: "check int:fromString", float: "check float:fromString", decimal: "check decimal:fromString", boolean: "check boolean:fromString" }; - const numericConversions: { [key: string]: { [key: string]: string } } = { + const numericConversions: { [key: string]: Record } = { float: { int: `check (${path}).ensureType()`, decimal: `check (${path}).ensureType()` @@ -599,30 +606,32 @@ async function getMappingString(mapping: object, parameterDefinitions: Parameter } }; - function convertUnionTypes(inputType: string, targetType: string, variablePath: string) { - const inputTypes = inputType.split("|").filter(type => primitiveTypes.includes(type)); + function convertUnionTypes(inputType: string, targetType: string, variablePath: string): string { + const inputTypes = inputType.split("|").filter(isPrimitiveType); + const isStringInput = inputTypes.includes(PrimitiveType.STRING); + const isNumericOrBooleanTarget = NUMERIC_AND_BOOLEAN_TYPES.includes(targetType as PrimitiveType); - if (targetType === "string") { + if (targetType === PrimitiveType.STRING) { return `(${variablePath}).toString()`; } - if (inputTypes.includes("string") && ["int", "float", "decimal", "boolean"].includes(targetType)) { + if (isStringInput && isNumericOrBooleanTarget) { return `(${variablePath}) is string ? check ${targetType}:fromString((${variablePath}).toString()) : check (${variablePath}).ensureType()`; } - if (["int", "float", "decimal", "boolean"].includes(targetType)) { + if (isNumericOrBooleanTarget) { return `check (${variablePath}).ensureType()`; } - return `${variablePath}`; + return variablePath; } - isOutputNullableArray = outputObject["nullableArray"]; - isInputNullableArray = modifiedInput["nullableArray"]; + isOutputNullableArray = outputObject.nullableArray; + isInputNullableArray = modifiedInput.nullableArray; const isStringInput = ["string", "string|()"].includes(inputTypeName); const isStringTarget = ["string", "string|()"].includes(targetType); - if (primitiveTypes.includes(baseTargetType) && primitiveTypes.includes(baseType)) { + if (isPrimitiveType(baseTargetType) && isPrimitiveType(baseType)) { if (inputTypeName === targetType || inputTypeName === baseTargetType) { path = `${path}`; } else if (isStringInput) { @@ -636,17 +645,17 @@ async function getMappingString(mapping: object, parameterDefinitions: Parameter path = `(${path}).toString()`; } else { const conversion = numericConversions[inputTypeName]?.[targetType]; - if (conversion && baseTargetType !== "boolean") { + if (conversion && baseTargetType !== PrimitiveType.BOOLEAN) { path = conversion; } else if (baseType === baseTargetType) { path = `${path}`; - } else if ((targetType.includes("|()") && inputTypeName !== baseTargetType) || inputTypeName.includes("|()") && baseTargetType !== "boolean") { + } else if ((targetType.includes("|()") && inputTypeName !== baseTargetType) || inputTypeName.includes("|()") && baseTargetType !== PrimitiveType.BOOLEAN) { path = `check (${path}).ensureType()`; } else { return ""; } } - } else if (unionEnumIntersectionTypes.includes(inputType)) { + } else if (isUnionEnumIntersectionType(inputType)) { if (isUnionType(baseType)) { path = convertUnionTypes(baseType, baseTargetType, path); } else { @@ -656,7 +665,7 @@ async function getMappingString(mapping: object, parameterDefinitions: Parameter } } } - } else if (operation === "LENGTH") { + } else if (operation === Operation.LENGTH) { if (parameters.length > 1) { return ""; } @@ -666,12 +675,7 @@ async function getMappingString(mapping: object, parameterDefinitions: Parameter outputObject, baseType, baseTargetType, - nestedKey, - operation, - unionEnumIntersectionTypes, - recordTypes, - arrayRecords, - arrayEnumUnion + operation ); for (let index = 0; index < modifiedPaths.length; index++) { if (path !== "") { @@ -680,7 +684,7 @@ async function getMappingString(mapping: object, parameterDefinitions: Parameter path = `${path}${modifiedPaths[index]}`; } path = `(${path}).length()`; - } else if (operation === "SPLIT") { + } else if (operation === Operation.SPLIT) { if (parameters.length > 2) { return ""; } @@ -690,12 +694,7 @@ async function getMappingString(mapping: object, parameterDefinitions: Parameter outputObject, baseType, baseTargetType, - nestedKey, - operation, - unionEnumIntersectionTypes, - recordTypes, - arrayRecords, - arrayEnumUnion + operation ); for (let index = 0; index < modifiedPaths.length; index++) { if (path !== "") { @@ -795,14 +794,14 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { context.isRecord = true; const fieldName = getBalRecFieldName(field.name); - context.recordFields[fieldName] = (temporaryRecord as RecordDefinitonObject).recordFields; + context.recordFields[fieldName] = temporaryRecord.recordFields; context.recordFieldsMetadata[fieldName] = { nullable: context.isNill, optional: field.optional, type: "record", typeInstance: fieldName, typeName: field.typeName, - fields: (temporaryRecord as RecordDefinitonObject).recordFieldsMetadata + fields: temporaryRecord.recordFieldsMetadata }; } @@ -1270,7 +1269,7 @@ class TypeInfoVisitorImpl implements TypeInfoVisitor { export function navigateTypeInfo( typeInfos: FormField[], isNill: boolean -): RecordDefinitonObject | ErrorCode { +): RecordDefinitonObject { const context: VisitorContext = { recordFields: {}, recordFieldsMetadata: {}, @@ -1293,10 +1292,9 @@ export function navigateTypeInfo( for (const field of typeInfos) { visitor.visitField(field, context); } - return { - "recordFields": context.recordFields, - "recordFieldsMetadata": context.recordFieldsMetadata + recordFields: context.recordFields, + recordFieldsMetadata: context.recordFieldsMetadata }; } @@ -1304,21 +1302,16 @@ export function getBalRecFieldName(fieldName: string) { return keywords.includes(fieldName) ? `'${fieldName}` : fieldName; } -export async function getDatamapperCode(parameterDefinitions: ErrorCode | ParameterMetadata): Promise { +export async function getDatamapperCode(parameterDefinitions: ParameterMetadata): Promise> { let nestedKeyArray: string[] = []; try { - const accessToken = await getAccessToken().catch((error) => { - console.error(error); - return NOT_LOGGED_IN; - }); - let response: DatamapperResponse = await sendDatamapperRequest(parameterDefinitions, accessToken); - + let response: DatamapperResponse = await sendDatamapperRequest(parameterDefinitions); let intermediateMapping = response.mappings; let finalCode = await generateBallerinaCode(intermediateMapping, parameterDefinitions, "", nestedKeyArray); return finalCode; } catch (error) { console.error(error); - return TIMEOUT; + throw error; } } @@ -1364,21 +1357,11 @@ export function notifyNoGeneratedMappings() { window.showInformationMessage(msg); } -async function sendDatamapperRequest(parameterDefinitions: ParameterMetadata | ErrorCode, accessToken: string | ErrorCode): Promise { +async function sendDatamapperRequest(parameterDefinitions: ParameterMetadata): Promise { const response: DatamapperResponse = await generateAutoMappings(parameterDefinitions as Payload); return response; } -async function sendMappingFileUploadRequest(file: Blob): Promise { - const formData = new FormData(); - formData.append("file", file); - const response = await fetchWithToken(CONTEXT_UPLOAD_URL_V1 + "/file_upload/generate_mapping_instruction", { - method: "POST", - body: formData - }); - return response; -} - export async function searchDocumentation(message: string): Promise { const resp = await getAskResponse(message,); const finalResponse = resp.content.replace(/[\s\S]*?<\/thinking>/g, ''); @@ -1405,35 +1388,11 @@ export async function filterDocumentation(resp: Response): Promise { } else { responseContent = finalResponse; } - return responseContent; } throw new Error(AIChatError.UNKNOWN_CONNECTION_ERROR); } -async function filterMappingResponse(resp: Response): Promise { - if (resp.status == 200 || resp.status == 201) { - const data = (await resp.json()) as any; - return data.file_content; - } - if (resp.status == 404) { - return ENDPOINT_REMOVED; - } - if (resp.status == 400) { - const data = (await resp.json()) as any; - console.log(data); - return PARSING_ERROR; - } if (resp.status == 429) { - return TOO_MANY_REQUESTS; - } - if (resp.status == 500) { - return SERVER_ERROR; - } else { - //TODO: Handle more error codes - return { code: 4, message: `An unknown error occured. ${resp.statusText}.` }; - } -} - async function attatchmentToFileData(file: Attachment): Promise { return { fileName: file.name, @@ -1441,7 +1400,7 @@ async function attatchmentToFileData(file: Attachment): Promise { }; } -export async function mappingFileParameterDefinitions(file: Attachment, parameterDefinitions: ErrorCode | ParameterMetadata): Promise { +export async function mappingFileParameterDefinitions(file: Attachment, parameterDefinitions: ParameterMetadata): Promise { if (!file) { return parameterDefinitions; } const fileData = await attatchmentToFileData(file); const params: DataMapperRequest = { @@ -1453,49 +1412,30 @@ export async function mappingFileParameterDefinitions(file: Attachment, paramete return { ...parameterDefinitions, - mapping_fields: mappingFile.mapping_fields, + mapping_fields: mappingFile.mapping_fields }; } -export async function getMappingFromFile(file: Blob): Promise { - try { - let response = await sendMappingFileUploadRequest(file); - if (isErrorCode(response)) { - return response as ErrorCode; - } - response = response as Response; - let mappingContent = JSON.parse((await filterMappingResponse(response)) as string); - if (isErrorCode(mappingContent)) { - return mappingContent as ErrorCode; - } - return mappingContent; - } catch (error) { - console.error(error); - return TIMEOUT; - } -} - -export async function mappingFileInlineDataMapperModel(file: Attachment, inlineDataMapperResponse: ErrorCode | InlineDataMapperModelResponse): Promise { +export async function mappingFileInlineDataMapperModel(file: Attachment, inlineDataMapperResponse: InlineDataMapperModelResponse): Promise { if (!file) { return inlineDataMapperResponse; } - - const convertedFile = convertBase64ToBlob(file); - if (!convertedFile) { throw new Error("Invalid file content"); } - - let mappingFile = await getMappingFromFile(convertedFile); - if (isErrorCode(mappingFile)) { return mappingFile as ErrorCode; } - - mappingFile = mappingFile as MappingFileRecord; + const fileData = await attatchmentToFileData(file); + const params: DataMapperRequest = { + file: fileData, + processType: "mapping_instruction" + }; + const resp: DataMapperResponse = await processDataMapperInput(params); + let mappingFile: MappingFileRecord = JSON.parse(resp.fileContent) as MappingFileRecord; return { - ...(inlineDataMapperResponse as InlineDataMapperModelResponse), + ...inlineDataMapperResponse, mappingsModel: { - ...(inlineDataMapperResponse as InlineDataMapperModelResponse).mappingsModel, - mapping_fields: mappingFile.mapping_fields, + ...inlineDataMapperResponse.mappingsModel, + mapping_fields: mappingFile.mapping_fields } }; } -export async function typesFileParameterDefinitions(file: Attachment): Promise { +export async function typesFileParameterDefinitions(file: Attachment): Promise { if (!file) { throw new Error("File is undefined"); } const fileData = await attatchmentToFileData(file); @@ -1507,153 +1447,72 @@ export async function typesFileParameterDefinitions(file: Attachment): Promise { - abortController = new AbortController(); - const id = setTimeout(() => abortController.abort(), timeout); - try { - const response = await fetch(url, { ...options, signal: abortController.signal }); - clearTimeout(id); - return response; - } catch (error: any) { - if (error.name === 'AbortError') { - return TIMEOUT; - } else { - console.error(error); - return SERVER_ERROR; - } - } -} - export function isErrorCode(error: any): boolean { return error.hasOwnProperty("code") && error.hasOwnProperty("message"); } async function accessMetadata( paths: string[], - parameterDefinitions: ParameterMetadata | ErrorCode, - outputObject: object, + parameterDefinitions: ParameterMetadata, + outputObject: FieldMetadata, baseType: string, baseTargetType: string, - nestedKey: string, - operation: string, - unionEnumIntersectionTypes: string[], - recordTypes: string[], - arrayRecords: string[], - arrayEnumUnion: string[] + operation: string ): Promise { - let newPath: string[] = [...paths]; - let isOutputNullable = false; - let isOutputOptional = false; + let newPath = [...paths]; let isUsingDefault = false; let isUsingArray = false; let defaultValue: string; - let isOutputRecordNullable = false; - let modifiedBaseType: string; - const outputMetadataType = outputObject["typeName"]; - baseTargetType = outputMetadataType.replace(/\|\(\)$/, ""); - isOutputNullable = outputObject["nullable"]; - isOutputOptional = outputObject["optional"]; - isOutputRecordNullable = outputObject["nullableArray"]; + baseTargetType = outputObject.typeName.replace(/\|\(\)$/, ""); - // Process paths for metadata for (let index = 1; index < paths.length; index++) { const pathIndex = paths[index]; - let inputObject = await resolveMetadata(parameterDefinitions, paths, pathIndex, "inputMetadata"); - if (!inputObject) { throw new Error(`Field ${pathIndex} not found in metadata.`); } - - const isInputNullable = inputObject["nullable"]; - const isInputOptional = inputObject["optional"]; - const isInputNullableArray = inputObject["nullableArray"]; - - if (inputObject.hasOwnProperty("members") || inputObject.hasOwnProperty("fields") || operation === "LENGTH") { - const inputMetadataType = inputObject["type"]; - const metadataTypeName = inputObject["typeName"]; - const isInputRecordNullableArray = inputObject["nullableArray"]; - const isInputRecordNullable = inputObject["nullable"]; - const isInputRecordOptional = inputObject["optional"]; - if (!["enum", "enum|()"].includes(inputMetadataType)) { - isUsingDefault = false; - } + let inputObject = await getMetadata(parameterDefinitions, paths, pathIndex, MetadataType.INPUT_METADATA); - if (arrayRecords.includes(metadataTypeName) || arrayEnumUnion.includes(inputMetadataType)) { - if (isInputRecordNullableArray) { - isUsingArray = true; - } else { - isUsingArray = false; - } + if (inputObject.hasOwnProperty("members") || inputObject.hasOwnProperty("fields") || operation === Operation.LENGTH) { + if (!["enum", "enum|()"].includes(inputObject.type)) { + isUsingDefault = false; } - if (isUsingArray && recordTypes.includes(metadataTypeName)) { + if (isArrayRecord(inputObject.typeName) || isArrayEnumUnion(inputObject.type)) { + isUsingArray = inputObject.nullableArray; + } + if (isUsingArray && isRecordType(inputObject.typeName)) { newPath[index] = `${paths[index]}?`; } - if (isInputRecordNullable || isInputRecordOptional) { + if (inputObject.nullable || inputObject.optional) { // Handle record types - if (recordTypes.includes(metadataTypeName)) { - if (!metadataTypeName.includes("[]")) { + if (isRecordType(inputObject.typeName)) { + if (!inputObject.typeName.includes("[]")) { if (index !== (paths.length - 1)) { newPath[index] = `${paths[index]}?`; isUsingDefault = true; } } - if (metadataTypeName.includes("[]") && operation === "LENGTH") { - let lastInputObject = await resolveMetadata(parameterDefinitions, paths, paths[paths.length - 1], "inputMetadata"); - let inputDataType = lastInputObject["typeName"].replace(/\|\(\)$/, ""); + if (inputObject.typeName.includes("[]") && operation === Operation.LENGTH) { + let lastInputObject = await getMetadata(parameterDefinitions, paths, paths[paths.length - 1], MetadataType.INPUT_METADATA); + let inputDataType = lastInputObject.typeName.replace(/\|\(\)$/, ""); defaultValue = await getDefaultValue(inputDataType); newPath[paths.length - 1] = `${paths[paths.length - 1]}?:${defaultValue}`; } - if (isInputRecordNullable && isInputRecordOptional) { + if (inputObject.nullable && inputObject.optional) { newPath[index - 1] = `${paths[index - 1]}?`; } // Handle enum, union, and intersection types - } else if (unionEnumIntersectionTypes.includes(inputMetadataType)) { - if (isInputRecordNullable && isInputRecordOptional) { + } else if (isUnionEnumIntersectionType(inputObject.type)) { + if (inputObject.nullable && inputObject.optional) { newPath[index - 1] = `${paths[index - 1]}?`; } - if (inputMetadataType.includes("[]") && operation === "LENGTH") { - let lastInputObject = await resolveMetadata(parameterDefinitions, paths, paths[paths.length - 1], "inputMetadata"); - let inputDataType = lastInputObject["type"].replace(/\|\(\)$/, ""); + if (inputObject.type.includes("[]") && operation === Operation.LENGTH) { + let lastInputObject = await getMetadata(parameterDefinitions, paths, paths[paths.length - 1], MetadataType.INPUT_METADATA); + let inputDataType = lastInputObject.type.replace(/\|\(\)$/, ""); defaultValue = await getDefaultValue(inputDataType); newPath[paths.length - 1] = `${paths[paths.length - 1]}?:${defaultValue}`; - } else if (!isOutputNullable && !isOutputOptional) { - if (unionEnumIntersectionTypes.includes(inputObject["type"]) && inputObject["members"]) { - if (!isInputRecordNullableArray || isOutputRecordNullable) { - let typeName = inputMetadataType.includes("[]") - ? inputMetadataType.replace(/\|\(\)$/, "") + } else if (!outputObject.nullable && !outputObject.optional) { + if (isUnionEnumIntersectionType(inputObject.type) && inputObject.members) { + if (!inputObject.nullableArray || outputObject.nullableArray) { + let typeName = inputObject.type.includes("[]") + ? inputObject.type.replace(/\|\(\)$/, "") : (inputObject as any).members[Object.keys((inputObject as any).members)[0]].typeName; let defaultValue = await getDefaultValue(typeName); @@ -1664,10 +1523,10 @@ async function accessMetadata( } } } else { - if (isUsingDefault && unionEnumIntersectionTypes.includes(inputObject["type"]) && inputObject["members"]) { - if (!isOutputNullable && !isOutputOptional) { - let typeName = inputMetadataType.includes("[]") - ? inputMetadataType.replace("|()", "") + if (isUsingDefault && isUnionEnumIntersectionType(inputObject.type) && inputObject.members) { + if (!outputObject.nullable && !outputObject.optional) { + let typeName = inputObject.type.includes("[]") + ? inputObject.type.replace("|()", "") : (inputObject as any).members[Object.keys((inputObject as any).members)[0]].typeName; let defaultValue = await getDefaultValue(typeName); @@ -1676,48 +1535,37 @@ async function accessMetadata( } } } else { - if (isInputNullable && isInputOptional) { + if (inputObject.nullable && inputObject.optional) { newPath[index - 1] = `${paths[index - 1]}?`; } - if (!primitiveTypes.includes(baseType)) { - if (baseType.includes("[]")) { - if (!isInputNullableArray || isOutputRecordNullable) { - defaultValue = `[]`; - } - } else { - let cleanedBaseType = baseType.replace(/[\[\]()]*/g, ""); - if (cleanedBaseType.includes("|")) { - modifiedBaseType = cleanedBaseType.split("|")[0].trim(); - } else { - modifiedBaseType = cleanedBaseType; - } - defaultValue = await getDefaultValue(modifiedBaseType); - } + if (!isPrimitiveType(baseType) && baseType.includes("[]")) { + defaultValue = (!inputObject.nullableArray || outputObject.nullableArray) ? `[]` : undefined; } else { - defaultValue = await getDefaultValue(baseType); + const typeToUse = !isPrimitiveType(baseType) + ? baseType.replace(/[\[\]()]*/g, "").split("|")[0].trim() + : baseType; + defaultValue = await getDefaultValue(typeToUse); } if (isUsingArray) { newPath[index] = `${pathIndex}?:${defaultValue}`; } - if (isUsingDefault && !isOutputNullable && !isOutputOptional) { + if (isUsingDefault && !outputObject.nullable && !outputObject.optional) { newPath[index] = `${pathIndex}?:${defaultValue}`; - } else if ((isInputNullable || isInputOptional)) { - if (!isOutputNullable && !isOutputOptional) { - if (!isInputNullableArray && isOutputRecordNullable) { - newPath[index] = `${pathIndex}?:${defaultValue}`; - } else { - newPath[index] = baseType === "string" || baseType === baseTargetType - ? `${pathIndex}?:${defaultValue}` - : `${pathIndex}`; - } - } else { - newPath[index] = baseType !== baseTargetType && baseType === "string" - ? `${pathIndex}?:${defaultValue}` - : `${pathIndex}`; - } + continue; } + if (!(inputObject.nullable || inputObject.optional)) { + continue; + } + + // Handle nullable/optional input + const shouldUseDefault = ( + (!outputObject.nullable && !outputObject.optional && !inputObject.nullableArray && outputObject.nullableArray) || + (!outputObject.nullable && !outputObject.optional && (baseType === PrimitiveType.STRING || baseType === baseTargetType)) || + (baseType !== baseTargetType && baseType === PrimitiveType.STRING) + ); + newPath[index] = shouldUseDefault ? `${pathIndex}?:${defaultValue}` : `${pathIndex}`; return newPath; } } @@ -1756,62 +1604,69 @@ async function getDefaultValue(dataType: string): Promise { } } -async function getNestedType(paths: string[], metadata: object): Promise { +async function getNestedType(paths: string[], metadata: ParameterField | FieldMetadata): Promise { let currentMetadata = metadata; - for (let i = 0; i < paths.length; i++) { - let cleanPath = paths[i].replace(/\?.*$/, ""); - if (currentMetadata["fields"] && currentMetadata["fields"][cleanPath]) { - currentMetadata = currentMetadata["fields"][cleanPath]; - } else if (currentMetadata["members"] && currentMetadata["members"][cleanPath]) { - currentMetadata = currentMetadata["members"][cleanPath]; - } else { + for (const path of paths) { + const cleanPath = path.replace(/\?.*$/, ""); + const nextMetadata = currentMetadata.fields?.[cleanPath] ?? currentMetadata.members?.[cleanPath]; + if (!nextMetadata) { throw new Error(`Field ${cleanPath} not found in metadata.`); } + currentMetadata = nextMetadata; } - return currentMetadata; + return currentMetadata as FieldMetadata; } -async function resolveMetadata(parameterDefinitions: ParameterMetadata | ErrorCode, nestedKeyArray: string[], key: string, metadataKey: "inputMetadata" | "outputMetadata"): Promise { - let metadata = parameterDefinitions[metadataKey]; - for (let nk of nestedKeyArray) { - if (metadata[nk] && (metadata[nk]["fields"] || metadata[nk]["members"])) { - if (nk === key) { - return metadata[nk]; +async function getMetadata( + parameterDefinitions: ParameterMetadata, + nestedKeyArray: string[], + key: string, + metadataType: MetadataType.INPUT_METADATA | MetadataType.OUTPUT_METADATA +): Promise { + try { + let currentMetadata = parameterDefinitions[metadataType]; + for (const nestedKey of nestedKeyArray) { + const nested = currentMetadata[nestedKey]; + const hasNestedStructure = nested?.fields || nested?.members; + + if (hasNestedStructure) { + if (nestedKey === key) { + return nested as FieldMetadata; + } + currentMetadata = nested.fields || nested.members; + } else { + return currentMetadata[key] as FieldMetadata; } - metadata = metadata[nk]["fields"] || metadata[nk]["members"]; - } else { - return metadata[key]; } + return currentMetadata[key] as FieldMetadata; + } catch { + throw new Error(`Metadata not found for key: "${key}" in ${metadataType}.`); } - return metadata[key]; } -async function handleRecordArrays(key: string, nestedKey: string, responseRecord: object, parameterDefinitions: ParameterMetadata | ErrorCode, arrayRecords: string[], arrayEnumUnion: string[], nestedKeyArray: string[]) { - let recordFields: { [key: string]: any } = {}; +async function handleRecordArrays(key: string, nestedKey: string, responseRecord: Record, parameterDefinitions: ParameterMetadata,nestedKeyArray: string[]) { + let recordFields: Record = {}; let subObjectKeys = Object.keys(responseRecord); let formattedRecordsArray: string[] = []; let itemKey: string = ""; let combinedKey: string = ""; - let modifiedOutput: object; + let modifiedOutput: FieldMetadata; let outputMetadataType: string = ""; let outputMetadataTypeName: string = ""; let isOutputDeeplyNested: boolean = false; for (let subObjectKey of subObjectKeys) { if (!nestedKey) { - modifiedOutput = parameterDefinitions["outputMetadata"][key]; + modifiedOutput = parameterDefinitions.outputMetadata[key]; } else { - modifiedOutput = await resolveMetadata(parameterDefinitions, nestedKeyArray, key, "outputMetadata"); - if (!modifiedOutput) { - throw new Error(`Metadata not found for ${nestedKey}.`); - } + modifiedOutput = await getMetadata(parameterDefinitions, nestedKeyArray, key, MetadataType.OUTPUT_METADATA); } - outputMetadataTypeName = modifiedOutput["typeName"]; - outputMetadataType = modifiedOutput["type"]; - isOutputDeeplyNested = (arrayRecords.includes(outputMetadataTypeName) || arrayEnumUnion.includes(outputMetadataType)); + outputMetadataTypeName = modifiedOutput.typeName; + outputMetadataType = modifiedOutput.type; + isOutputDeeplyNested = (isArrayRecord(outputMetadataTypeName) || isArrayEnumUnion(outputMetadataType)); - let { itemKey: currentItemKey, combinedKey: currentCombinedKey, inputArrayNullable: currentArrayNullable, isSet: isCurrentSet, isInputDeeplyNested: isCurrentInputDeeplyNested } = await extractKeys(responseRecord[subObjectKey], parameterDefinitions, arrayRecords, arrayEnumUnion); + let { itemKey: currentItemKey, combinedKey: currentCombinedKey, inputArrayNullable, isSet, isInputDeeplyNested } = await extractKeys(responseRecord[subObjectKey], parameterDefinitions); if (currentItemKey.includes('?')) { currentItemKey = currentItemKey.replace('?', ''); } @@ -1819,9 +1674,9 @@ async function handleRecordArrays(key: string, nestedKey: string, responseRecord if (isOutputDeeplyNested) { const subArrayRecord = responseRecord[subObjectKey]; const isCombinedKeyModified = currentCombinedKey.endsWith('?'); - const replacementKey = currentArrayNullable || isCombinedKeyModified + const replacementKey = inputArrayNullable || isCombinedKeyModified ? `${currentItemKey}Item?.` - : `${isCurrentInputDeeplyNested ? currentItemKey + 'Item' : currentItemKey}.`; + : `${isInputDeeplyNested ? currentItemKey + 'Item' : currentItemKey}.`; const regex = new RegExp( currentCombinedKey.replace(/\?/g, '\\?').replace(/\./g, '\\.') + '\\.', 'g' ); @@ -1830,7 +1685,7 @@ async function handleRecordArrays(key: string, nestedKey: string, responseRecord `${subObjectKey}: ${subArrayRecord.replace(regex, replacementKey)}` ); - if (isCurrentSet || (itemKey === "" && combinedKey === "")) { + if (isSet || (itemKey === "" && combinedKey === "")) { itemKey = currentItemKey; combinedKey = currentCombinedKey; } @@ -1838,14 +1693,14 @@ async function handleRecordArrays(key: string, nestedKey: string, responseRecord formattedRecordsArray.push(`${subObjectKey}: ${responseRecord[subObjectKey]}`); } } else { - recordFields = { ...recordFields, [key]: responseRecord }; + recordFields = { ...recordFields, [key]: JSON.stringify(responseRecord) }; } } if (formattedRecordsArray.length > 0 && itemKey && combinedKey) { const formattedRecords = formattedRecordsArray.join(",\n"); const keyToReplace = combinedKey.endsWith('?') ? combinedKey.replace(/\?$/, '') : combinedKey; - const processedKeys = await processCombinedKey(combinedKey, parameterDefinitions, arrayRecords, arrayEnumUnion); + const processedKeys = await processCombinedKey(combinedKey, parameterDefinitions); const combinedKeyExpression = (processedKeys.isinputRecordArrayNullable || processedKeys.isinputRecordArrayOptional || processedKeys.isinputArrayNullable || processedKeys.isinputArrayOptional || processedKeys.isinputNullableArray) ? `${keyToReplace} ?: []` : keyToReplace; @@ -1853,47 +1708,13 @@ async function handleRecordArrays(key: string, nestedKey: string, responseRecord } else { recordFields[key] = `{\n ${formattedRecordsArray.join(",\n")} \n}`; } - return { ...recordFields }; } -export async function filterResponse(resp: Response): Promise { - if (resp.status == 200 || resp.status == 201) { - const data = (await resp.json()) as any; - console.log(JSON.stringify(data.mappings)); - return data.mappings; - } - if (resp.status == 404) { - return ENDPOINT_REMOVED; - } - if (resp.status == 400) { - const data = (await resp.json()) as any; - console.log(data); - return PARSING_ERROR; - } - if (resp.status == 429) { - return TOO_MANY_REQUESTS; - } - if (resp.status == 500) { - return SERVER_ERROR; - } else { - //TODO: Handle more error codes - return TIMEOUT; - } -} - async function extractKeys( key: string, - parameterDefinitions: ParameterMetadata | ErrorCode, - arrayRecords: string[], - arrayEnumUnion: string[] -): Promise<{ - itemKey: string; - combinedKey: string; - inputArrayNullable: boolean; - isSet: boolean; - isInputDeeplyNested: boolean -}> { + parameterDefinitions: ParameterMetadata +): Promise { let innerKey: string; let itemKey: string = ""; let combinedKey: string = ""; @@ -1936,7 +1757,7 @@ async function extractKeys( .replace(/\.toString\(\)$/, ''); } // Call the helper function to process parent keys - const processedKeys = await processParentKey(innerKey, parameterDefinitions, arrayRecords, arrayEnumUnion); + const processedKeys = await processParentKey(innerKey, parameterDefinitions); itemKey = processedKeys.itemKey; combinedKey = processedKeys.combinedKey; inputArrayNullable = processedKeys.inputArrayNullable; @@ -1945,23 +1766,20 @@ async function extractKeys( return { itemKey, combinedKey, inputArrayNullable, isSet, isInputDeeplyNested }; } +function refineKey(key: string): string { + return key + .replace(/\?\./g, ".") // Replace `?.` with `.` + .replace(/\?$/g, "") // Remove a trailing `?` + .replace(/\s*\?:.*$/g, "") // Remove `?: ` + .replace(/[\(\)]/g, ""); // Remove parentheses +} + async function processParentKey( innerKey: string, - parameterDefinitions: ParameterMetadata | ErrorCode, - arrayRecords: string[], - arrayEnumUnion: string[] -): Promise<{ - itemKey: string; - combinedKey: string; - inputArrayNullable: boolean; - isSet: boolean; - isInputDeeplyNested: boolean; -}> { - let inputMetadataType: string = ""; - let inputMetadataTypeName: string = ""; + parameterDefinitions: ParameterMetadata +): Promise { let itemKey: string = ""; let combinedKey: string = ""; - let refinedInnerKey: string; let isSet: boolean = false; let inputArrayNullable: boolean = false; let isInputDeeplyNested: boolean = false; @@ -1971,15 +1789,9 @@ async function processParentKey( let fieldName = keys.pop()!; let parentKey = keys.slice(0, keys.length); - refinedInnerKey = innerKey - .replace(/\?\./g, ".") // Replace `?.` with `.` - .replace(/\?$/g, "") // Remove a trailing `?` - .replace(/\s*\?:.*$/g, "") // Remove `?: ` - .replace(/[\(\)]/g, ""); // Remove parentheses - - let refinedKeys = refinedInnerKey.split("."); - let refinedFieldName = refinedKeys.pop()!; - let refinedParentKey = refinedKeys.slice(0, refinedKeys.length); + const refinedInnerKey = refineKey(innerKey); + const refinedKeys = refinedInnerKey.split("."); + const refinedParentKey = refinedKeys.slice(0, keys.length); // Handle the base case where there's only one key if (refinedParentKey.length === 1) { @@ -1989,16 +1801,10 @@ async function processParentKey( } for (let index = refinedParentKey.length - 1; index > 0; index--) { - const modifiedInputs = await resolveMetadata(parameterDefinitions, refinedParentKey, refinedParentKey[index], "inputMetadata"); - if (!modifiedInputs) { - throw new Error(`Metadata not found for ${refinedParentKey[index]}.`); - } - inputMetadataTypeName = modifiedInputs["typeName"]; - inputMetadataType = modifiedInputs["type"]; - inputArrayNullable = modifiedInputs["nullableArray"]; - - const isArrayType = arrayRecords.includes(inputMetadataTypeName) || arrayEnumUnion.includes(inputMetadataType); + const modifiedInputs = await getMetadata(parameterDefinitions, refinedParentKey, refinedParentKey[index], MetadataType.INPUT_METADATA); + inputArrayNullable = modifiedInputs.nullableArray; + const isArrayType = isArrayRecord(modifiedInputs.typeName) || isArrayEnumUnion(modifiedInputs.type); if (isArrayType) { if (!isSet) { itemKey = parentKey[index]; @@ -2013,74 +1819,40 @@ async function processParentKey( async function processCombinedKey( combinedKey: string, - parameterDefinitions: ParameterMetadata | ErrorCode, - arrayRecords: string[], - arrayEnumUnion: string[] -): Promise<{ - isinputRecordArrayNullable: boolean; - isinputRecordArrayOptional: boolean; - isinputArrayNullable: boolean; - isinputArrayOptional: boolean; - isinputNullableArray: boolean; -}> { + parameterDefinitions: ParameterMetadata +): Promise { let isinputRecordArrayNullable: boolean = false; let isinputRecordArrayOptional: boolean = false; let isinputArrayNullable: boolean = false; let isinputArrayOptional: boolean = false; - let currentNullable: boolean = false; - let currentOptional: boolean = false; - let inputMetadataTypeName: string = ""; - let inputMetadataType: string = ""; - let refinedCombinedKey: string = ""; let isSet: boolean = false; let isinputNullableArray: boolean = false; - // Refine and split the inner key - refinedCombinedKey = combinedKey - .replace(/\?\./g, ".") // Replace `?.` with `.` - .replace(/\?$/g, "") // Remove a trailing `?` - .replace(/\s*\?:.*$/g, "") // Remove `?: ` - .replace(/[\(\)]/g, ""); // Remove parentheses - + let refinedCombinedKey = refineKey(combinedKey); let refinedCombinedKeys = refinedCombinedKey.split("."); + let lastIndex = refinedCombinedKeys.length - 1; - // Iterate through parent keys in reverse - let index = refinedCombinedKeys.length - 1; - const modifiedInputs = await resolveMetadata(parameterDefinitions, refinedCombinedKeys, refinedCombinedKeys[index], "inputMetadata"); - if (!modifiedInputs) { - throw new Error(`Metadata not found for ${refinedCombinedKeys[index]}.`); - } - - currentNullable = modifiedInputs["nullable"]; - currentOptional = modifiedInputs["optional"]; - inputMetadataTypeName = modifiedInputs["typeName"]; - inputMetadataType = modifiedInputs["type"]; + const modifiedInputs = await getMetadata(parameterDefinitions, refinedCombinedKeys, refinedCombinedKeys[lastIndex], MetadataType.INPUT_METADATA); - if (!isSet && (arrayRecords.includes(inputMetadataTypeName) || arrayEnumUnion.includes(inputMetadataType))) { + if (!isSet && (isArrayRecord(modifiedInputs.typeName) || isArrayEnumUnion(modifiedInputs.type))) { isSet = true; } if (isSet) { // Update record array flags - if (currentNullable) { isinputRecordArrayNullable = true; } - if (currentOptional) { isinputRecordArrayOptional = true; } + if (modifiedInputs.nullable) { isinputRecordArrayNullable = true; } + if (modifiedInputs.optional) { isinputRecordArrayOptional = true; } // Check preceding elements for non-`record[]` types - for (let nextIndex = index - 1; nextIndex >= 0; nextIndex--) { + for (let nextIndex = lastIndex - 1; nextIndex >= 0; nextIndex--) { isinputNullableArray = false; - const nextModifiedInputs = await resolveMetadata(parameterDefinitions, refinedCombinedKeys, refinedCombinedKeys[nextIndex], "inputMetadata"); - const nextMetadataTypeName = nextModifiedInputs["typeName"]; - const nextMetadataType = nextModifiedInputs["type"]; - const nextNullable = nextModifiedInputs["nullable"]; - const nextOptional = nextModifiedInputs["optional"]; - const nextNullableArray = nextModifiedInputs["nullableArray"]; - - if (!(arrayRecords.includes(nextMetadataTypeName) || arrayEnumUnion.includes(nextMetadataType))) { - if (nextNullable) { isinputArrayNullable = true; } - if (nextOptional) { isinputArrayOptional = true; } + const nextModifiedInputs = await getMetadata(parameterDefinitions, refinedCombinedKeys, refinedCombinedKeys[nextIndex], MetadataType.INPUT_METADATA); + if (!(isArrayRecord(nextModifiedInputs.typeName) || isArrayEnumUnion(nextModifiedInputs.type))) { + if (nextModifiedInputs.nullable) { isinputArrayNullable = true; } + if (nextModifiedInputs.optional) { isinputArrayOptional = true; } } else { - if (arrayRecords.includes(nextMetadataTypeName) || arrayEnumUnion.includes(nextMetadataType)) { - if (nextNullableArray && (nextIndex === (index - 1))) { isinputNullableArray = true; } + if (isArrayRecord(nextModifiedInputs.typeName) || isArrayEnumUnion(nextModifiedInputs.type)) { + if (nextModifiedInputs?.nullableArray && (nextIndex === (lastIndex - 1))) { isinputNullableArray = true; } } return { isinputRecordArrayNullable, isinputRecordArrayOptional, isinputArrayNullable, isinputArrayOptional, isinputNullableArray }; } @@ -2089,7 +1861,7 @@ async function processCombinedKey( return { isinputRecordArrayNullable, isinputRecordArrayOptional, isinputArrayNullable, isinputArrayOptional, isinputNullableArray }; } -export async function requirementsSpecification(filepath: string): Promise { +export async function requirementsSpecification(filepath: string): Promise { if (!filepath) { throw new Error("File is undefined"); } @@ -2111,33 +1883,6 @@ function getBase64FromFile(filePath) { return fileBuffer.toString('base64'); } - -export async function fetchWithToken(url: string, options: RequestInit) { - const accessToken = await getAccessToken(); - options.headers = { - ...options.headers, - 'Authorization': `Bearer ${accessToken}`, - 'User-Agent': 'Ballerina-VSCode-Plugin', - }; - let response = await fetch(url, options); - console.log("Response status: ", response.status); - if (response.status === 401) { - console.log("Token expired. Refreshing token..."); - const newToken = await getRefreshedAccessToken(); - if (newToken) { - options.headers = { - ...options.headers, - 'Authorization': `Bearer ${newToken}`, - }; - response = await fetch(url, options); - } else { - AIStateMachine.service().send(AIMachineEventType.LOGOUT); - return; - } - } - return response; -} - export function cleanDiagnosticMessages(entries: DiagnosticEntry[]): DiagnosticEntry[] { return entries.map(entry => ({ code: entry.code || "", diff --git a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/errorCodes.ts b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/errorCodes.ts index 9f77ec15fa9..6f92cf085eb 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/errorCodes.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/errorCodes.ts @@ -55,12 +55,12 @@ export const ENDPOINT_REMOVED: ErrorCode = { export const INVALID_PARAMETER_TYPE: ErrorCode = { code: 8, - message: "AI data mapper only supports records as inputs and outputs." + message: "AI data mapper supports records as inputs and outputs." }; export const INVALID_PARAMETER_TYPE_MULTIPLE_ARRAY: ErrorCode = { code: 9, - message: "AI data mapper only supports mappings between single input and output arrays." + message: "AI data mapper supports mappings between single input and output arrays." }; export const SERVER_ERROR: ErrorCode = { diff --git a/workspaces/ballerina/ballerina-extension/test/ai/datamapper/datamapper.test.ts b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/datamapper.test.ts index da1b0f0878b..1a192bfd8f3 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/datamapper/datamapper.test.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/datamapper.test.ts @@ -28,7 +28,7 @@ function getTestFolders(dirPath: string): string[] { .filter((file) => fs.lstatSync(path.join(dirPath, file)).isDirectory()); } -suite.skip("AI Datamapper Tests Suite", () => { +suite.only("AI Datamapper Tests Suite", () => { setup(done => { done(); }); diff --git a/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_18/expected.json b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_18/expected.json new file mode 100644 index 00000000000..dcd2e211ae6 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_18/expected.json @@ -0,0 +1 @@ +{"student":"from var personItem in AItem.person\n select {\n id: personItem.id,\nfirstName: personItem.firstName,\nlastName: personItem.lastName,\nage: (personItem.age).toString()\n}"} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_18/mapping.json b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_18/mapping.json new file mode 100644 index 00000000000..17ea78cb443 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_18/mapping.json @@ -0,0 +1,32 @@ +{ + "student":{ + "id":{ + "operation":"DIRECT", + "targetType":"int", + "parameters":[ + "AItem.person.id" + ] + }, + "firstName":{ + "operation":"DIRECT", + "targetType":"string", + "parameters":[ + "AItem.person.firstName" + ] + }, + "lastName":{ + "operation":"DIRECT", + "targetType":"string", + "parameters":[ + "AItem.person.lastName" + ] + }, + "age":{ + "operation":"DIRECT", + "targetType":"string", + "parameters":[ + "AItem.person.age" + ] + } + } +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_18/param_def.json b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_18/param_def.json new file mode 100644 index 00000000000..a6b07a4f482 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_18/param_def.json @@ -0,0 +1,199 @@ +{ + "inputs":{ + "AItem":{ + "person":{ + "id":{ + "type":"int", + "comment":"" + }, + "firstName":{ + "type":"string", + "comment":"" + }, + "lastName":{ + "type":"string", + "comment":"" + }, + "age":{ + "type":"int", + "comment":"" + }, + "country":{ + "type":"string", + "comment":"" + }, + "college":{ + "courses":{ + "id":{ + "type":"string", + "comment":"" + }, + "name":{ + "type":"string", + "comment":"" + }, + "credits":{ + "type":"decimal", + "comment":"" + } + } + } + } + } + }, + "output":{ + "student":{ + "id":{ + "type":"int", + "comment":"" + }, + "firstName":{ + "type":"string", + "comment":"" + }, + "lastName":{ + "type":"string", + "comment":"" + }, + "age":{ + "type":"string", + "comment":"" + } + } + }, + "inputMetadata":{ + "AItem":{ + "isArrayType":true, + "parameterName":"AItem", + "parameterType":"A[] ", + "type":"record[]", + "fields":{ + "person":{ + "optional":false, + "typeName":"record[]", + "type":"record[]", + "typeInstance":"person", + "fields":{ + "id":{ + "typeName":"int", + "type":"int", + "typeInstance":"id", + "nullable":false, + "optional":false + }, + "firstName":{ + "typeName":"string", + "type":"string", + "typeInstance":"firstName", + "nullable":false, + "optional":false + }, + "lastName":{ + "typeName":"string", + "type":"string", + "typeInstance":"lastName", + "nullable":false, + "optional":false + }, + "age":{ + "typeName":"int", + "type":"int", + "typeInstance":"age", + "nullable":false, + "optional":false + }, + "country":{ + "typeName":"string", + "type":"string", + "typeInstance":"country", + "nullable":false, + "optional":false + }, + "college":{ + "nullable":false, + "optional":false, + "type":"record", + "typeInstance":"college", + "typeName":"record", + "fields":{ + "courses":{ + "optional":false, + "typeName":"record[]", + "type":"record[]", + "typeInstance":"courses", + "fields":{ + "id":{ + "typeName":"string", + "type":"string", + "typeInstance":"id", + "nullable":false, + "optional":false + }, + "name":{ + "typeName":"string", + "type":"string", + "typeInstance":"name", + "nullable":false, + "optional":false + }, + "credits":{ + "typeName":"decimal", + "type":"decimal", + "typeInstance":"credits", + "nullable":false, + "optional":false + } + }, + "nullableArray":false, + "nullable":false + } + } + } + }, + "nullableArray":false, + "nullable":false + } + } + } + }, + "outputMetadata":{ + "student":{ + "optional":false, + "typeName":"record[]", + "type":"record[]", + "typeInstance":"student", + "fields":{ + "id":{ + "typeName":"int", + "type":"int", + "typeInstance":"id", + "nullable":false, + "optional":false + }, + "firstName":{ + "typeName":"string", + "type":"string", + "typeInstance":"firstName", + "nullable":false, + "optional":false + }, + "lastName":{ + "typeName":"string", + "type":"string", + "typeInstance":"lastName", + "nullable":false, + "optional":false + }, + "age":{ + "typeName":"string", + "type":"string", + "typeInstance":"age", + "nullable":false, + "optional":false + } + }, + "nullableArray":false, + "nullable":false + } + } +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_20/expected.json b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_20/expected.json new file mode 100644 index 00000000000..d9be65bccfd --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_20/expected.json @@ -0,0 +1 @@ +{"student": "from var personItem in AItem.person\n select {\n id: personItem.id,\nfirstName: personItem.firstName,\nlastName: personItem.lastName,\nage: (personItem.age).toString(),\ncourses: from var coursesItem in personItem.college.courses\n select {\n id: check int:fromString(coursesItem.id),\ncredits: check (coursesItem.credits).ensureType()\n}\n}"} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_20/mapping.json b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_20/mapping.json new file mode 100644 index 00000000000..f355045c198 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_20/mapping.json @@ -0,0 +1,48 @@ +{ + "student":{ + "id":{ + "operation":"DIRECT", + "targetType":"int", + "parameters":[ + "AItem.person.id" + ] + }, + "firstName":{ + "operation":"DIRECT", + "targetType":"string", + "parameters":[ + "AItem.person.firstName" + ] + }, + "lastName":{ + "operation":"DIRECT", + "targetType":"string", + "parameters":[ + "AItem.person.lastName" + ] + }, + "age":{ + "operation":"DIRECT", + "targetType":"string", + "parameters":[ + "AItem.person.age" + ] + }, + "courses":{ + "id":{ + "operation":"DIRECT", + "targetType":"int", + "parameters":[ + "AItem.person.college.courses.id" + ] + }, + "credits":{ + "operation":"DIRECT", + "targetType":"float", + "parameters":[ + "AItem.person.college.courses.credits" + ] + } + } + } +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_20/param_def.json b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_20/param_def.json new file mode 100644 index 00000000000..aeccce20be3 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_20/param_def.json @@ -0,0 +1,233 @@ +{ + "inputs":{ + "AItem":{ + "person":{ + "id":{ + "type":"int", + "comment":"" + }, + "firstName":{ + "type":"string", + "comment":"" + }, + "lastName":{ + "type":"string", + "comment":"" + }, + "age":{ + "type":"int", + "comment":"" + }, + "country":{ + "type":"string", + "comment":"" + }, + "college":{ + "courses":{ + "id":{ + "type":"string", + "comment":"" + }, + "name":{ + "type":"string", + "comment":"" + }, + "credits":{ + "type":"decimal", + "comment":"" + } + } + } + } + } + }, + "output":{ + "student":{ + "id":{ + "type":"int", + "comment":"" + }, + "firstName":{ + "type":"string", + "comment":"" + }, + "lastName":{ + "type":"string", + "comment":"" + }, + "age":{ + "type":"string", + "comment":"" + }, + "courses":{ + "id":{ + "type":"int", + "comment":"" + }, + "credits":{ + "type":"float", + "comment":"" + } + } + } + }, + "inputMetadata":{ + "AItem":{ + "isArrayType":true, + "parameterName":"AItem", + "parameterType":"A[] ", + "type":"record[]", + "fields":{ + "person":{ + "optional":false, + "typeName":"record[]", + "type":"record[]", + "typeInstance":"person", + "fields":{ + "id":{ + "typeName":"int", + "type":"int", + "typeInstance":"id", + "nullable":false, + "optional":false + }, + "firstName":{ + "typeName":"string", + "type":"string", + "typeInstance":"firstName", + "nullable":false, + "optional":false + }, + "lastName":{ + "typeName":"string", + "type":"string", + "typeInstance":"lastName", + "nullable":false, + "optional":false + }, + "age":{ + "typeName":"int", + "type":"int", + "typeInstance":"age", + "nullable":false, + "optional":false + }, + "country":{ + "typeName":"string", + "type":"string", + "typeInstance":"country", + "nullable":false, + "optional":false + }, + "college":{ + "nullable":false, + "optional":false, + "type":"record", + "typeInstance":"college", + "typeName":"record", + "fields":{ + "courses":{ + "optional":false, + "typeName":"record[]", + "type":"record[]", + "typeInstance":"courses", + "fields":{ + "id":{ + "typeName":"string", + "type":"string", + "typeInstance":"id", + "nullable":false, + "optional":false + }, + "name":{ + "typeName":"string", + "type":"string", + "typeInstance":"name", + "nullable":false, + "optional":false + }, + "credits":{ + "typeName":"decimal", + "type":"decimal", + "typeInstance":"credits", + "nullable":false, + "optional":false + } + }, + "nullableArray":false, + "nullable":false + } + } + } + }, + "nullableArray":false, + "nullable":false + } + } + } + }, + "outputMetadata":{ + "student":{ + "optional":false, + "typeName":"record[]", + "type":"record[]", + "typeInstance":"student", + "fields":{ + "id":{ + "typeName":"int", + "type":"int", + "typeInstance":"id", + "nullable":false, + "optional":false + }, + "firstName":{ + "typeName":"string", + "type":"string", + "typeInstance":"firstName", + "nullable":false, + "optional":false + }, + "lastName":{ + "typeName":"string", + "type":"string", + "typeInstance":"lastName", + "nullable":false, + "optional":false + }, + "age":{ + "typeName":"string", + "type":"string", + "typeInstance":"age", + "nullable":false, + "optional":false + }, + "courses":{ + "optional":false, + "typeName":"record[]", + "type":"record[]", + "typeInstance":"courses", + "fields":{ + "id":{ + "typeName":"int", + "type":"int", + "typeInstance":"id", + "nullable":false, + "optional":false + }, + "credits":{ + "typeName":"float", + "type":"float", + "typeInstance":"credits", + "nullable":false, + "optional":false + } + }, + "nullableArray":false, + "nullable":false + } + }, + "nullableArray":false, + "nullable":false + } + } +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_21/expected.json b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_21/expected.json new file mode 100644 index 00000000000..5557adb1794 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_21/expected.json @@ -0,0 +1 @@ +{"student": "from var personItem in AItem.person\n select {\n id: personItem.id,\nfirstName: personItem.firstName,\nlastName: personItem.lastName,\nage: (personItem.age).toString(),\ncourses: from var coursesItem in personItem.college.courses\n select {\n id: check int:fromString(coursesItem.id),\ncredits: check (coursesItem.credits).ensureType(),\nprofessor: from var professorItem in coursesItem.professor\n select {\n id: professorItem.id,\nfirstName: professorItem.firstName,\ndepartment: from var departmentItem in professorItem.department\n select {\n departmentName: departmentItem.departmentName\n}\n}\n}\n}"} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_21/mapping.json b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_21/mapping.json new file mode 100644 index 00000000000..1da398e6658 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_21/mapping.json @@ -0,0 +1,73 @@ +{ + "student":{ + "id":{ + "operation":"DIRECT", + "targetType":"int", + "parameters":[ + "AItem.person.id" + ] + }, + "firstName":{ + "operation":"DIRECT", + "targetType":"string", + "parameters":[ + "AItem.person.firstName" + ] + }, + "lastName":{ + "operation":"DIRECT", + "targetType":"string", + "parameters":[ + "AItem.person.lastName" + ] + }, + "age":{ + "operation":"DIRECT", + "targetType":"string", + "parameters":[ + "AItem.person.age" + ] + }, + "courses":{ + "id":{ + "operation":"DIRECT", + "targetType":"int", + "parameters":[ + "AItem.person.college.courses.id" + ] + }, + "credits":{ + "operation":"DIRECT", + "targetType":"float", + "parameters":[ + "AItem.person.college.courses.credits" + ] + }, + "professor":{ + "id":{ + "operation":"DIRECT", + "targetType":"int", + "parameters":[ + "AItem.person.college.courses.professor.id" + ] + }, + "firstName":{ + "operation":"DIRECT", + "targetType":"string", + "parameters":[ + "AItem.person.college.courses.professor.firstName" + ] + }, + "department":{ + "departmentName":{ + "operation":"DIRECT", + "targetType":"string", + "parameters":[ + "AItem.person.college.courses.professor.department.departmentName" + ] + } + } + } + } + } +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_21/param_def.json b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_21/param_def.json new file mode 100644 index 00000000000..9aab4a6b833 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_21/param_def.json @@ -0,0 +1,347 @@ +{ + "inputs":{ + "AItem":{ + "person":{ + "id":{ + "type":"int", + "comment":"" + }, + "firstName":{ + "type":"string", + "comment":"" + }, + "lastName":{ + "type":"string", + "comment":"" + }, + "age":{ + "type":"int", + "comment":"" + }, + "country":{ + "type":"string", + "comment":"" + }, + "college":{ + "courses":{ + "id":{ + "type":"string", + "comment":"" + }, + "name":{ + "type":"string", + "comment":"" + }, + "credits":{ + "type":"decimal", + "comment":"" + }, + "professor":{ + "id":{ + "type":"int", + "comment":"" + }, + "firstName":{ + "type":"string", + "comment":"" + }, + "department":{ + "departmentName":{ + "type":"string", + "comment":"" + } + } + } + } + } + } + } + }, + "output":{ + "student":{ + "id":{ + "type":"int", + "comment":"" + }, + "firstName":{ + "type":"string", + "comment":"" + }, + "lastName":{ + "type":"string", + "comment":"" + }, + "age":{ + "type":"string", + "comment":"" + }, + "courses":{ + "id":{ + "type":"int", + "comment":"" + }, + "credits":{ + "type":"float", + "comment":"" + }, + "professor":{ + "id":{ + "type":"int", + "comment":"" + }, + "firstName":{ + "type":"string", + "comment":"" + }, + "department":{ + "departmentName":{ + "type":"string", + "comment":"" + } + } + } + } + } + }, + "inputMetadata":{ + "AItem":{ + "isArrayType":true, + "parameterName":"AItem", + "parameterType":"A[] ", + "type":"record[]", + "fields":{ + "person":{ + "optional":false, + "typeName":"record[]", + "type":"record[]", + "typeInstance":"person", + "fields":{ + "id":{ + "typeName":"int", + "type":"int", + "typeInstance":"id", + "nullable":false, + "optional":false + }, + "firstName":{ + "typeName":"string", + "type":"string", + "typeInstance":"firstName", + "nullable":false, + "optional":false + }, + "lastName":{ + "typeName":"string", + "type":"string", + "typeInstance":"lastName", + "nullable":false, + "optional":false + }, + "age":{ + "typeName":"int", + "type":"int", + "typeInstance":"age", + "nullable":false, + "optional":false + }, + "country":{ + "typeName":"string", + "type":"string", + "typeInstance":"country", + "nullable":false, + "optional":false + }, + "college":{ + "nullable":false, + "optional":false, + "type":"record", + "typeInstance":"college", + "typeName":"record", + "fields":{ + "courses":{ + "optional":false, + "typeName":"record[]", + "type":"record[]", + "typeInstance":"courses", + "fields":{ + "id":{ + "typeName":"string", + "type":"string", + "typeInstance":"id", + "nullable":false, + "optional":false + }, + "name":{ + "typeName":"string", + "type":"string", + "typeInstance":"name", + "nullable":false, + "optional":false + }, + "credits":{ + "typeName":"decimal", + "type":"decimal", + "typeInstance":"credits", + "nullable":false, + "optional":false + }, + "professor":{ + "optional":false, + "typeName":"record[]", + "type":"record[]", + "typeInstance":"professor", + "fields":{ + "id":{ + "typeName":"int", + "type":"int", + "typeInstance":"id", + "nullable":false, + "optional":false + }, + "firstName":{ + "typeName":"string", + "type":"string", + "typeInstance":"firstName", + "nullable":false, + "optional":false + }, + "department":{ + "optional":false, + "typeName":"record[]", + "type":"record[]", + "typeInstance":"department", + "fields":{ + "departmentName":{ + "typeName":"string", + "type":"string", + "typeInstance":"departmentName", + "nullable":false, + "optional":false + } + }, + "nullableArray":false, + "nullable":false + } + }, + "nullableArray":false, + "nullable":false + } + }, + "nullableArray":false, + "nullable":false + } + } + } + }, + "nullableArray":false, + "nullable":false + } + } + } + }, + "outputMetadata":{ + "student":{ + "optional":false, + "typeName":"record[]", + "type":"record[]", + "typeInstance":"student", + "fields":{ + "id":{ + "typeName":"int", + "type":"int", + "typeInstance":"id", + "nullable":false, + "optional":false + }, + "firstName":{ + "typeName":"string", + "type":"string", + "typeInstance":"firstName", + "nullable":false, + "optional":false + }, + "lastName":{ + "typeName":"string", + "type":"string", + "typeInstance":"lastName", + "nullable":false, + "optional":false + }, + "age":{ + "typeName":"string", + "type":"string", + "typeInstance":"age", + "nullable":false, + "optional":false + }, + "courses":{ + "optional":false, + "typeName":"record[]", + "type":"record[]", + "typeInstance":"courses", + "fields":{ + "id":{ + "typeName":"int", + "type":"int", + "typeInstance":"id", + "nullable":false, + "optional":false + }, + "credits":{ + "typeName":"float", + "type":"float", + "typeInstance":"credits", + "nullable":false, + "optional":false + }, + "professor":{ + "optional":false, + "typeName":"record[]", + "type":"record[]", + "typeInstance":"professor", + "fields":{ + "id":{ + "typeName":"int", + "type":"int", + "typeInstance":"id", + "nullable":false, + "optional":false + }, + "firstName":{ + "typeName":"string", + "type":"string", + "typeInstance":"firstName", + "nullable":false, + "optional":false + }, + "department":{ + "optional":false, + "typeName":"record[]", + "type":"record[]", + "typeInstance":"department", + "fields":{ + "departmentName":{ + "typeName":"string", + "type":"string", + "typeInstance":"departmentName", + "nullable":false, + "optional":false + } + }, + "nullableArray":false, + "nullable":false + } + }, + "nullableArray":false, + "nullable":false + } + }, + "nullableArray":false, + "nullable":false + } + }, + "nullableArray":false, + "nullable":false + } + } +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_22/expected.json b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_22/expected.json new file mode 100644 index 00000000000..4128541717b --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_22/expected.json @@ -0,0 +1 @@ +{"id":"post.id","description":"post.description","author":"author","meta":"{\n tags: re `,`.split(post.tags),\ncategory: post.category,\ncreatedTimeStamp: {\n utcOffset: {\n hours: post.createdTimeStamp.utcOffset?.hours?:0,\nminutes: post.createdTimeStamp.utcOffset?.minutes?:0,\nseconds: post.createdTimeStamp.utcOffset?.seconds \n},\ntimeAbbrev: post.createdTimeStamp.timeAbbrev,\nwhich: post.createdTimeStamp.which,\ndayOfWeek: post.createdTimeStamp.dayOfWeek,\nyear: post.createdTimeStamp.year,\nmonth: post.createdTimeStamp.month,\nday: post.createdTimeStamp.day,\nhour: post.createdTimeStamp.hour,\nminute: post.createdTimeStamp.minute,\nsecond: post.createdTimeStamp.second \n} \n}"} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_22/mapping.json b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_22/mapping.json new file mode 100644 index 00000000000..0665f359856 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_22/mapping.json @@ -0,0 +1,128 @@ +{ + "id":{ + "operation":"DIRECT", + "targetType":"int", + "parameters":[ + "post.id" + ] + }, + "description":{ + "operation":"DIRECT", + "targetType":"string", + "parameters":[ + "post.description" + ] + }, + "author":{ + "operation":"DIRECT", + "targetType":"string", + "parameters":[ + "author.author" + ] + }, + "meta":{ + "tags":{ + "operation":"SPLIT", + "targetType":"string[]", + "parameters":[ + "post.tags", + "," + ] + }, + "category":{ + "operation":"DIRECT", + "targetType":"string", + "parameters":[ + "post.category" + ] + }, + "createdTimeStamp":{ + "utcOffset":{ + "hours":{ + "operation":"DIRECT", + "targetType":"int", + "parameters":[ + "post.createdTimeStamp.utcOffset.hours" + ] + }, + "minutes":{ + "operation":"DIRECT", + "targetType":"int", + "parameters":[ + "post.createdTimeStamp.utcOffset.minutes" + ] + }, + "seconds":{ + "operation":"DIRECT", + "targetType":"decimal", + "parameters":[ + "post.createdTimeStamp.utcOffset.seconds" + ] + } + }, + "timeAbbrev":{ + "operation":"DIRECT", + "targetType":"string", + "parameters":[ + "post.createdTimeStamp.timeAbbrev" + ] + }, + "which":{ + "operation":"DIRECT", + "targetType":"0|1", + "parameters":[ + "post.createdTimeStamp.which" + ] + }, + "dayOfWeek":{ + "operation":"DIRECT", + "targetType":"0|1|2|3|4|5|6", + "parameters":[ + "post.createdTimeStamp.dayOfWeek" + ] + }, + "year":{ + "operation":"DIRECT", + "targetType":"int", + "parameters":[ + "post.createdTimeStamp.year" + ] + }, + "month":{ + "operation":"DIRECT", + "targetType":"int", + "parameters":[ + "post.createdTimeStamp.month" + ] + }, + "day":{ + "operation":"DIRECT", + "targetType":"int", + "parameters":[ + "post.createdTimeStamp.day" + ] + }, + "hour":{ + "operation":"DIRECT", + "targetType":"int", + "parameters":[ + "post.createdTimeStamp.hour" + ] + }, + "minute":{ + "operation":"DIRECT", + "targetType":"int", + "parameters":[ + "post.createdTimeStamp.minute" + ] + }, + "second":{ + "operation":"DIRECT", + "targetType":"decimal", + "parameters":[ + "post.createdTimeStamp.second" + ] + } + } + } +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_22/param_def.json b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_22/param_def.json new file mode 100644 index 00000000000..829d6f37393 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/datamapper/resources/Complex/case_22/param_def.json @@ -0,0 +1,593 @@ +{ + "inputs":{ + "post":{ + "id":{ + "type":"int", + "comment":"" + }, + "description":{ + "type":"string", + "comment":"" + }, + "tags":{ + "type":"string", + "comment":"" + }, + "category":{ + "type":"string", + "comment":"" + }, + "createdTimeStamp":{ + "utcOffset":{ + "hours":{ + "type":"int", + "comment":"" + }, + "minutes":{ + "type":"int", + "comment":"" + }, + "seconds":{ + "type":"decimal", + "comment":"" + } + }, + "timeAbbrev":{ + "type":"string", + "comment":"" + }, + "which":{ + "type":"0|1", + "comment":"" + }, + "dayOfWeek":{ + "type":"0|1|2|3|4|5|6", + "comment":"" + }, + "year":{ + "type":"int", + "comment":"" + }, + "month":{ + "type":"int", + "comment":"" + }, + "day":{ + "type":"int", + "comment":"" + }, + "hour":{ + "type":"int", + "comment":"" + }, + "minute":{ + "type":"int", + "comment":"" + }, + "second":{ + "type":"decimal", + "comment":"" + } + } + }, + "author":{ + "author":{ + "type":"string", + "comment":"" + } + } + }, + "output":{ + "id":{ + "type":"int", + "comment":"" + }, + "description":{ + "type":"string", + "comment":"" + }, + "author":{ + "type":"string", + "comment":"" + }, + "meta":{ + "tags":{ + "type":"string[]", + "comment":"" + }, + "category":{ + "type":"string", + "comment":"" + }, + "createdTimeStamp":{ + "utcOffset":{ + "hours":{ + "type":"int", + "comment":"" + }, + "minutes":{ + "type":"int", + "comment":"" + }, + "seconds":{ + "type":"decimal", + "comment":"" + } + }, + "timeAbbrev":{ + "type":"string", + "comment":"" + }, + "which":{ + "type":"0|1", + "comment":"" + }, + "dayOfWeek":{ + "type":"0|1|2|3|4|5|6", + "comment":"" + }, + "year":{ + "type":"int", + "comment":"" + }, + "month":{ + "type":"int", + "comment":"" + }, + "day":{ + "type":"int", + "comment":"" + }, + "hour":{ + "type":"int", + "comment":"" + }, + "minute":{ + "type":"int", + "comment":"" + }, + "second":{ + "type":"decimal", + "comment":"" + } + } + } + }, + "inputMetadata":{ + "post":{ + "isArrayType":false, + "parameterName":"post", + "parameterType":"Post", + "type":"record", + "fields":{ + "id":{ + "typeName":"int", + "type":"int", + "typeInstance":"id", + "nullable":false, + "optional":false + }, + "description":{ + "typeName":"string", + "type":"string", + "typeInstance":"description", + "nullable":false, + "optional":false + }, + "tags":{ + "typeName":"string", + "type":"string", + "typeInstance":"tags", + "nullable":false, + "optional":false + }, + "category":{ + "typeName":"string", + "type":"string", + "typeInstance":"category", + "nullable":false, + "optional":false + }, + "createdTimeStamp":{ + "nullable":false, + "optional":false, + "type":"record", + "typeInstance":"createdTimeStamp", + "typeName":"record", + "fields":{ + "utcOffset":{ + "optional":true, + "typeName":"readonly&record", + "type":"intersection", + "typeInstance":"utcOffset", + "members":{ + "hours":{ + "typeName":"int", + "type":"int", + "typeInstance":"hours", + "nullable":false, + "optional":false + }, + "minutes":{ + "typeName":"int", + "type":"int", + "typeInstance":"minutes", + "nullable":false, + "optional":false + }, + "seconds":{ + "typeName":"decimal", + "type":"decimal", + "typeInstance":"seconds", + "nullable":false, + "optional":true + } + }, + "nullable":false + }, + "timeAbbrev":{ + "typeName":"string", + "type":"string", + "typeInstance":"timeAbbrev", + "nullable":false, + "optional":true + }, + "which":{ + "optional":true, + "typeName":"0|1", + "type":"union", + "typeInstance":"which", + "members":{ + "0":{ + "typeName":"0", + "type":"0", + "typeInstance":"0", + "nullable":false, + "optional":false + }, + "1":{ + "typeName":"1", + "type":"1", + "typeInstance":"1", + "nullable":false, + "optional":false + } + }, + "nullable":false + }, + "dayOfWeek":{ + "optional":true, + "typeName":"0|1|2|3|4|5|6", + "type":"union", + "typeInstance":"dayOfWeek", + "members":{ + "0":{ + "typeName":"0", + "type":"0", + "typeInstance":"0", + "nullable":false, + "optional":false + }, + "1":{ + "typeName":"1", + "type":"1", + "typeInstance":"1", + "nullable":false, + "optional":false + }, + "2":{ + "typeName":"2", + "type":"2", + "typeInstance":"2", + "nullable":false, + "optional":false + }, + "3":{ + "typeName":"3", + "type":"3", + "typeInstance":"3", + "nullable":false, + "optional":false + }, + "4":{ + "typeName":"4", + "type":"4", + "typeInstance":"4", + "nullable":false, + "optional":false + }, + "5":{ + "typeName":"5", + "type":"5", + "typeInstance":"5", + "nullable":false, + "optional":false + }, + "6":{ + "typeName":"6", + "type":"6", + "typeInstance":"6", + "nullable":false, + "optional":false + } + }, + "nullable":false + }, + "year":{ + "typeName":"int", + "type":"int", + "typeInstance":"year", + "nullable":false, + "optional":false + }, + "month":{ + "typeName":"int", + "type":"int", + "typeInstance":"month", + "nullable":false, + "optional":false + }, + "day":{ + "typeName":"int", + "type":"int", + "typeInstance":"day", + "nullable":false, + "optional":false + }, + "hour":{ + "typeName":"int", + "type":"int", + "typeInstance":"hour", + "nullable":false, + "optional":false + }, + "minute":{ + "typeName":"int", + "type":"int", + "typeInstance":"minute", + "nullable":false, + "optional":false + }, + "second":{ + "typeName":"decimal", + "type":"decimal", + "typeInstance":"second", + "nullable":false, + "optional":true + } + } + } + } + }, + "author":{ + "isArrayType":false, + "parameterName":"author", + "parameterType":"string ", + "type":"record", + "fields":{ + "author":{ + "typeName":"string", + "type":"string", + "typeInstance":"author", + "nullable":false, + "optional":false + } + } + } + }, + "outputMetadata":{ + "id":{ + "typeName":"int", + "type":"int", + "typeInstance":"id", + "nullable":false, + "optional":false + }, + "description":{ + "typeName":"string", + "type":"string", + "typeInstance":"description", + "nullable":false, + "optional":false + }, + "author":{ + "typeName":"string", + "type":"string", + "typeInstance":"author", + "nullable":false, + "optional":false + }, + "meta":{ + "nullable":false, + "optional":false, + "type":"record", + "typeInstance":"meta", + "typeName":"record", + "fields":{ + "tags":{ + "typeName":"string[]", + "type":"string[]", + "typeInstance":"tags", + "nullable":false, + "optional":false + }, + "category":{ + "typeName":"string", + "type":"string", + "typeInstance":"category", + "nullable":false, + "optional":false + }, + "createdTimeStamp":{ + "nullable":false, + "optional":false, + "type":"record", + "typeInstance":"createdTimeStamp", + "typeName":"record", + "fields":{ + "utcOffset":{ + "optional":true, + "typeName":"readonly&record", + "type":"intersection", + "typeInstance":"utcOffset", + "members":{ + "hours":{ + "typeName":"int", + "type":"int", + "typeInstance":"hours", + "nullable":false, + "optional":false + }, + "minutes":{ + "typeName":"int", + "type":"int", + "typeInstance":"minutes", + "nullable":false, + "optional":false + }, + "seconds":{ + "typeName":"decimal", + "type":"decimal", + "typeInstance":"seconds", + "nullable":false, + "optional":true + } + }, + "nullable":false + }, + "timeAbbrev":{ + "typeName":"string", + "type":"string", + "typeInstance":"timeAbbrev", + "nullable":false, + "optional":true + }, + "which":{ + "optional":true, + "typeName":"0|1", + "type":"union", + "typeInstance":"which", + "members":{ + "0":{ + "typeName":"0", + "type":"0", + "typeInstance":"0", + "nullable":false, + "optional":false + }, + "1":{ + "typeName":"1", + "type":"1", + "typeInstance":"1", + "nullable":false, + "optional":false + } + }, + "nullable":false + }, + "dayOfWeek":{ + "optional":true, + "typeName":"0|1|2|3|4|5|6", + "type":"union", + "typeInstance":"dayOfWeek", + "members":{ + "0":{ + "typeName":"0", + "type":"0", + "typeInstance":"0", + "nullable":false, + "optional":false + }, + "1":{ + "typeName":"1", + "type":"1", + "typeInstance":"1", + "nullable":false, + "optional":false + }, + "2":{ + "typeName":"2", + "type":"2", + "typeInstance":"2", + "nullable":false, + "optional":false + }, + "3":{ + "typeName":"3", + "type":"3", + "typeInstance":"3", + "nullable":false, + "optional":false + }, + "4":{ + "typeName":"4", + "type":"4", + "typeInstance":"4", + "nullable":false, + "optional":false + }, + "5":{ + "typeName":"5", + "type":"5", + "typeInstance":"5", + "nullable":false, + "optional":false + }, + "6":{ + "typeName":"6", + "type":"6", + "typeInstance":"6", + "nullable":false, + "optional":false + } + }, + "nullable":false + }, + "year":{ + "typeName":"int", + "type":"int", + "typeInstance":"year", + "nullable":false, + "optional":false + }, + "month":{ + "typeName":"int", + "type":"int", + "typeInstance":"month", + "nullable":false, + "optional":false + }, + "day":{ + "typeName":"int", + "type":"int", + "typeInstance":"day", + "nullable":false, + "optional":false + }, + "hour":{ + "typeName":"int", + "type":"int", + "typeInstance":"hour", + "nullable":false, + "optional":false + }, + "minute":{ + "typeName":"int", + "type":"int", + "typeInstance":"minute", + "nullable":false, + "optional":false + }, + "second":{ + "typeName":"decimal", + "type":"decimal", + "typeInstance":"second", + "nullable":false, + "optional":true + } + } + } + } + } + } +} 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 348318da965..f8c54a3dcf1 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 @@ -104,7 +104,7 @@ function createTestEventHandler(): { handler: CopilotEventHandler; getResult: () return { handler, getResult }; } -suite.only("AI Code Generator Tests Suite", () => { +suite.skip("AI Code Generator Tests Suite", () => { // Close all the open workspace folders before running the test suiteSetup(async function () { From b48fe5b60ec3944abda5ce9d50c9c65d338a5264 Mon Sep 17 00:00:00 2001 From: Kanushka Gayan Date: Wed, 13 Aug 2025 11:09:45 +0530 Subject: [PATCH 349/349] Update extension patch versions --- workspaces/ballerina/ballerina-extension/package.json | 2 +- workspaces/bi/bi-extension/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 00edb5b611b..81ffc3eb098 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.3.0", + "version": "5.3.1", "publisher": "wso2", "icon": "resources/images/ballerina.png", "homepage": "https://wso2.com/ballerina/vscode/docs", diff --git a/workspaces/bi/bi-extension/package.json b/workspaces/bi/bi-extension/package.json index 2bc7c6a6888..097604bf7ab 100644 --- a/workspaces/bi/bi-extension/package.json +++ b/workspaces/bi/bi-extension/package.json @@ -2,7 +2,7 @@ "name": "ballerina-integrator", "displayName": "WSO2 Integrator: BI", "description": "An extension which gives a development environment for designing, developing, debugging, and testing integration solutions.", - "version": "1.2.0", + "version": "1.2.1", "publisher": "wso2", "icon": "resources/images/wso2-ballerina-integrator-logo.png", "repository": {